对集群和 EMR Notebooks 进行基于标签的访问的 IAM policy - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

对集群和 EMR Notebooks 进行基于标签的访问的 IAM policy

您可以在基于身份的策略中使用条件,以便基于标签控制对集群和 EMR Notebooks 的访问。

有关向集群添加标签的更多信息,请参阅为 EMR 集群添加标签

以下示例说明将条件运算符与 Amazon EMR 条件键结合使用的不同场景和方法。这些 IAM policy 声明仅用于演示目的,并且不应用于生产环境。可通过多种方式来组合策略声明,以根据要求授予和拒绝权限。有关规划和测试 IAM policy 的更多信息,请参阅 IAM 用户指南

重要

一个重要注意事项是,应该明确拒绝添加标签操作的权限。这可以防止用户标记资源,从而为其授予您不打算授予的权限。如果您未拒绝资源的标记操作,用户可以修改标签并规避基于标签的策略意图。

适用于集群的基于身份的策略语句示例

以下示例演示基于身份的权限策略,用于控制允许对 EMR 集群执行的操作。

重要

Amazon EMR 中的 ModifyInstanceGroup 操作不需要您指定集群 ID。因此,基于集群标签拒绝此操作需要额外的考虑。有关更多信息,请参阅拒绝 ModifyInstanceGroup 操作

仅允许带特定标签值的集群上的操作

以下示例演示了一个策略,该策略允许用户使用值 dev 根据集群标签 department 执行操作,并允许用户对集群添加相同的标签。最后一个策略示例演示如何拒绝向 EMR 集群添加除该相同标签之外的其它标签的权限。

在以下策略示例中,StringEquals 条件运算符尝试将 dev 与标签 department 的值匹配。如果标签 department 尚未添加到集群或不包含值 dev,则策略不会应用,并且此策略将不允许这些操作。如果任何其它策略声明允许操作,则用户只能使用标签中包含此值的集群。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt12345678901234", "Effect": "Allow", "Action": [ "elasticmapreduce:DescribeCluster", "elasticmapreduce:ListSteps", "elasticmapreduce:TerminateJobFlows", "elasticmapreduce:SetTerminationProtection", "elasticmapreduce:ListInstances", "elasticmapreduce:ListInstanceGroups", "elasticmapreduce:ListBootstrapActions", "elasticmapreduce:DescribeStep" ], "Resource": [ "*" ], "Condition": { "StringEquals": { "elasticmapreduce:ResourceTag/department": "dev" } } } ] }

您也可以使用条件运算符指定多个标签值。例如,要运行其 department 标签包含值 devtest 的集群上的所有操作,您可以将上一个示例中的条件块替换为以下内容。

"Condition": { "StringEquals": { "elasticmapreduce:ResourceTag/department":["dev", "test"] } }

创建集群时需要集群标签

在前面的示例中,以下示例策略将查找相同的匹配标签:department 标签的值 dev。但在此示例中,RequestTag 条件键指定策略在标签创建期间适用。因此,您必须使用与指定值匹配的标签创建集群。

要创建带有标签的集群,您还必须具有 elasticmapredue:AddTags 操作权限。对于此语句,elasticmapreduce:ResourceTag 条件键确保 IAM 仅授予对标签 department 上具有值 dev 的标签资源的访问权限。Resource 元素用于将此权限限制到集群资源。

对于 PassRole 资源,您必须在 PassRoleForEMR 语句中提供 Amazon 账户 ID 或别名、服务角色名称以及 PassRoleForEC2 语句中的实例配置文件名称。有关 IAM ARN 格式的信息,请参阅 《IAM 用户指南》中的 IAM ARN

有关匹配的标签键值的更多信息,请参阅《IAM 用户指南》中的 aws:RequestTag/tag-key

