AWS S3桶权限-访问被拒绝

60

我正在尝试给自己授权以下载S3存储桶中的现有文件。 我已修改了Bucket策略,如下所示:

        {
        "Sid": "someSID",
        "Action": "s3:*",
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::bucketname/AWSLogs/123123123123/*",
        "Principal": {
            "AWS": [
                "arn:aws:iam::123123123123:user/myuid"
            ]
        }
    }

据我理解,对该政策的补充应该赋予我的账户“myuid”对“bucketname”的全部权限,包括已经存在于该存储桶中的所有文件。但是,当我尝试通过控制台中显示的链接下载这些文件时,仍然会收到“访问被拒绝”错误消息。

你有什么想法吗?


你说这样可以给予存储桶完全的权限,但是你的资源包括一个前缀。你下载的所有文件都在这个前缀下吗?此外,你是如何下载它们的?从控制台、应用程序还是使用SDK? - Bob Kinney
请参考以下链接:https://dev59.com/tV8d5IYBdhLWcg3wtz8Q#74747591。 - Harat
12个回答

50

步骤 1

点击您的存储桶名称,在权限选项卡下,确保未选中“阻止新公共存储桶策略”

输入图像描述

步骤 2

然后您可以应用您的存储桶策略 输入图像描述

希望这能有所帮助


3
我只是缺少策略。我添加了像你的那个,现在它可以工作了。我想让我的存储桶公开可见。这是正确的配置吗? - Jamshaid
我忘了在资源的末尾加上“/*”。谢谢! - undefined

22

David,你是对的,但我发现除了bennie下面所说的之外,你还必须授予“已验证的用户”查看(或您想要的任何访问权限)。 enter image description here

但更好的解决方案可能是编辑用户策略,只授予对桶的访问权限:

{
   "Statement": [
    {
      "Sid": "Stmt1350703615347",
      "Action": [
        "s3:*"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::mybucket/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": ["arn:aws:s3:::mybucket"],
      "Condition": {}
    }
  ]
}

第一个块授予所有S3权限给存储桶中的所有元素。第二个块授予存储桶本身的列表权限。


1
假设授予“已认证用户”访问权限实际上意味着任何已认证的AWS用户,即使与您自己的帐户无关...因此它使授予用户访问存储桶的访问权限失去了意义。 - Salami
我知道它的功能,也同意它看起来很奇怪,但是在当时,为了使其正常工作,这是必需的 - Karl Wilbur
1
另一种方法是将策略附加到特定的IAM用户上-在IAM控制台中,选择一个用户,选择“权限”选项卡,单击“附加策略”,然后选择像 AmazonS3FullAccess 这样的策略。由于某些原因,仅仅说一个存储桶授予了用户访问权限是不够的 - 你还必须说明该用户具有访问S3服务的权限。 - sameers
直接应用此代码会抛出“缺少必需的 Principal 字段”错误。答案可能需要更新。 - Greg Wozniak
谢谢,@GregWozniak。我认为这很可能是由于过去8年中AWS配置发生的变化所致。 - Karl Wilbur

10

将资源arn:aws:s3:::bucketname/AWSLogs/123123123123/*更改为arn:aws:s3:::bucketname/*,以获得对bucketname的完全权限。


9

用于在s3中展示网站静态内容:

未勾选阻止公共存储桶

这是存储桶策略:

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

5
在Android中,使用TransferUtility上传任何公开可读表单的文件,请使用以下方法:
transferUtility.upload(String bucketName, String key, File file, CannedAccessControlList cannedAcl)

示例

transferUtility.upload("MY_BUCKET_NAME", "FileName", your_file, CannedAccessControlList.PublicRead);

谢谢,这正是我在这种情况下所需要的。 - Lalit Sharma

3

澄清一下:这并没有很好的记录,但您需要两个访问声明。

除了允许对资源“arn:aws:s3:::bucketname/AWSLogs/123123123123/*”执行操作的声明外,您还需要一个允许ListBucket到“arn:aws:s3:::bucketname”的第二个声明,因为在内部Aws客户端将尝试列出存储桶以确定它是否存在,然后再执行其操作。

有了第二个声明,它应该如下所示:

"Statement": [
    {
        "Sid": "someSID",
        "Action": "ActionThatYouMeantToAllow",
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::bucketname/AWSLogs/123123123123/*",
        "Principal": {
            "AWS": [
                "arn:aws:iam::123123123123:user/myuid"
            ]
    },
    {
        "Sid": "someOtherSID",
        "Action": "ListBucket",
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::bucketname",
        "Principal": {
            "AWS": [
                "arn:aws:iam::123123123123:user/myuid"
            ]
    }
]

注意:如果您正在使用 IAM,则跳过“主体”部分。

3
如果您有一个加密的存储桶,您将需要允许使用kms。

2
可能的原因:如果文件被另一个AWS账户用户放置/复制,则您无法访问该文件,因为文件所有者仍不是您。在您的目录中放置文件的AWS账户用户必须在放置或复制操作期间授予访问权限。
对于放置操作,对象所有者可以运行此命令:
aws s3api put-object --bucket destination_awsexamplebucket --key dir-1/my_images.tar.bz2 --body my_images.tar.bz2 --acl bucket-owner-full-control

对于单个对象的复制操作,对象所有者可以运行以下命令之一:

aws s3api copy-object --bucket destination_awsexammplebucket --key source_awsexamplebucket/myobject --acl bucket-owner-full-control

ref : AWS Link


这正是我的问题所在。是否有一种方法可以上传文件并授予任何人访问权限?我正在使用PowerShell工具命令Write-S3Object上传到S3,我没有向命令提供任何密钥,并且希望对象可被任何人访问。 - Kappacake
1
刚刚找到答案了:我只需要在命令中添加-PublicReadWrite,对象就可以被任何人访问。 - Kappacake

1
给公众添加Bucket策略并不是正确的方法。这将暴露您的Bucket给公众,即使只有短时间。 即使您是管理员访问(根用户不会遇到此问题),您仍将面临此错误。 根据AWS文档,您必须向IAM用户添加“PutBucketPolicy”。 因此,只需像以下屏幕截图中所示,为IAM用户添加S3策略,提及您的Bucket ARN以使其更安全,并且您不必再次使Bucket公开。

enter image description here


这看起来大致正确,但你的解释缺少很多上下文。你能详细解释一下吗? - nicoramirezdev
如果您能告诉我哪个部分您没有理解,我可能会更新答案。但我的意思是将PutBucketPolicy角色附加到存储桶所有者,这将通过IAM提供更多的控制和安全性。 - dev
我建议您解释一下如何到达您截图的位置,特别是对于刚开始使用AWS的人来说,找到这些东西可能会特别困惑。此外,添加您引用的文档将非常有用,因为我们可以检查它是否仍然是最新的。 - nicoramirezdev

1
没有提到MFA。对于已启用MFA的Amazon用户,请使用以下命令:aws s3 ls s3://bucket-name --profile mfa
并通过运行aws sts get-session-token --serial-number arn:aws:iam::123456789012:mfa/user-name --token-code 928371 --duration 129600 准备好mfa配置文件。(替换123456789012,user-name和928371) enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接