允许用户通过标签管理 EC2
Allow user to manage EC2 by its tags
我正在尝试为我们的供应商启用对 EC2 的访问。所以,我做了什么:我为专用 EC2 实例添加标签 "Vendor"。
然后,我在下面添加政策..
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*",
"Condition": {
"StringEquals": {
"ec2:ResourceTag/Vendor": "Takamol"
}
}
},
{
"Effect": "Deny",
"Action": [
"ec2:CreateTags",
"ec2:DeleteTags",
"ec2:TerminateInstances"
],
"Resource": "*"
}
]
}
然而,即使策略条件受标签 "Vendor" 限制(如您所见),用户(属于附加组的用户)也看不到任何 EC2 实例。
如何允许用户仅管理具有标签的 EC2 实例:Vendor = Takamol
您想要实现的目标是不可能的。这是因为一个叫做"Resource Level Permissions"的概念。支持资源级别权限的操作允许您使用 IAM allow/deny 用户能够对相关资源的某些子集执行操作,例如具有特定标签、S3 存储桶、VPC 等的 EC2 实例。不支持资源级别权限的操作对于所有资源只能是 allowed/denied,并且只能在资源为 * 的语句中允许用户执行以及没有条件的地方。
不幸的是,并非所有 EC2 操作都支持资源级别权限。您的用户看不到具有上述 IAM 策略的任何 EC2 实例的原因是 ec2:Describe* API 调用(在控制台中用于列出帐户中的所有实例)不支持资源级别权限。
因此,即使 ec2:Describe* 属于 ec2:*,您允许在策略的第一条语句中使用标记实例,ec2:Describe* 的条件评估为拒绝所有 ec2:Describe*。
人们通常最终做的是允许供应商访问查看帐户中的所有实例,然后只允许他们获得特定实例集所需的额外权限。请参阅下面的策略,它将允许用户查看所有实例,但只能启动、停止和重启具有所需标签的实例。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSeeEverything",
"Effect": "Allow",
"Action": [
"ec2:Describe*"
],
"Resource": [
"*"
]
},
{
"Sid": "ThingsIAllowThemToDoForTaggedEc2s",
"Effect": "Allow",
"Action": [
"ec2:RebootInstances",
"ec2:StartInstances",
"ec2:StopInstances"
],
"Condition": {
"StringEquals": {
"ec2:ResourceTag/Vendor": "Takamol"
}
},
"Resource": [
"*"
]
}
]
}
Supported Resource-Level Permissions for Amazon EC2 API Actions 中记录了 EC2 API 调用支持资源级权限的列表以及支持的条件。我还建议阅读 Demystifying EC2 Resource-Level Permissions
博客 post.
我正在尝试为我们的供应商启用对 EC2 的访问。所以,我做了什么:我为专用 EC2 实例添加标签 "Vendor"。
然后,我在下面添加政策..
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*",
"Condition": {
"StringEquals": {
"ec2:ResourceTag/Vendor": "Takamol"
}
}
},
{
"Effect": "Deny",
"Action": [
"ec2:CreateTags",
"ec2:DeleteTags",
"ec2:TerminateInstances"
],
"Resource": "*"
}
]
}
然而,即使策略条件受标签 "Vendor" 限制(如您所见),用户(属于附加组的用户)也看不到任何 EC2 实例。
如何允许用户仅管理具有标签的 EC2 实例:Vendor = Takamol
您想要实现的目标是不可能的。这是因为一个叫做"Resource Level Permissions"的概念。支持资源级别权限的操作允许您使用 IAM allow/deny 用户能够对相关资源的某些子集执行操作,例如具有特定标签、S3 存储桶、VPC 等的 EC2 实例。不支持资源级别权限的操作对于所有资源只能是 allowed/denied,并且只能在资源为 * 的语句中允许用户执行以及没有条件的地方。
不幸的是,并非所有 EC2 操作都支持资源级别权限。您的用户看不到具有上述 IAM 策略的任何 EC2 实例的原因是 ec2:Describe* API 调用(在控制台中用于列出帐户中的所有实例)不支持资源级别权限。
因此,即使 ec2:Describe* 属于 ec2:*,您允许在策略的第一条语句中使用标记实例,ec2:Describe* 的条件评估为拒绝所有 ec2:Describe*。
人们通常最终做的是允许供应商访问查看帐户中的所有实例,然后只允许他们获得特定实例集所需的额外权限。请参阅下面的策略,它将允许用户查看所有实例,但只能启动、停止和重启具有所需标签的实例。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSeeEverything",
"Effect": "Allow",
"Action": [
"ec2:Describe*"
],
"Resource": [
"*"
]
},
{
"Sid": "ThingsIAllowThemToDoForTaggedEc2s",
"Effect": "Allow",
"Action": [
"ec2:RebootInstances",
"ec2:StartInstances",
"ec2:StopInstances"
],
"Condition": {
"StringEquals": {
"ec2:ResourceTag/Vendor": "Takamol"
}
},
"Resource": [
"*"
]
}
]
}
Supported Resource-Level Permissions for Amazon EC2 API Actions 中记录了 EC2 API 调用支持资源级权限的列表以及支持的条件。我还建议阅读 Demystifying EC2 Resource-Level Permissions 博客 post.