{ "Version": "2012-10-17", "Statement": [ { "Sid": "RunJobFlowExplicitlyWithTag", "Effect": "Allow", "Action": [ "elasticmapreduce:RunJobFlow" ], "Resource": "*", "Condition": { "StringEquals": { "aws:RequestTag/department": "dev" } } }, { "Sid": "AddTagsForDevClusters", "Effect": "Allow", "Action": "elasticmapreduce:AddTags", "Resource": "arn:aws:elasticmapreduce:*:*:cluster/*", "Condition": { "StringEquals": { "elasticmapreduce:ResourceTag/department": "dev" } } }, { "Sid": "PassRoleForEMR", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::AccountId:role/Role-Name-With-Path", "Condition": { "StringLike": { "iam:PassedToService": "elasticmapreduce.amazonaws.com*" } } }, { "Sid": "PassRoleForEC2", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::AccountId:role/Role-Name-With-Path", "Condition": { "StringLike": { "iam:PassedToService": "ec2.amazonaws.com*" } } } ] }

允许带有特定标签的集群上的操作,而不管标签值如何

您也可以仅允许具有特定标签的集群上的操作,而不管标签值如何。为此,您可以使用 Null 运算符。有关更多信息,请参阅《IAM 用户指南》中的用于检查条件键是否存在的条件运算符。例如,要仅允许包含 department 标签的 EMR 集群上的操作 (而不管此标签包含的值如何)。您可以将上一示例中的条件块替换为以下内容。Null 运算符可检查 EMR 集群上是否存在标签 department。如果此标签存在,则 Null 语句的计算结果为 false,这匹配此策略声明中指定的条件并允许相应的操作。

"Condition": { "Null": { "elasticmapreduce:ResourceTag/department":"false" } }

以下策略声明仅允许用户在集群具有 department 标签 (可包含任何值) 的情况下创建 EMR 集群。针对PassRole资源,您需要提供Amazon账户 ID 或别名,以及服务角色名称。有关 IAM ARN 格式的信息,请参阅 《IAM 用户指南》中的 IAM ARN

有关指定 null (false) 条件运营的更多信息,请参阅《IAM 用户指南》中的用于检查条件键是否存在的条件运算符

{ "Version": "2012-10-17", "Statement": [ { "Sid": "CreateClusterTagNullCondition", "Effect": "Allow", "Action": [ "elasticmapreduce:RunJobFlow" ], "Resource": [ "*" ], "Condition": { "Null": { "aws:RequestTag/department": "false" } } }, { "Sid": "AddTagsNullCondition", "Effect": "Allow", "Action": "elasticmapreduce:AddTags", "Resource": "arn:aws:elasticmapreduce:*:*:cluster/*", "Condition": { "Null": { "elasticmapreduce:ResourceTag/department": "false" } } }, { "Sid": "PassRoleForElasticMapReduce", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::AccountId:role/Role-Name-With-Path", "Condition": { "StringLike": { "iam:PassedToService": "elasticmapreduce.amazonaws.com*" } } }, { "Sid": "PassRoleForEC2", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::AccountId:role/Role-Name-With-Path", "Condition": { "StringLike": { "iam:PassedToService": "ec2.amazonaws.com*" } } } ] }

适用于 EMR Notebooks 的基于身份的策略语句示例

本部分中的示例 IAM policy 语句展示了使用密钥来限制使用 EMR Notebooks 所允许的操作的常见情形。只要与委托人(用户)关联的其它策略都不允许执行这些操作,条件上下文键就会按指示限制允许的操作。

– 仅允许访问用户基于标记创建的 EMR Notebooks

下面的示例策略语句附加到角色或用户后,会允许用户仅使用他们创建的笔记本。此策略语句使用创建笔记本时应用的默认标签。

在示例中,StringEquals 条件运算符尝试将表示当前用户用户 ID ({aws:userId}) 的变量与标签 creatorUserID 的值相匹配。如果标签 creatorUserID 尚未添加到笔记本或不包含当前用户 ID 的值,则策略不会应用,并且此策略将不允许这些操作。如果没有任何其它策略语句允许这些操作,则用户只能使用此标签中包含此值的笔记本。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "elasticmapreduce:DescribeEditor", "elasticmapreduce:StartEditor", "elasticmapreduce:StopEditor", "elasticmapreduce:DeleteEditor", "elasticmapreduce:OpenEditorInConsole" ], "Effect": "Allow", "Resource": "*", "Condition": { "StringEquals": { "elasticmapreduce:ResourceTag/creatorUserId": "${aws:userId}" } } } ] }
例 – 创建笔记本时需要笔记本标记

