首页 > 解决方案 > 如何使用 IAM 策略 AWS 仅向 S3 存储桶的根账户用户授予访问权限?

问题描述

我想创建一个只有 Root 帐户才能拥有完全访问权限的 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"} 
}

标签: amazon-web-servicesamazon-s3amazon-iam

解决方案


这是Deny带有 a的显式用例的极少数(如果不是唯一的话)用例之一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的规则中使用了 root 帐户主体,则该帐户中的任何用户都将匹配允许并被授予访问权限,因为帐户主体始终是用户主体列表的一部分在那个帐户中。Principal

但是,在 aDeny和 a的情况下NotPrincipal,情况有些不同。在这里,NotPrincipals 的列表必须将调用者身份的所有主体列入白名单,以免被拒绝。

这一事实在 AWS 文档中有所体现NotPrincipalhttps ://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html

当您将 NotPrincipal 与 Deny 结合使用时,您还必须指定未被拒绝的委托人的账户 ARN。否则,该策略可能会拒绝对包含该委托人的整个账户的访问。根据您在策略中包含的服务,AWS 可能会先验证账户,然后再验证用户。如果正在评估假定角色用户(正在使用角色的人),AWS 可能会先验证账户,然后是角色,然后是假定角色用户。


推荐阅读