View a markdown version of this page

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

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

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

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

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

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

重要

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

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

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

重要

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

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

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

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

JSON
{ "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资源,您必须提供 AWS 账户 ID 或别名、语句中的服务角色名称以及PassRoleForEMRPassRoleForEC2句中的实例配置文件名称。有关 IAM ARN 格式的信息,请参阅 《IAM 用户指南》中的 IAM ARN

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

JSON
{ "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::123456789012:role/Role-Name-With-Path" ], "Condition": { "StringLike": { "iam:PassedToService": "elasticmapreduce.amazonaws.com*" } } }, { "Sid": "PassRoleForEC2", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::123456789012: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资源,您需要提供 AWS 账户 ID 或别名以及服务角色名称。有关 IAM ARN 格式的信息,请参阅 《IAM 用户指南》中的 IAM ARN

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

JSON
{ "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::123456789012:role/Role-Name-With-Path" ], "Condition": { "StringLike": { "iam:PassedToService": "elasticmapreduce.amazonaws.com*" } } }, { "Sid": "PassRoleForEC2", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::123456789012:role/Role-Name-With-Path" ], "Condition": { "StringLike": { "iam:PassedToService": "ec2.amazonaws.com*" } } } ] }

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

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

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

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

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

JSON
{ "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}" } }, "Sid": "AllowELASTICMAPREDUCEDescribeeditor" } ] }
例:创建 Notebook 时需要 Notebook 标记

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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