此示例使用 RequestTag 上下文键。仅当用户未更改或删除 creatorUserID 标签时,才允许执行 CreateEditor 操作,此标签是默认添加的。变量 ${aws:userId} 用于指定当前活动用户的用户 ID,此 ID 是标签的默认值。

该策略语句可有助于确保用户不会删除 createUserId 标签或更改其值。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "elasticmapreduce:CreateEditor" ], "Effect": "Allow", "Resource": "*", "Condition": { "StringEquals": { "elasticmapreduce:RequestTag/creatorUserId": "${aws:userid}" } } } ] }

此示例要求用户使用键字符串为 dept 且值设置为以下之一的标签创建集群:datascienceanalyticsoperations

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "elasticmapreduce:CreateEditor" ], "Effect": "Allow", "Resource": "*", "Condition": { "StringEquals": { "elasticmapreduce:RequestTag/dept": [ "datascience", "analytics", "operations" ] } } } ] }
例 – 将笔记本创建限定到已标记的集群并需要笔记本标签

仅当使用键字符串 owner 设置为一个指定值的标签创建笔记本时,此示例才允许创建笔记本。此外,仅当集群具有键字符串 department 设置为一个指定值的标签时,才能创建笔记本。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "elasticmapreduce:CreateEditor" ], "Effect": "Allow", "Resource": "*", "Condition": { "StringEquals": { "elasticmapreduce:RequestTag/owner": [ "owner1", "owner2", "owner3" ], "elasticmapreduce:ResourceTag/department": [ "dep1", "dep3" ] } } } ] }
例 – 将能力限定为启动基于标签的笔记本

此示例将启动笔记本的能力限定为那些具有键字符串 owner 设置为一个指定值的标签的笔记本。因为 Resource 元素仅用于指定 editor,所以此条件不适用于集群,并且它不需要标记。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "elasticmapreduce:StartEditor" ], "Effect": "Allow", "Resource": "arn:aws:elasticmapreduce:*:123456789012:editor/*", "Condition": { "StringEquals": { "elasticmapreduce:ResourceTag/owner": [ "owner1", "owner2" ] } } } ] }

此示例类似于上一示例。但是,限制仅适用于已标记的集群,不适用于笔记本。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "elasticmapreduce:StartEditor" ], "Effect": "Allow", "Resource": "arn:aws:elasticmapreduce:*:123456789012:cluster/*", "Condition": { "StringEquals": { "elasticmapreduce:ResourceTag/department": [ "dep1", "dep3" ] } } } ] }

此示例使用一组不同的笔记本和集群标签。仅当满足以下条件时,它才允许启动笔记本:

  • 笔记本具有键字符串 owner 设置为任意指定值的标签

    –和–

  • 集群具有键字符串 department 设置为任意指定值的标签

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "elasticmapreduce:StartEditor" ], "Effect": "Allow", "Resource": "arn:aws:elasticmapreduce:*:123456789012:editor/*", "Condition": { "StringEquals": { "elasticmapreduce:ResourceTag/owner": [ "user1", "user2" ] } } }, { "Action": [ "elasticmapreduce:StartEditor" ], "Effect": "Allow", "Resource": "arn:aws:elasticmapreduce:*:123456789012:cluster/*", "Condition": { "StringEquals": { "elasticmapreduce:ResourceTag/department": [ "datascience", "analytics" ] } } } ] }
例 – 将能力限定为打开基于标签的笔记本编辑器

仅当满足以下条件时,此示例才允许打开笔记本编辑器:

  • 笔记本具有键字符串 owner 设置为任意指定值的标签。

    –和–

  • 集群具有键字符串 department 设置为任意指定值的标签。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "elasticmapreduce:OpenEditorInConsole" ], "Effect": "Allow", "Resource": "arn:aws:elasticmapreduce:*:123456789012:editor/*", "Condition": { "StringEquals": { "elasticmapreduce:ResourceTag/owner": [ "user1", "user2" ] } } }, { "Action": [ "elasticmapreduce:OpenEditorInConsole" ], "Effect": "Allow", "Resource": "arn:aws:elasticmapreduce:*:123456789012:cluster/*", "Condition": { "StringEquals": { "elasticmapreduce:ResourceTag/department": [ "datascience", "analytics" ] } } } ] }