使用 IAM 策略条件进行精细访问控制 - Amazon EventBridge
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 IAM 策略条件进行精细访问控制

要授予权限,可在策略语句中使用 IAM 策略语言指定条件,规定策略何时生效。例如,您可以指定仅在特定日期后应用的策略。

策略中的条件由键值对组成。条件键不区分大小写。

如果您指定了多个条件,或在单一条件中指定了多个键,必须满足所有条件或键,EventBridge 才会授予权限。如果您在单一条件中指定了具有多个值的键,只要满足其中一个值 EventBridge 就会授予权限。

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

默认情况下,IAM 用户和角色无法访问您账户中的事件。要访问事件,用户必须获得 PutRule API 操作的授权。如果授权 IAM 用户或角色执行 events:PutRule 操作,他们可以创建匹配特定事件的规则。但是,要使该规则发挥作用,用户还必须拥有 events:PutTargets 操作的权限,因为如果您希望规则的作用不仅仅是发布 CloudWatch 指标,还必须向规则中添加目标

可以在 IAM 用户或角色的策略语句中提供条件,允许该用户或角色创建仅匹配一组特定源和事件类型的规则。要对特定源和事件类型授予访问权限,请使用 events:sourceevents:detail-type 条件键。

同样,您可以在 IAM 用户或角色的策略语句中提供条件,允许该用户或角色创建规则,仅匹配您账户中的特定资源。要对特定资源授予访问权限,请使用 events:TargetArn 条件键。

以下示例是一个策略,允许用户使用对 PutRule API 操作的拒绝声明,访问除 EventBridge 中的 Amazon EC2 事件之外的所有事件。

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

EventBridge 条件键

下表显示了可以在 EventBridge 的策略中使用的条件键和键值对。

条件键 键值对 评估类型

aws:SourceAccount

aws:SourceArn 指定的规则所在的账户。

Account Id、Null

aws:SourceArn

发送事件的规则的 ARN。

ARN,Null

events:creatorAccount

"events:creatorAccount":"creatorAccount"

对于 creatorAccount,请使用创建规则的账户的账户 ID。使用此条件授权 API 调用来自特定账户的规则。

creatorAccount、Null

events:detail-type

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

其中,detail-type 为事件的 detail-type 字段的文字字符串,例如 "Amazon API Call via CloudTrail""EC2 Instance State-change Notification"

Detail Type,Null

events: detail.eventTypeCode

"events:detail.eventTypeCode":"eventTypeCode"

对于 eventTypeCode,针对事件的 detail.eventTypeCode 字段使用文字字符串,例如 "AWS_ABUSE_DOS_REPORT"

eventTypeCode,Null

events: detail.service

"events:detail.service":"service"

对于 service,针对事件的 detail.service 字段使用文字字符串,例如 "ABUSE"

service,Null

events: detail.userIdentity.principalId

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

对于 principal-id,针对事件的 detail.userIdentity.principalId 字段使用文字字符串,而 detail-type 为 "Amazon API Call via CloudTrail",例如 "AROAIDPPEZS35WEXAMPLE:AssumedRoleSessionName."

Principal Id,Null

events:eventBusInvocation

"events:eventBusInvocation":"boolean"

对于 boolean,如果规则将事件发送到目标,而该目标是另一个账户中的事件总线,请使用 true。使用 PutEvents API 调用时,使用 false。

eventBusInvocation, Null

events:ManagedBy

由Amazon服务内部使用。如果某个规则由 Amazon 服务代表您创建,此值是创建规则的服务主体名称。

不要在客户策略中使用。

events:source

"events:source":"source "

使用 source 作为事件源字段的文字字符串,例如 "aws.ec2""aws.s3"。有关 source 的更多可能值,请参阅 来自 Amazon 服务的事件中的示例事件。

Source,Null

events:TargetArn

"events:TargetArn":"target-arn "

对于 target-arn,使用规则目标的 ARN,例如 "arn:aws:lambda:*:*:function:*"

ArrayOfARN, Null

有关适用于 EventBridge 的策略语句示例,请参阅管理对 Amazon EventBridge 资源的访问权限

