Amazon CloudWatch 事件
用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

使用 IAM 策略条件实现精细访问控制

当您授予权限时,可使用访问策略语言来指定规定策略何时生效的条件。在策略语句中,您可以选择性指定控制策略生效时间的条件。每个条件都包含一个或多个键值对。条件键不区分大小写。例如,您可能希望策略仅在特定日期后应用。

如果您指定了多个条件或在单一条件中指定了多个密钥,则将使用逻辑 AND 操作对其进行评估。如果您在单一条件中指定了一个具有多个值的密钥,则将使用逻辑 OR 操作对其进行评估。必须匹配所有条件才能授予权限。

在指定条件时,您也可使用占位符。有关更多信息,请参阅 IAM 用户指南 中的策略变量。有关使用访问策略语言来指定条件的更多信息,请参阅 IAM 用户指南 中的条件

默认情况下,IAM 用户和角色无法访问您的账户中的事件。要使用事件,用户必须获得 PutRule API 操作的授权。如果您允许 IAM 用户或角色对其策略执行 events:PutRule 操作,则他们将能够创建匹配特定事件的规则。您必须向规则添加目标,否则,没有目标的规则除了在匹配传入事件时发布 CloudWatch 指标之外,不会执行任何操作。您的 IAM 用户或角色必须拥有 events:PutTargets 操作的权限。

可通过以下方式来限制对事件的访问:将授权的范围限定为事件的特定源和类型 (使用 events:sourceevents:detail-type 条件键)。可以在 IAM 用户或角色的策略语句中提供条件,允许其创建仅匹配一组特定的源和详细类型的规则。有关所有条件键值及其适用的 CloudWatch Events 操作和资源的列表,请参阅 使用 IAM 策略条件实现精细访问控制

同样,通过在策略语句中设置条件,您可以决定您账户中的哪些特定资源可由 IAM 用户或角色添加到规则中 (使用 events:TargetArn 条件键)。例如,如果您在账户中打开 CloudTrail 并且您有 CloudTrail 流,则您的账户中的用户也可通过 CloudWatch Events 使用 CloudTrail 事件。如果您希望用户使用 CloudWatch Events 并访问除 CloudTrail 事件之外的所有其他事件,则可添加有关 PutRule API 操作的拒绝语句以及一个条件,使该用户或角色创建的任何规则都无法匹配 CloudTrail 事件类型。

对于 CloudTrail 事件,可限制对原始 API 调用源自的特定委托人的访问 (使用 events:detail.userIdentity.principalId 条件键)。例如,您可以允许用户查看所有 CloudTrail 事件,但您的账户中用于审计或取证的某个特定 IAM 角色创建的事件除外。

条件键 键值对 评估类型

events:source

"events:source":"source "

其中,source 为事件的 source 字段的文字字符串,例如“aws.ec2”和“aws.s3”。

Source,Null

events:detail-type

"events:detail-type":"detail-type "

其中,detail-type 为事件的 detail-type 字段的文字字符串,例如“AWS API Call via &CT;”和“EC2 Instance State-change Notification”。

Detail Type,Null

events: detail.userIdentity.principalId

"events: detail.userIdentity.principalId":"principal-id"

其中,principal-id 为事件的 detail.userIdentity.principalId 字段的文字字符串,而 detail-type 为“AWS API Call via CloudTrail”,例如 "AROAIDPPEZS35WEXAMPLE:AssumedRoleSessionName.".

Principal Id,Null

events:TargetArn

"events:TargetArn":"target-arn "

其中,target-arn 为可放入规则的目标的 ARN,例如 "arn:aws:lambda:*:*:function:*"

ARN,Null

有关适用于 CloudWatch Events 的策略语句示例,请参阅 管理您的 CloudWatch Events 资源的访问权限概述

示例 1:限制对特定源的访问

以下示例策略可附加到 IAM 用户。策略 A 允许所有事件的 PutRule API 操作,而策略 B 仅在要创建的规则的事件模式与 Amazon EC2 事件匹配时允许 PutRule 操作。

策略 A:允许所有事件

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleForAllEvents", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*" } ] }

策略 B:仅允许 Amazon EC2 中的事件

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleForAllEC2Events", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*", "Condition": { "StringEquals": { "events:source": "aws.ec2" } } } ] }

EventPattern 是 PutRule 的必需参数。因此,如果具有策略 B 的用户使用类似于下面的事件模式调用 PutRule

Copy
{ "source": [ "aws.ec2" ] }

将创建规则,因为策略允许此特定源,即“aws.ec2”。不过,如果具有策略 B 的用户使用类似于下面的事件模式调用 PutRule

Copy
{ "source": [ "aws.s3" ] }

规则创建操作将被拒绝,因为策略不允许此特定源,即“aws.s3”。实质上,仅允许具有策略 B 的用户创建与源自 Amazon EC2 的事件匹配的规则,因此他们只能访问 Amazon EC2 中的事件。

有关策略 A 和策略 B 的比较,请参见下表:

事件模式 策略 A 允许的 策略 B 允许的
Copy
{ "source": [ "aws.ec2" ] }

Copy
{ "source": [ "aws.ec2", "aws.s3" ] }

否 (不允许源 aws.s3)

Copy
{ "source": [ "aws.ec2" ], "detail-type": [ "EC2 Instance State-change Notification" ] }

Copy
{ "detail-type": [ "EC2 Instance State-change Notification" ] }

否 (必须指定源)

示例 2:定义可在事件模式中单独使用的多个源

