gpt4 book ai didi

amazon-web-services - 当对象 acl 为公共(public)时,如何将 S3 存储桶策略设置为(大部分)私有(private)?

转载 作者:行者123 更新时间:2023-12-04 08:06:18 25 4
gpt4 key购买 nike

我不知道如何设置我的存储桶策略来实现我想要的。任何帮助将非常感激!我想要的规则是:

  • 我帐户中的用户可以通过用户策略访问,因此不需要专门授予他们访问权限
  • 匿名用户(或我的 AWS 账户之外的任何人)应该没有访问权限,除了:
  • 一个文件夹/temp_public 应该有一个公共(public) GetObject(即,如果您知道 URL,您可以获取文件)
  • 这些策略应覆盖存储桶中文件的对象 ACL,因为对象 ACL 有时设置为公共(public)读取。

  • 创建存储桶策略的原因是存储桶中的许多对象都有公共(public)读取 ACL(文件上传时无意设置,但将来也可能发生,所以我想用存储桶 ACL 覆盖对象 ACL)。

    忽略 temp_public 文件夹,我希望我可以这样做:
    {
    "Version": "2008-10-17",
    "Id": "Policy123456789",
    "Statement": [
    {
    "Sid": "Stmt1",
    "Effect": "Deny",
    "NotPrincipal": {
    "AWS": "arn:aws:iam::123456789012:root"
    },
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::my-bucket-name/*"
    }
    ]
    }

    (其中 123456789012 是我的 AWS 帐号),但我被所有具有该存储桶策略的用户拒绝访问。我猜 NotPrincipal 在这种情况下不起作用?

    感谢您的任何建议!

    罗里

    更新:在 AWS 论坛上交叉发布 here 并回答!

    最佳答案

    非常感谢来自 AWS 论坛的 IP this answer ,我已经确认对我有用:

    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::BucketName/temp_public/*"
    }
    ]
    }

    此语句将授予任何人对 temp_public 文件夹中对象的读取访问权限,而不管这些文件上的 ACL。
    要覆盖所有其他文件的公共(public)访问权限,您应该提供 +Deny+-type 语句。显式拒绝会覆盖任何允许访问,因此您必须排除已授予的权限。所以使用 NotResource 作为排除掩码(尚未最终确定,请阅读下文):
    {
    "Effect": "Deny",
    "Principal": "*",
    "Action": "s3:GetObject",
    "NotResource": "arn:aws:s3:::BucketName/temp_public/*"
    }

    但是,这也会拒绝包括您的帐户在内的所有用户的访问,因为主体设置为“*”。因此,您必须将您的帐户排除在此拒绝之外(仍然不是最终的):
    {
    "Effect": "Deny",
    "NotPrincipal": { "AWS": "arn:aws:iam::XXXXYYYYZZZZ:root" },
    "Action": "s3:GetObject",
    "NotResource": "arn:aws:s3:::BucketName/temp_public/*"
    }

    (其中 XXXXYYYYZZZZ 是您的 12 位 AWS 账户 ID)

    仍然存在问题:上面的语句拒绝访问所有 IAM 用户(根帐户除外)。
    您也想排除所有 IAM 用户,但这很棘手。由于某些原因,Amazon S3 不支持在存储桶策略中指定 IAM 用户的通配符。你不能写 "arn:aws:iam::XXXXYYYYZZZZ:user/*"作为委托(delegate)人(它给出错误:“策略中的委托(delegate)人无效”)。您必须指定确切的用户名:
    {
    "Effect": "Deny",
    "NotPrincipal": {
    "AWS": [
    "arn:aws:iam::XXXXYYYYZZZZ:root",
    "arn:aws:iam::XXXXYYYYZZZZ:user/user1",
    "arn:aws:iam::XXXXYYYYZZZZ:user/user2",
    "arn:aws:iam::XXXXYYYYZZZZ:user/user3",
    "arn:aws:iam::XXXXYYYYZZZZ:user/user4" ]
    }
    "Action": "s3:GetObject",
    "NotResource": "arn:aws:s3:::BucketName/temp_public/*"
    }

    来自 Rory 的 NB:S3 文档建议您可以使用 arn:aws:iam::XXXXYYYYZZZZ:root覆盖帐户中的所有用户,但这似乎不起作用

    所以最终的策略将如下所示:
    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::BucketName/temp_public/*"
    },
    {
    "Effect": "Deny",
    "NotPrincipal": {
    "AWS": [
    "arn:aws:iam::XXXXYYYYZZZZ:root",
    "arn:aws:iam::XXXXYYYYZZZZ:user/user1",
    "arn:aws:iam::XXXXYYYYZZZZ:user/user2",
    "arn:aws:iam::XXXXYYYYZZZZ:user/user3",
    "arn:aws:iam::XXXXYYYYZZZZ:user/user4" ]
    }
    "Action": "s3:GetObject",
    "NotResource": "arn:aws:s3:::BucketName/temp_public/*"
    }
    ]
    }

    关于amazon-web-services - 当对象 acl 为公共(public)时,如何将 S3 存储桶策略设置为(大部分)私有(private)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26106295/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com