对集群和 EMR Notebooks 进行基于标签的访问的 IAM policy
您可以在基于身份的策略中使用条件,以便基于标签控制对集群和 EMR Notebooks 的访问。
有关向集群添加标签的更多信息,请参阅为 EMR 集群添加标签。
以下示例说明将条件运算符与 Amazon EMR 条件键结合使用的不同场景和方法。这些 IAM policy 声明仅用于演示目的,并且不应用于生产环境。可通过多种方式来组合策略声明,以根据要求授予和拒绝权限。有关规划和测试 IAM policy 的更多信息,请参阅 IAM 用户指南。
重要
一个重要注意事项是,应该明确拒绝添加标签操作的权限。这可以防止用户标记资源,从而为其授予您不打算授予的权限。如果您未拒绝资源的标记操作,用户可以修改标签并规避基于标签的策略意图。
适用于集群的基于身份的策略语句示例
以下示例演示基于身份的权限策略,用于控制允许对 EMR 集群执行的操作。
重要
Amazon EMR 中的 ModifyInstanceGroup
操作不需要您指定集群 ID。因此,基于集群标签拒绝此操作需要额外的考虑。有关更多信息,请参阅拒绝 Amazon EMR 中的 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
语句中提供 AWS 账户 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
资源,您需要提供AWS账户 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" ] } } } ] }