我需要创建一个非常简单的 IAM 策略并将其授予特定队列。我需要仅向特定 IAM 用户授予对该队列的访问权限(应该是完全访问权限)。
因为目前默认情况下所有具有策略的 IAM 用户亚马逊SQSFullAccess/管理员访问可以向队列发送消息或从队列读取消息。
我尝试过以下政策,但没有成功
政策 1
{
"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: *
这可能吗?
目前,我必须在拒绝效果中明确指定每个用户。这非常不方便
答案1
最后我找到了一个解决方法。使用下面的策略,它可以按预期工作
{
"Version": "2012-10-17",
"Id": "arn:aws:sqs:us-east-1:930XXXXXX332:test-queue",
"Statement": [
{
"Sid": "Sid1472529596416",
"Effect": "Deny",
"NotPrincipal": {
"AWS": [
"arn:aws:iam::930XXXXXX332:user/test-sqs",
"arn:aws:iam::930XXXXXX332:root"
]
},
"Action": "SQS:*",
"Resource": "arn:aws:sqs:us-east-1:930XXXXXX332:test-queue"
}
]
}
关键部分是 - 你必须明确指定 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 (arn:aws:iam::444455556666:root)。如果 NotPrincipal 元素仅包含 Bob 的 ARN,则该策略的效果将是明确拒绝对包含用户 Bob 的 AWS 账户的访问。
用户不能拥有比其父帐户更多的权限,因此如果明确拒绝 Bob 的帐户访问,那么 Bob 也无法访问该资源。
"Effect": "Deny",
"NotPrincipal": {
"AWS": [
"arn:aws:iam::444455556666:user/Bob",
"arn:aws:iam::444455556666:root"
]
}
结合 Deny 和 NotPrincipal 是 AWS 评估主体的顺序唯一会产生影响的情况
答案2
初始代码的第一部分失败,因为条件再次通过资源 Arn 验证,因此您实际上是拒绝访问所有队列。第二部分应该可以工作,但显式访问拒绝始终优先。
“策略 2” 是错误的,因为您再次向所有人授予访问权限,但您需要授予访问权限的用户除外。但是您上面使用的全局拒绝仍然具有优先权,因此根本没有效果。
我认为您的问题在于您当前的 IAM 设置 - 您不应该向所有用户授予如此广泛的系统访问权限。IAM 以“严格允许您需要的内容”为基础工作,这最有利于安全。相反,您却陷入了“拒绝您需要的内容以外的所有内容”的困境,这在 IAM 中几乎无法维护,因为“拒绝”语句总是获胜。
目前的解决方法就是您所做的 - 将拒绝策略应用于组,并将该组应用于所有不应具有访问权限的用户。但是,随着更多队列的创建,您会发现自己陷入了拒绝策略的无休止循环,您需要在拒绝策略中明确设置所有队列的名称。而且 - 这会安全还是有意义?您说您已经为许多用户提供了管理员角色 - 如果他们可以修改他们的 IAM 策略,他们就可以做任何事情 - cloudtrail 可能会告诉您发生了什么,但不会带回您的数据。
我强烈建议您采用不同的方法,为您的用户定义更有限的策略。根据需要创建额外的策略,并使它们具有累积性,将它们附加到组,并从组附加到用户。利用 arn 值上的通配符最终为您的资源创建具有更严格访问权限的“保留”命名空间。