EventBridge Pipes 具体信息

EventBridge Pipes 不支持任何额外的 IAM 策略条件键。

示例:使用 creatorAccount 条件

以下示例策略语句说明如何在策略中使用 creatorAccount 条件,仅当指定为 creatorAccount 的账户是创建规则的账户时,才允许创建规则。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleForOwnedRules", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*", "Condition": { "StringEqualsIfExists": { "events:creatorAccount": "${aws:PrincipalAccount}" } } } ] }

示例:使用 eventBusInvocation 条件

eventBusInvocation 指示调用是来自跨账户目标还是 PutEvents API 请求。如果调用源于包含跨账户目标的规则,例如目标为另一账户中的事件总线,则该值为 true。如果调用源于 PutEvents API 请求,该值为 false。以下示例表示来自跨账户目标的调用。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCrossAccountInvocationEventsOnly", "Effect": "Allow", "Action": "events:PutEvents", "Resource": "*", "Condition": { "BoolIfExists": { "events:eventBusInvocation": "true" } } } ] }

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

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

策略 A:允许所有事件

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

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

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

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

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

将创建规则,因为策略允许此特定源,即 "aws.ec2"。但是,如果具有策略 B 的用户使用类似下面的事件模式调用 PutRule,则将拒绝该规则创建操作,因为策略不允许此特定源:也就是 "aws.s3"

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

实质上,仅允许具有策略 B 的用户创建与源自 Amazon EC2 的事件匹配的规则,因此他们只能访问 Amazon EC2 中的事件。

有关策略 A 和策略 B 的比较,请参阅下表。

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

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

否(不允许源 aws.s3)

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

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

否 (必须指定源)

示例:定义可在事件模式中分别使用的多个源

以下策略允许 IAM 用户或角色创建一条规则,EventPattern 中的源是 Amazon EC2 或 Amazon ECS。

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

下表显示此策略允许或拒绝的一些事件模式的示例。

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

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

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

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

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

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

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

{ "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" } } } ] }

下表显示此策略允许或拒绝的一些事件模式的示例。

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

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

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

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

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

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

以下策略仅允许用户创建 EventPatterns 具有源字段的规则。使用此策略,IAM 用户或角色不能创建 EventPattern 不提供特定源的规则。

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

下表显示此策略允许或拒绝的一些事件模式的示例。

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

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

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

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

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

{ "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" } } } ] }

下表显示此策略允许或拒绝的一些事件模式的示例。

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

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

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

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

示例:由 detail.service 限制 PutRule 访问权限

您可以限制 IAM 用户或角色仅为 events:details.service 字段中具有特定值的事件创建规则。events:details.service 的值并非一定是 Amazon 服务的名称。

当处理 Amazon Health 中与安全性或滥用相关的事件时,此策略条件有所帮助。通过使用此策略条件,您可以限制只有需要查看敏感警报的那些用户才能访问它们。

例如,以下策略允许仅为 events:details.service 的值为 ABUSE 的事件创建规则。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleEventsWithDetailServiceEC2", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*", "Condition": { "StringEquals": { "events:detail.service": "ABUSE" } } } ] }

示例:由 detail.eventTypeCode 限制 PutRule 访问权限

您可以限制 IAM 用户或角色仅为 events:details.eventTypeCode 字段中具有特定值的事件创建规则。当处理 Amazon Health 中与安全性或滥用相关的事件时,此策略条件有所帮助。通过使用此策略条件,您可以限制只有需要查看敏感警报的那些用户才能访问它们。

例如,以下策略允许仅为 events:details.eventTypeCode 的值为 AWS_ABUSE_DOS_REPORT 的事件创建规则。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleEventsWithDetailServiceEC2", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*", "Condition": { "StringEquals": { "events:detail.eventTypeCode": "AWS_ABUSE_DOS_REPORT" } } } ] }

示例:确保仅允许来自特定 PrincipalId 的 API 调用 Amazon CloudTrail 事件

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

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

下表显示此策略允许或拒绝的一些事件模式的示例。

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

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

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

示例:限制对目标的访问

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

{ "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 函数,如以下示例中所示。

{ "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:*" } } } ] }