【问题标题】:AWS CLI s3 copy fails with 403 error, trying to administrate a user-uploaded objectAWS CLI s3 复制失败并出现 403 错误,尝试管理用户上传的对象
【发布时间】:2019-06-25 04:32:05
【问题描述】:

尝试将文件从 S3 存储桶复制到我的本地计算机:

aws s3 cp s3://my-bucket-name/audio-0b7ea3d0-13ab-4c7c-ac66-1bec2e572c14.wav ./

fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden 

我已经确认的事情:

  • 我正在使用版本aws-cli/1.11.13 Python/3.5.2 Linux/4.4.0-75-generic botocore/1.4.70
  • S3 对象键是正确的。我直接从 S3 Web 界面复制了它。
  • AWS CLI 配置有有效凭证。我生成了一个新的密钥/秘密对。在重新配置 aws cli 之前,我删除了 ~/.aws 文件夹。 IAM 网络界面在线确认 arn 指定的用户实际上是通过 CLI 使用 S3。
  • 根据this SO post,IAM 用户被授予 S3 完全访问托管策略。我删除了所有这些用户的策略,然后只添加了名为 AdministratorAccess 的 AWS 托管策略,其中包括“S3、完全访问权限、所有资源”。 是否有其他方式通过 CLI 授予访问权限?我不相信。

存储桶策略旨在授予广泛的开放访问权限:

    {
        "Sid": "AdminAccess",
        "Effect": "Allow",
        "Principal": "*",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::my-bucket-name",
            "arn:aws:s3:::my-bucket-name/*"
        ]
    }

我是如何上传这个对象的?

我使用 AWS Signature v4 签名上传策略从客户端浏览器中的 Web 应用程序将该对象直接上传到 AWS。

【问题讨论】:

  • 您的存储桶在哪个区域?在 ARN 中添加区域详细信息怎么样?
  • 你能发布调试输出aws --debug s3 cp s3://my-bucket-name/audio-0b7ea3d0-13ab-4c7c-ac66-1bec2e572c14.wav ./
  • @Ravi 使用 --debug 标志运行并没有产生超出原始 403 的任何内容

标签: amazon-web-services amazon-s3 aws-cli


【解决方案1】:

事实证明,查看对象属性,我可以看到 OBJECT 的所有者是“匿名”,并且“匿名”用户拥有该对象的完全权限。

我相信这就是我无法访问此对象的原因(我已通过身份验证)。示例:由于“匿名”用户拥有完全权限,我可以使用 Web 浏览器通过 GET 访问。这是按设计运行的。 S3 存储桶用于上传文件,然后可供公众使用。

因此,当使用上传策略发布文件时,生成的所有者为“匿名”。

在这种情况下,上传对象时应使用acl=bucket-owner-full-control,以便存储桶所有者可以控制该对象。 这样做,所有者仍然是“匿名的”,但是,它会给存储桶所有者(我)完整的权限,之后我应该能够通过 AWS CLI 访问该对象。

请注意,acl=ec2-bundle-read 是默认值,实际上是硬编码到最新的 AWS 开发工具包中。见https://github.com/aws/aws-sdk-java/blob/7844c64cf248aed889811bf2e871ad6b276a89ca/aws-java-sdk-ec2/src/main/java/com/amazonaws/services/ec2/util/S3UploadPolicy.java#L77

有必要将 S3UploadPolicy.java 复制到我自己的代码库中(事实证明,这是一个完全可移植的小实用程序类)并对其进行修改以使用 acl=bucket-owner-full-control。而且我已经证实,这可以通过 AWS CLI 管理上传的对象。

【讨论】:

  • 修改上传策略 java 文件是解决此问题的一种复杂方法。我通过命令行给出了 3 种其他方法,我在下面的链接答案...
【解决方案2】:

就我而言,我有 3 个帐户(A1A2A3)和 3 个规范用户(canonical_user_account_A1canonical_user_account_A2canonical_user_account_A3)和 1 个 IAM 角色(R1)在A3

文件位于A2 的存储桶中,文件所有者为canonical_user_account_A1这是故意的)。当我尝试列出文件时,我没有收到任何错误,但是当我尝试下载其中一个时,我得到了

fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden

我在存储桶策略和角色权限中为R1 添加了ListGet 权限,在这种情况下,这还不够,如果帐户不是存储桶的所有者,它可以t 允许来自其他帐户的用户到get(下载)文件。所以我需要确保当我上传文件时我正在使用:

    access_control_policy = {
    'Grants': [
        {
            'Grantee': {
                'ID': canonical_user_account_A2,
                'Type': 'CanonicalUser'
            },
            'Permission': 'READ'
        },
        {
            'Grantee': {
                'ID': canonical_user_account_A3,
                'Type': 'CanonicalUser'
            },
            'Permission': 'READ'
        },
    ],
    'Owner': {
        'ID': canonical_user_account_A1
    }
}

upload_extra_args = {'ACL': 'bucket-owner-full-control'}

s3_client.upload_file(file_path, bucket_name, s3_file_path, ExtraArgs=upload_extra_args)

s3_client.put_object_acl(AccessControlPolicy=access_control_policy, Bucket=bucket_name, Key=s3_file_path)

这允许canonical_user_account_A2canonical_user_account_A3 读取和下载文件。

【讨论】:

    【解决方案3】:

    我在尝试从 s3 下载我之前上传的内容时遇到了类似的权限问题。事实证明,它与 bucket 策略无关,而是与上传时如何设置凭据以及在上传时如何授予访问权限有关。有关解决问题的几种方法的更多信息,请参阅this

    【讨论】:

      【解决方案4】:

      即使出于安全原因文件不存在,AWS S3 也会返回 Forbidden(403)。 请确保您在下载时提供了正确的 s3 路径。

      您可以阅读更多关于它的信息here

      【讨论】:

      • 我已确认 S3 对象密钥。我怀疑 IAM 策略的复杂性,每个 this SO post 但是我很困惑为什么我授予该用户的策略不允许通过 aws cli 访问存储桶
      • 您能否从您的策略“arn:aws:s3:::my-bucket-name”中删除此权限,然后重试
      • 我做了您建议的更改,等待 1 分钟,重试操作。还是一样的结果。目前,我同时保留了"arn:aws:s3:::my-bucket-name""arn:aws:s3:::my-bucket-name/*",因为我已经看到是其他情况下的灵丹妙药。
      • 仅供参考,如果您同时使用 IAM 策略和 S3 存储桶策略,最终授权是所有权限的最低权限联合。
      【解决方案5】:

      在我的情况下,当尝试联系 S3 的机器的系统时间远离当前时间时,就会出现上述错误。设置正确的时间会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-27
        • 2019-01-23
        • 2020-10-01
        • 1970-01-01
        • 2017-02-17
        • 2019-12-10
        • 2022-08-16
        • 1970-01-01
        相关资源
        最近更新 更多