如何向特定 IAM 用户授予对 SQS 的访问权限

如何向特定 IAM 用户授予对 SQS 的访问权限

我需要创建一个非常简单的 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 值上的通配符最终为您的资源创建具有更严格访问权限的“保留”命名空间。

相关内容