如何使用IAM策略AWS仅向S3存储桶的根帐户用户授予访问权限?

时间:2020-10-09 20:28:02

标签: amazon-web-services amazon-s3 amazon-iam

我想创建一个只有根帐户才能拥有完全访问权限的s3存储桶策略,该怎么办?

示例:

   {
    "Version": "2012-10-17",
    "Statement": [            
        {
            "Sid": "Allow full access for root account user",
            "Effect": "Allow",
            "Principal": {
                "AWS": "root"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::ih-deploy-bucket/*",
                "arn:aws:s3:::ih-deploy-bucket"
            ]
        }
    ]
}

或添加类似条件

"Condition": {
    "StringEquals" : {"aws:username" : "rootUser"} 
}

3 个答案:

答案 0 :(得分:4)

这是带有Deny的显式NotPrincipal的极少数(如果不是唯一)用例之一:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "NotPrincipal": {
        "AWS": "arn:aws:iam::<your-account-number>:root"
      },
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::ih-deploy-bucket/*",
        "arn:aws:s3:::ih-deploy-bucket"
      ]
    }
  ]
}

这将明确拒绝不是(不是 )根帐户用户的所有主体,包括IAM用户,该帐户中的假定角色会话和联盟用户。 而且由于根用户始终对所有资源具有明确的“允许所有操作”,因此根用户的基于身份的许可权会赋予其实际的“允许”,因此根用户将有权访问该存储桶。

之所以可行,是因为您帐户中使用的呼叫者身份始终同时具有多个主体,IAM正在评估它们的策略声明:

  1. 帐户负责人arn:aws:iam::<your-account-number>:root
  2. 用户,承担的角色或联合用户主体

对于显式Allow,如果您仅在策略声明的Principal规则中使用根帐户主体,则该帐户中的 any 用户将匹配允许和将被授予访问权限,因为帐户主体始终是该帐户中用户主体列表的一部分。

但是,在DenyNotPrincipal的情况下,情况有所不同。在这里,NotPrincipal的列表必须将呼叫者身份的所有主体列入白名单,以免被拒绝。

此事实在AWS文档中有关NotPrincipalhttps://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html

的内容中有所体现。

将NotPrincipal与Deny一起使用时,还必须指定帐户 未拒绝的主体的ARN。否则,该政策可能会拒绝 访问包含委托人的整个帐户。取决于 您包含在策略中的服务,AWS可能会验证 帐户,然后是用户。如果是假定的角色用户( 正在使用角色),AWS可能会验证该帐户 首先是角色,然后是角色用户。

答案 1 :(得分:0)

"AWS": "root"

应更改为

"AWS": "arn:aws:iam::<your-account-number>:root"

答案 2 :(得分:-1)

就像httpdigest在此答案中所说,root用户始终对所有资源都具有明确的“允许所有操作”。

所以我阻止了对所有其他状况不佳的用户的所有权限。而且root用户始终具有访问权限。

{
    "Version": "2012-10-17",
    "Statement": [            
        {
            "Sid": "Block all user not in condition, but the root has permission",
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucket/*",
                "arn:aws:s3:::bucket"
            ],
              "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "175.222.100.192"
                },
                "StringNotEquals": {
                    "aws:username": "user1"
                }
            }
        }
    ]
}