如何使用 IAM 策略标签限制 EC2 实例或 EBS 卷的创建和访问方式?
我想允许 AWS Identity and Access Management (IAM) 身份访问权限来启动新的 Amazon Elastic Compute Cloud (Amazon EC2) 实例。我还想允许 IAM 身份访问权限在应用特定标签时创建新的 Amazon Elastic Block Store (Amazon EBS) 卷。
简短描述
作为创建资源的 API 调用的一部分,为 EC2 实例和 Amazon EBS 卷指定标签。对 IAM 策略应用条件,以要求 IAM 用户标记特定资源。
以下示例策略不允许用户创建安全组或密钥对,因此用户必须选择现有的安全组和密钥对。
以下示例 IAM 策略允许用户启动具有以下配置的实例:
- 匹配的标签键和值
- 至少一个匹配的标签和值
- 至少一个匹配的标签键
- 仅指定的标签列表
示例 IAM 策略还允许用户管理具有匹配标签键和值的实例和卷。
**注意:**要使用示例策略,请将示例值替换为您的值。
解决方法
根据标签限制 EC2 实例和 EBS 卷的创建
以下示例策略允许用户启动实例并根据标签创建卷。
启动具有匹配标签键和值的 EC2 实例
在以下示例策略中,RequestTag 条件控制标签的执行。如果用户应用策略中未包含的标签,则该操作将被拒绝。要强制区分大小写,请使用 aws:TagKeys 条件:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowToDescribeAll", "Effect": "Allow", "Action": [ "ec2:Describe*" ], "Resource": "*" }, { "Sid": "AllowRunInstances", "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:*::image/*", "arn:aws:ec2:*::snapshot/*", "arn:aws:ec2:*:*:subnet/*", "arn:aws:ec2:*:*:network-interface/*", "arn:aws:ec2:*:*:security-group/*", "arn:aws:ec2:*:*:key-pair/*" ] }, { "Sid": "AllowRunInstancesWithRestrictions", "Effect": "Allow", "Action": [ "ec2:CreateVolume", "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:*:*:volume/*", "arn:aws:ec2:*:*:instance/*", "arn:aws:ec2:*:*:network-interface/*" ], "Condition": { "StringEquals": { "aws:RequestTag/key1": "value1", "aws:RequestTag/key2": "value2" }, "ForAllValues:StringEquals": { "aws:TagKeys": [ "key1", "key2" ] } } }, { "Sid": "AllowCreateTagsOnlyLaunching", "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": [ "arn:aws:ec2:*:*:volume/*", "arn:aws:ec2:*:*:instance/*", "arn:aws:ec2:*:*:network-interface/*" ], "Condition": { "StringEquals": { "ec2:CreateAction": [ "RunInstances", "CreateVolume" ] } } } ] }
**重要事项:**要成功启动 EC2 实例,前面的策略必须包括匹配的标签键和值。如果键和值对不匹配,则您会收到 Launch Failed(启动失败)错误或类似的 API 失败消息。
结果示例
键/值 | 结果 |
key1/value1 和 key2/value2 | allow |
key1/value1 | deny |
key1/value2 | deny |
无键和值 | deny |
启动至少具有一个匹配标签键的 EC2 实例
在以下示例策略中,当至少有一个标签键名为 key1 时,替换 AllowRunInstancesWithRestrictions 条件块。key1 标签不需要特定的值,您可以在 RunInstances 请求中添加标签:
"Condition": { "StringEquals": { "aws:RequestTag/key1": "value1" }, "ForAnyValue:StringEquals": { "aws:TagKeys": [ "key1" ] } }
结果示例
键/值 | 结果 |
key1/value1 和 key2/value2 | allow |
key1/value1 | allow |
key1/value2 | allow |
无键和值 | deny |
启动仅具有指定标签列表的 EC2 实例
在以下示例策略中,当请求中提供标签键 key1 和 key2 时,替换 AllowRunInstancesWithRestrictions 条件块。这两个标签键都不需要特定的值,并且您无法在 RunInstances 请求中添加标签:
"Condition": { "StringLike": { "aws:RequestTag/key1": "*", "aws:RequestTag/key2": "*" }, "ForAllValues:StringEquals": { "aws:TagKeys": [ "key1", "key2" ] } }
**注意:**在前面的策略中,必须使用 StringLike 条件,这样值才能包含多字符匹配通配符 (*)。
结果示例
键/值 | 结果 |
key1/AnyValue 和 key2/AnyValue | Allow |
key1/AnyValue | Deny |
key2/AnyValue | Deny |
无键或值 | Deny |
key1/AnyValue、key2/AnyValue、key3/AnyValue | Deny |
根据标签键和值限制 EC2 实例和 EBS 卷管理
以下示例策略根据标签键和值限制用户对实例和卷的管理。
管理具有匹配标签键和值的 EC2 实例
以下示例策略将 IAM 身份的访问权限限制为仅启动、停止或重启 EC2 实例。该实例必须具有带有 Bob 标签值的 Owner 键标签:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:Describe*", "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:StartInstances", "ec2:StopInstances", "ec2:RebootInstances" ], "Resource": [ "arn:aws:ec2:*:111122223333:instance/*" ], "Condition": { "StringEquals": { "ec2:ResourceTag/Owner": "Bob" } } } ] }
**注意:**将 Owner 替换为您的标签键,将 Bob 替换为您的 IAM 用户的名称,将资源 ARN 替换为您的资源的 ARN。
有关详细信息,请参阅我能否限制 IAM 身份对特定 Amazon EC2 资源的访问权限?
管理具有匹配标签键和值的 EBS 卷
以下示例策略允许 IAM 身份分离或删除 EBS 卷。对于 DeleteVolume API 操作,该卷必须具有带有 Mary 标签值的 Owner 标签键。对于 DetachVolume API 操作,实例和卷必须都具有相同的标签键 Owner,标签值为 Mary:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Action": [ "ec2:DetachVolume", "ec2:DeleteVolume" ], "Resource": [ "arn:aws:ec2:*:111122223333:volume/*", "arn:aws:ec2:*:111122223333:instance/*" ], "Condition": { "StringEquals": { "aws:ResourceTag/Owner": "Mary" } } } ] }
**注意:**将 Owner 替换为您的标签键,将 Mary 替换为您的 IAM 用户的名称,将资源 ARN 替换为您的资源的 ARN。
相关信息
相关内容
- AWS 官方已更新 1 个月前
- AWS 官方已更新 2 个月前
- AWS 官方已更新 1 年前