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

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

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

有关向集群添加标签的更多信息,请参阅为 EMR 集群添加标签。有关这些条件键的更多信息,请参阅条件键

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

创建集群时需要集群标签

在上一个示例中,以下示例策略将查找相同的匹配标签:dev 标签的值 department。但在本示例中,RequestTag 条件键指定在标签创建期间应用策略,因此用户必须创建匹配指定值的集群。针对PassRole资源,您需要提供Amazon账户 ID 或别名,以及服务角色名称。有关 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": "PolicyPassroleXYZ", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::AccountId:role/Role-Name-With-Path" ] } ] }

拒绝添加和删除标签的访问权限

在以下示例中,允许添加和删除标签的 EMR 操作与指定前面实例中所示的 StringNotEquals 标签的 dev 运算符一起使用。此策略可防止用户在 EMR 集群上添加或删除值不为 devdepartment 标签。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "elasticmapreduce:AddTags", "elasticmapreduce:RemoveTags" ], "Condition": { "StringNotEquals": { "elasticmapreduce:ResourceTag/department": "dev" } }, "Resource": [ "*" ] } ] }

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

您也可以仅允许具有特定标签的集群上的操作,而不管标签值如何。为此,您可以使用 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": "PolicyCreateClusterTagNullPassroleXYZ", "Effect": "Allow", "Action": [ "elasticmapreduce:RunJobFlow" ], "Resource": [ "*" ], "Condition": { "Null": { "aws:RequestTag/department": "false" } } }, { "Sid": "PolicyPassroleXYZ", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::AccountId:role/Role-Name-With-Path" ] } ] }

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

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

– 仅允许访问用户基于标记创建的笔记本

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

在示例中,StringEquals 条件运算符尝试将表示当前用户 IAM 用户 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 上下文键。仅当用户未更改或删除 CreateEditor 标签时,才允许执行 creatorUserID 操作,此标签是默认添加的。变量 ${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" ] } } } ] }