我正在尝试为 AWS 控制台创建一个 IAM 用户,并授予其列出并仅在 1 个实例上执行操作的权限。
所以我总共有 6 个实例,我尝试通过添加以下策略通过 IAM 策略隐藏其中 5 个:
分解
1. 首先取消所有权限
2. 仅添加权限一个实例
{
"Statement": [
{
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"condition": {}
}
},
{
"Effect": "Allow",
"Action": "*",
"Resource": "arn:aws:ec2:us-east-1:123456789012:instance/i-0123456789abcdef",
"Condition": {
"condition": {}
}
}
]
}
权限不是这样运作的吗?如能得到任何帮助,我将不胜感激。
答案1
您当前的策略将在 AWS-CLI 中起作用,例如aws ec2 stop-instance
应该起作用。
然而,要真正使用网络控制台你还需要一些只读权限因为控制台尝试列出并描述所有实例来构建列表。
您可能至少需要ec2:DescribeInstances
获取一个基本的半破损列表。
如果您只关心防止该 IAM 用户修改其他实例,您可以授予他只读访问权限ec2:Describe*
- 这应该使控制台可用,同时阻止他修改任何未经许可的实例。
我不知道有没有什么办法可以将实例列表限制为只能由他处理的实例,他可能会看到所有实例,但只能管理单个实例。
希望有帮助:)
答案2
关于向用户隐藏除一个实例之外的所有实例
这无法使用 IAM 策略来实现。这些ec2:Describe*
命令(包括ec2:DescribeInstances
)不支持资源级权限。因此,您只能允许或拒绝ec2:Describe*
所有内容(*
)。因此,您的用户可以看到所有实例,或者看不到任何实例。
关于尝试拒绝所有,然后覆盖允许
策略语句的顺序不会改变策略的结果。因此,不要尝试“自上而下”地编写或解释它。
政策的运作方式如下:
- 该策略开始隐式拒绝一切(这是隐含的拒绝)
- 任何“允许”语句都会覆盖任何隐含的拒绝(这是明确的允许)
- 任何“拒绝”语句都会覆盖所有允许(这是明确的拒绝)
所以一旦你有了“拒绝”声明,没有什么可以覆盖它。
为了能够像您尝试做的那样“划分”允许,您必须执行以下操作之一:
- 不要否认任何事情,只允许你想允许的事情,或者
- 否认一切除了你想允许什么(在一条语句中)
为了实现你的愿望
最接近的做法是允许用户“查看”所有内容,但只能在一个 EC2 实例上进行操作。您需要 2 条语句:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:Describe*",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "*",
"Resource": "arn:aws:ec2:us-east-1:1234567890123:instance/i-12345678"
}
]
}
答案3
您必须拒绝所有内容,但在您的条件下,使用 ArnNotEquals“arn:aws:ec2:us-east-1:123456789012:instance / i-0123456789abcdef”
这基本上会拒绝所有不具有与您想要允许的实例相同的 ARN 的其他实例。
答案4
感谢 MLu 和 Sharuzzaman Ahmat Raslan!
您的意见确实帮助我完成了这项工作。我在下面添加了我所做工作的摘要,以防万一:
- 首先,需要确保附有正确的政策到用户组,或者在我的情况下,正确的策略是分离的。用户没有 EC2 访问权限。
接下来,我使用内联策略来添加访问权限。我添加了以下策略,正如 MLu 所提到的,该策略允许不停止列出实例,但不允许更新其他实例
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:Describe*", "Resource": "*" }, { "Effect": "Allow", "Action": "*)", "Resource": "arn:aws:ec2:us-east-1:1234567890123:instance/i-xxxxxxxxxxxxxxxxx" } ] }
希望这可以帮助那些陷入困境的人节省一些时间。