以下策略允许来自 Amazon EC2 或 CloudWatch Events 的事件。换言之,它允许 IAM 用户或角色创建一个规则,其中将 EventPattern 中的源指定为“aws.ec2”或“aws.ecs”。不定义源会导致“deny”。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleIfSourceIsEC2OrECS", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*", "Condition": { "StringEquals": { "events:source": [ "aws.ec2", "aws.ecs" ] } } } ] }

有关此策略将允许或拒绝的事件模式的示例,请参见下表:

事件模式 策略允许的
Copy
{ "source": [ "aws.ec2" ] }

Copy
{ "source": [ "aws.ecs" ] }

Copy
{ "source": [ "aws.s3" ] }

Copy
{ "source": [ "aws.ec2", "aws.ecs" ] }

Copy
{ "detail-type": [ "AWS API Call via CloudTrail" ] }

示例 3:定义可在事件模式中使用的 Source 和 DetailType

以下策略仅允许来自 aws.ec2 源且 DetailType 等于 EC2 instance state change notification 的事件。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleIfSourceIsEC2AndDetailTypeIsInstanceStateChangeNotification", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*", "Condition": { "StringEquals": { "events:source": "aws.ec2", "events:detail-type": "EC2 Instance State-change Notification" } } } ] }

有关此策略将允许或拒绝的事件模式的示例,请参见下表:

事件模式 策略允许的
Copy
{ "source": [ "aws.ec2" ] }

Copy
{ "source": [ "aws.ecs" ] }

Copy
{ "source": [ "aws.ec2" ], "detail-type": [ "EC2 Instance State-change Notification" ] }

Copy
{ "source": [ "aws.ec2" ], "detail-type": [ "EC2 Instance Health Failed" ] }

Copy
{ "detail-type": [ "EC2 Instance State-change Notification" ] }

示例 4:确保在事件模式中定义源

以下策略允许创建包含必须具有 source 字段的 EventPatterns 的规则。换而言之,IAM 用户或角色不能创建包含不提供特定源的 EventPattern 的规则。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleIfSourceIsSpecified", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*", "Condition": { "Null": { "events:source": "false" } } } ] }

有关此策略将允许或拒绝的事件模式的示例,请参见下表:

事件模式 策略允许的
Copy
{ "source": [ "aws.ec2" ], "detail-type": [ "EC2 Instance State-change Notification" ] }

Copy
{ "source": [ "aws.ecs", "aws.ec2" ] }

Copy
{ "detail-type": [ "EC2 Instance State-change Notification" ] }

示例 5:在包含多个源的事件模式中定义允许的源的列表

以下策略允许创建包含可具有多个源的 EventPatterns 的规则。事件模式中列出的每个源必须是条件中提供的列表的成员。在使用 ForAllValues 条件时,请确保定义条件列表中的至少一个项。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleIfSourceIsSpecifiedAndIsEitherS3OrEC2OrBoth", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "events:source": [ "aws.ec2", "aws.s3" ] }, "Null": { "events:source": "false" } } } ] }

有关此策略将允许或拒绝的事件模式的示例,请参见下表:

事件模式 策略允许的
Copy
{ "source": [ "aws.ec2" ] }

Copy
{ "source": [ "aws.ec2", "aws.s3" ] }

Copy
{ "source": [ "aws.ec2", "aws.autoscaling" ] }

Copy
{ "detail-type": [ "EC2 Instance State-change Notification" ] }

示例 6:确保使用来自特定 PrincipalId 的 API 调用的 AWS CloudTrail 事件

所有 AWS CloudTrail 事件的 detail.userIdentity.principalId 路径中都具有执行 API 调用的用户的 ID (PrincipalId)。借助 events:detail.userIdentity.principalId 条件键,您可以仅允许 IAM 用户或角色访问来自特定账户的 CloudTrail 事件。

Copy
"Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleOnlyForCloudTrailEventsWhereUserIsASpecificIAMUser", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*", "Condition": { "StringEquals": { "events:detail-type": [ "AWS API Call via CloudTrail" ], "events:detail.userIdentity.principalId": [ "AIDAJ45Q7YFFAREXAMPLE" ] } } } ] }

有关此策略将允许或拒绝的事件模式的示例,请参见下表:

事件模式 策略允许的
Copy
{ "detail-type": [ "AWS API Call via CloudTrail" ] }

Copy
{ "detail-type": [ "AWS API Call via CloudTrail" ], "detail.userIdentity.principalId": [ "AIDAJ45Q7YFFAREXAMPLE" ] }

Copy
{ "detail-type": [ "AWS API Call via CloudTrail" ], "detail.userIdentity.principalId": [ "AROAIDPPEZS35WEXAMPLE:AssumedRoleSessionName" ] }

示例 7:限制对目标的访问

如果 IAM 用户或角色具有 events:PutTargets 权限,他们就可以在相同账户下将任何目标添加到他们有权访问的规则。例如,以下策略仅限将目标添加到特定规则 (账户 123456789012 下的 MyRule)。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutTargetsOnASpecificRule", "Effect": "Allow", "Action": "events:PutTargets", "Resource": "arn:aws:events:us-east-1:123456789012:rule/MyRule" } ] }

为了限制可以添加到规则的目标,请使用 events:TargetArn 条件密钥。例如,您可以限制仅将目标添加到 Lambda 函数,如以下示例中所示。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutTargetsOnASpecificRuleAndOnlyLambdaFunctions", "Effect": "Allow", "Action": "events:PutTargets", "Resource": "arn:aws:events:us-east-1:123456789012:rule/MyRule", "Condition": { "ArnLike": { "events:TargetArn": "arn:aws:lambda:*:*:function:*" } } } ] }