【问题标题】:AWS S3 Bucket Policy with NotPrincipal denying access使用 NotPrincipal 拒绝访问的 AWS S3 存储桶策略
【发布时间】:2022-02-28 12:04:44
【问题描述】:

我已使用如下所示的存储桶策略配置了我的 S3 存储桶

{
    "Version": "2012-10-17",
    "Id": "Policy100000000000",
    "Statement": [
        {
            "Sid": "Stmt1463490591045",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucketname/*"
        },
        {
            "Sid": "Stmt1463490591012",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::012345678900:user/user1",
                    "arn:aws:iam::012345678900:user/user2"
                ]
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::bucketname"
        },
        {
            "Sid": "Stmt1463490660089",
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": [
                    "arn:aws:iam::012345678900:user/user1",
                    "arn:aws:iam::012345678900:user/user2"
                ]
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucketname/*.xml"
        }
    ]
}

目标是只允许选定用户访问存储桶根目录中的 xml 文件。该规则似乎不起作用,因为我的访问被拒绝

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>DE3DB1FF18B53997</RequestId><HostId>Iy+RnfkFKygJWkSTI0dXjssFsGFP2MydZZi/R5KBw5M8mZnfClt6HMOKJvAwy7sJgSx9BJQ3DbN=</HostId></Error>

我尝试使用 AWS Node.js 和 Python 开发工具包以及 aws-cli 获取 xml 文件。我不断收到相同的访问被拒绝消息。

有关存储桶策略的 AWS 文档非常分散,并没有为我提供问题的解决方案。几乎没有关于在政策中使用 notPrincipal 的文档。

ListBucket 权限可以正常工作,这意味着问题是特定于规则的,而不是目标用户。

【问题讨论】:

  • 我猜user1被阻止是因为它不是user2,而user2被阻止是因为它不是user1。不知道如何解决
  • 这似乎不是这样。我尝试从权限中删除其中一位用户,但无法获得另一位用户的访问权限。这个AWS security blog post 也有一个在notPrincipal 规则中列出多个用户的示例。
  • 将此 ""Resource": "arn:aws:s3:::bucketname/*.xml"" 更改为 "Resource": "arn:aws:s3:::bucketname/*" 和那就试试
  • 我是否看到来自不同 AWS 账户访问 S3 存储桶的用户权限?我们不需要像这篇 AWS Blog 文章中提到的那样为此使用跨账户 IAM 角色吗?

标签: amazon-web-services amazon-s3


【解决方案1】:

目标是只允许选定用户访问存储桶根目录中的 xml 文件

根据当前文档,s3 不支持每个后缀/文件类型的文件列表资源。它仅支持带前缀,因此您需要在末尾添加一个不带.xml 的星号(允许访问文件夹层的所有对象),然后如果您允许访问该文件,您可以为您的应用程序实现逻辑与否。

对于存储桶策略,默认情况下,只要 IAM 策略有权执行此操作,s3 策略就会从账户(创建存储桶的位置)授予用户访问权限。这是从 ACL(访问控制列表)定义的,请转到 S3 > Permission > Access Control List 进行检查。[AWS S3 ACL docs]。因此,语句中可能不需要前 2 个语句。对于最后一条语句,这可能有效,但需要一个额外的假定角色 ARN,该 ARN 将根据为角色会话名称定义的内容而有所不同。

建议不要使用NotPrincipal,而是在语句中使用Condition 键。将roleId 作为userId 放在StringNotLike 语句中以忽略特定roleId 的拒绝语句。还包括userId 中的帐号。示例如下。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::MyExampleBucket",
        "arn:aws:s3:::MyExampleBucket/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "ROLE_ID_HERE:*",
            "ACCOUNT_NUMBER_HERE"
          ]
        }
      }
    }
  ]
}

查看此 AWS 博客了解更多信息: https://aws.amazon.com/blogs/security/how-to-restrict-amazon-s3-bucket-access-to-a-specific-iam-role/

【讨论】:

    【解决方案2】:

    您的最后一个拒绝策略根本没有讨论对主体 user1 或 user2 的请求应该发生什么(允许或拒绝)。当您以 user1 或 user2 的身份发送 s3 请求时,存储桶策略不会产生任何影响(因为它没有任何规则与给定操作和给定资源的主体 user1 或 user2 匹配)。

    The goal is to allow access to xml files in the bucket root to the selected users only
    

    在这种情况下,您可以提及明确允许这些用户访问您的 xml 文件的规则。

    {
                "Sid": "Stmt1463490660089",
                "Effect": "Allow",
                "Principal": {
                    "AWS": [
                        "arn:aws:iam::012345678900:user/user1",
                        "arn:aws:iam::012345678900:user/user2"
                    ]
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::bucketname/*.xml"
            }
    

    【讨论】:

      猜你喜欢
      • 2018-01-10
      • 2019-10-05
      • 2019-04-28
      • 1970-01-01
      • 2017-02-14
      • 2021-09-03
      • 2021-03-28
      • 2019-04-20
      • 1970-01-01
      相关资源
      最近更新 更多