对集群和 EMR Notebooks 进行基于标签的访问的 IAM policy
您可以在基于身份的策略中使用条件,以便基于标签控制对集群和 EMR Notebooks 的访问。
有关向集群添加标签的更多信息,请参阅为 EMR 集群添加标签。
以下示例说明将条件运算符与 Amazon EMR 条件键结合使用的不同场景和方法。这些 IAM policy 声明仅用于演示目的,并且不应用于生产环境。可通过多种方式来组合策略声明,以根据要求授予和拒绝权限。有关规划和测试 IAM policy 的更多信息,请参阅 IAM 用户指南。
重要
一个重要注意事项是,应该明确拒绝添加标签操作的权限。这可以防止用户标记资源,从而为其授予您不打算授予的权限。如果您未拒绝资源的标记操作,用户可以修改标签并规避基于标签的策略意图。
适用于集群的基于身份的策略语句示例
以下示例演示基于身份的权限策略,用于控制允许对 EMR 集群执行的操作。
重要
Amazon EMR 中的 ModifyInstanceGroup
操作不需要您指定集群 ID。因此,基于集群标签拒绝此操作需要额外的考虑。有关更多信息,请参阅拒绝 ModifyInstanceGroup 操作。
仅允许带特定标签值的集群上的操作
以下示例演示了一个策略,该策略允许用户使用值
根据集群标签 dev
执行操作,并允许用户对集群添加相同的标签。最后一个策略示例演示如何拒绝向 EMR 集群添加除该相同标签之外的其它标签的权限。department
在以下策略示例中,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
或 dev
的集群上的所有操作,您可以将上一个示例中的条件块替换为以下内容。test
"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 用户指南》中的用于检查条件键是否存在的条件运算符。例如,要仅允许包含
标签的 EMR 集群上的操作 (而不管此标签包含的值如何)。您可以将上一示例中的条件块替换为以下内容。department
Null
运算符可检查 EMR 集群上是否存在标签
。如果此标签存在,则 department
Null
语句的计算结果为 false,这匹配此策略声明中指定的条件并允许相应的操作。
"Condition": { "Null": { "elasticmapreduce:ResourceTag/department":"false" } }
以下策略声明仅允许用户在集群具有
标签 (可包含任何值) 的情况下创建 EMR 集群。针对department
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
且值设置为以下之一的标签创建集群:datascience
、analytics
、operations
。
{ "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" ] } } } ] }