【问题标题】:How do you allow granting public read access to objects uploaded to AWS S3?您如何允许授予对上传到 AWS S3 的对象的公共读取访问权限?
【发布时间】:2020-06-06 10:40:39
【问题描述】:

我创建了一个策略,允许访问我账户中的单个 S3 存储桶。然后,我创建了一个只有此策略的组和一个属于该组的用户。

用户可以按预期查看、删除和上传文件到存储桶。但是,用户似乎无法授予对上传文件的公共读取权限

选择授予对此对象的公共读取权限选项时,上传失败。

存储桶正在托管一个静态网站,我想允许前端开发人员上传文件并将其公开。

用户角色的政策如下:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": "arn:aws:s3:::my-bucket"
    },
    {
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}

当 IAM 用户尝试授予对上传文件的公共访问权限时,会发生以下情况:

代理错误似乎无关紧要,但实际上上传卡住了,没有任何反应。如果他们没有选择授予公共访问权限选项,则上传会立即完成(尽管也会出现代理错误)。

【问题讨论】:

  • 检查存储桶的Public Access Settings。您可能启用了一个或多个选项。
  • 当您说“用户似乎无法授予对上传文件的公共读取权限。”,他们在做什么以及会发生什么?有错误信息吗?请提供更多信息。
  • @JohnRotenstein 感谢您的评论。我编辑了帖子以提供更多信息。让我知道这是否有助于澄清我的情况。
  • @j-petty 我关闭了所有这些选项(因此基本上公共访问不会被阻止)。我还有一个存储桶策略,允许每个人使用s3:GetObject,用于该特定存储桶中的项目。
  • 我尝试重现您的情况(见下文)表明上述策略不足以使用 Amazon S3 管理控制台导航到存储桶。您的 IAM 用户如何访问控制台中的存储桶? (他们是否使用了将他们直接带到存储桶的 URL?)

标签: amazon-web-services amazon-s3 amazon-iam public policy


【解决方案1】:

我发现当 ListAllMyBuckets 未授予 all 时,从控制台执行某些操作(如重命名对象)会失败(但会从 CLI 成功!) > s3 资源。将以下内容添加到 IAM 政策解决了该问题:

 {
      "Sid": "AccessS3Console",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::*"
    }

我测试的一些操作在控制台失败但从 CLI 成功:

  • 重命名对象。控制台显示“错误 - 无法将文件重命名为”。 解决方法:删除并使用新名称重新上传对象。
  • 使用“授予对此对象的公共读取访问权限”上传对象。控制台的状态栏显示操作卡在“进行中”。 解决方法:在不授予公共读取权限的情况下上传对象,然后右键单击它并选择“公开”。

按照此处的说明操作后,我遇到了这些问题 https://aws.amazon.com/premiumsupport/knowledge-center/s3-console-access-certain-bucket/ 描述了如何限制对单个存储桶的访问(并防止查看帐户中存储桶的完整列表)。该帖子没有提及警告。

将用户的 Amazon S3 控制台访问限制为仅对特定存储桶或 文件夹(前缀),在用户的 AWS Identity 中更改以下内容并 访问管理 (IAM) 权限:

  1. 删除对 s3:ListAllMyBuckets 操作的权限。
  2. 仅为您希望用户访问的存储桶或文件夹添加 s3:ListBucket 权限。 注意:要允许用户从存储桶或文件夹上传和下载对象,您还必须包括 s3:PutObject 和 s3:GetObject。

警告:更改这些权限后,用户将获得访问权限 他们访问主 Amazon S3 控制台时出现拒绝错误。用户 必须使用指向存储桶的直接控制台链接访问存储桶,或者 文件夹。

【讨论】:

    【解决方案2】:

    您可以通过 AWS CLI 更新对象的 ACL 来完成

    选项 1: 已存储在 Amazon S3 上的对象,您可以运行此命令来更新 ACL 以进行公共读取访问:

    aws s3api put-object-acl --bucket <<S3 Bucket Name>> --key <<object>> --acl public-read
    

    选项 2: 运行此命令以将对象的完全控制权授予 AWS 账户所有者,并向其他所有人授予读取权限

    aws s3api put-object-acl --bucket <<S3 Bucket Name>> --key <<object>> --grant-full-control emailaddress=<<Accountowneremail@emaildomain.com>> --grant-read uri=http://acs.amazonaws.com/groups/global/AllUsers
    

    【讨论】:

      【解决方案3】:

      为了重现您的情况,我做了以下操作:

      • 使用默认设置创建了一个新的 Amazon S3 存储桶(阻止公共访问 = 开启)
      • 创建了一个 IAM 用户(未附加任何策略)
      • 创建了一个 IAM 组(未附加任何政策)
      • 将 IAM 用户添加到 IAM 组
      • 将您的策略​​(来自问题)作为内联策略附加到 IAM 组(更新存储桶名称)
      • 以新的 IAM 用户身份登录到 Amazon S3 管理控制台

      此时,用户收到Access Denied 错误,因为他们无权列出所有 Amazon S3 存储桶。因此,控制台无法使用。

      相反,我运行了这个 AWS CLI 命令:

      aws s3 cp foo.txt s3://new-bucket/ --acl public-read
      

      结果是:

      调用PutObject操作时发生错误(AccessDenied):访问被拒绝

      但是,操作成功了:

      aws s3 cp foo.txt s3://new-bucket/
      

      这意味着--acl 是被拒绝的组件。

      然后,我为存储桶转到阻止公共访问,并关闭名为“阻止对通过新访问控制列表 (ACL) 授予的存储桶和对象的公共访问”的选项。我的设置是:

      然后我再次运行此命令:

      aws s3 cp foo.txt s3://new-bucket/ --acl public-read
      

      成功了!

      为了验证这一点,我回到了阻止公共访问并打开了所有选项(通过顶部的复选框)。我重新运行该命令,它再次拒绝访问确认原因是阻止公共访问设置

      底线:关闭第一个阻止公共访问设置。

      【讨论】:

      • 嗯,奇怪,我已经关闭了所有这些设置。不过,我会尝试命令行,看看我是否能获得更多的洞察力。谢谢。
      猜你喜欢
      • 2019-03-13
      • 2020-09-27
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      相关资源
      最近更新 更多