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

Leo*_*nha 4 amazon-s3 amazon-web-services 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"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

或者添加一个类似的条件

"Condition": {
    "StringEquals" : {"aws:username" : "rootUser"} 
}
Run Code Online (Sandbox Code Playgroud)

Kai*_*ack 8

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"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

这将显式拒绝所有不是(且不仅仅是)根账户用户的委托人包括 IAM 用户、代入角色会话和该账户中的联合用户。由于 root 用户始终对所有资源的所有操作具有显式允许,因此实际的允许是由 root 用户基于身份的权限给出的,因此 root 用户将有权访问该存储桶。

这样做的原因是,在您的账户中工作的调用者身份始终同时具有多个委托人,IAM 正在对这些委托人进行评估以获得策略声明:

  1. 账户本金arn:aws:iam::<your-account-number>:root
  2. 用户、承担的角色或联合用户主体

在显式情况下,如果您仅在策略声明的规则中Allow使用根帐户主体,则该帐户中的任何用户都将匹配允许并将获得访问权限,因为帐户主体始终是用户主体列表的一部分在该帐户中。Principal

Deny然而,在 a与 a的情况下NotPrincipal,情况有点不同。NotPrincipal这里, s列表必须将调用者身份的所有主体列入白名单,才不会被拒绝。

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

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