我需要创建一个非常简单的 IAM 策略并将其授予特定队列。我需要仅向特定 IAM 用户授予对队列的访问权限(应该是完全访问权限)。
因为目前默认情况下,所有具有策略AmazonSQSFullAccess / AdministratorAccess的 IAM 用户都可以向队列发送/读取消息。
我尝试了以下策略但没有成功
政策一
{
"Version": "2012-10-17",
"Id": "arn:aws:sqs:us-east-1:930XXXXXX332:task-queue/SQSDefaultPolicy",
"Statement": [
{
"Sid": "Sid1487598389851",
"Effect": "Deny",
"Principal": "*",
"Action": "SQS:*",
"Resource": "arn:aws:sqs:us-east-1:930XXXXXX332:task-queue",
"Condition": {
"ArnNotEquals": {
"aws:SourceArn": "arn:aws:iam::930XXXXXX332:user/test-sqs"
}
}
},
{
"Sid": "Sid1487599825058",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::930XXXXXX332:user/test-sqs"
},
"Action": "SQS:*",
"Resource": "arn:aws:sqs:us-east-1:930XXXXXX332:task-queue"
}
]
}
策略 2(与上述相同,但我尝试了另一种情况)
"Condition": {
"NotPrincipal": {
"AWS": "arn:aws:iam::930XXXXXX332:user/test-sqs"
}
}
换句话说 - 我需要得到类似以下的东西
Allow: user1, user2
Deny: *
有可能吗?
目前我必须在拒绝效果中明确指定每个用户。这非常不方便
最后我找到了解决方法。使用下面的政策,它可以按预期工作
关键部分是 - 您必须明确指定 root 帐户。没有它——它根本行不通。对我来说,这是一些 AWS 魔法 :) 但可能有人可以对这种情况有所了解。
更新 01.03.2017 看来我已经找到了这种行为的描述 - http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#NotPrincipal
在以下示例中,除 AWS 账户 444455556666 中名为 Bob 的用户之外的所有委托人都被明确拒绝访问资源。请注意,为实现预期效果,NotPrincipal 元素包含用户 Bob 和 Bob 所属的 AWS 账户 (arn:aws:iam::444455556666:root) 的 ARN。如果 NotPrincipal 元素仅包含 Bob 的 ARN,则策略的效果将是明确拒绝对包含用户 Bob 的 AWS 账户的访问。
用户不能拥有比其父账户更多的权限,因此如果 Bob 的账户被明确拒绝访问,那么 Bob 也无法访问该资源。
结合 Deny 和 NotPrincipal 是唯一一次 AWS 评估委托人的顺序会有所不同
初始代码的第一部分失败,因为条件再次验证资源 Arn,因此您实际上拒绝访问所有队列。第二部分应该可以工作,但明确的访问拒绝始终具有优先权。
“策略 2”是错误的,因为您再次授予所有人访问权限,但您需要授予访问权限的用户。但是您在上面使用的全局否认仍然具有优先权,因此根本没有效果。
我认为您的问题出在您当前的 IAM 设置的基础上——您不应该为所有用户提供如此广泛的系统访问权限。IAM 在“允许您严格需要”的基础上工作,这对安全性最有利。相反,你让自己陷入了“拒绝一切,但你需要的东西”,这在 IAM 中几乎无法维护,因为“拒绝”声明总是获胜。
现在的解决方法就是您所做的 - 将拒绝策略应用于组,并将该组应用于所有不应访问的用户。但是,随着可能创建更多队列,您会发现自己陷入了一个永无止境的拒绝策略循环,您需要在拒绝策略中明确设置所有队列的名称。而且 - 这会是安全的还是有意义的?您说您已授予许多用户管理员角色 - 如果他们可以修改他们的 IAM 策略,他们可以做任何事情 - cloudtrail 可能会告诉您发生了什么,但不会带回您的数据。
我强烈建议您采用不同的方法,并为您的用户定义更有限的策略。根据需要创建额外的策略并使它们具有累积性,将它们附加到组以及从组到用户。利用 arn 值上的通配符,最终为您的资源创建“保留”命名空间,并限制访问。