【问题标题】:How can I assign bucket-owner-full-control when creating an S3 object with boto3?使用 boto3 创建 S3 对象时,如何分配 bucket-owner-full-control?
【发布时间】:2020-08-19 23:31:05
【问题描述】:

我在 Python 中使用 Amazon boto3 库将文件上传到另一个用户存储桶。应用于其他用户存储桶的存储桶策略是这样配置的

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DelegateS3BucketList",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::uuu"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::bbb"
        },
        {
            "Sid": "DelegateS3ObjectUpload",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::uuu"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::bbb",
                "arn:aws:s3:::bbb/*"
            ]
        }
    ]
}

uuu 是我的用户 ID,bbb 是属于其他用户的存储桶名称。 我的用户和其他用户是属于不同组织的 IAM 帐户。 (我知道这个策略可以写得更简单,但目的是在没有创建适当权限的情况下添加对上传的检查以阻止对象)。

然后我可以使用以下代码列出存储桶中的所有对象,并将新对象上传到存储桶。这可行,但是由于亚马逊默认将对象设为对象创建者的私有对象,因此存储桶的所有者无权访问该对象

import base64
import hashlib
from boto3.session import Session


access_key = "value generated by Amazon"
secret_key = "value generated by Amazon"
bucketname = "bbb"

content_bytes = b"hello world!"
content_md5 = base64.b64encode(hashlib.md5(content_bytes).digest()).decode("utf-8")
filename = "foo.txt"

sess = Session(aws_access_key_id=access_key, aws_secret_access_key=secret_key)

bucket = sess.resource("s3").Bucket(bucketname)
for o in bucket.objects.all():
    print(o)

s3 = sess.client("s3")
s3.put_object(
    Bucket=bucketname,
    Key=filename,
    Body=content_bytes,
    ContentMD5=content_md5,
    # ACL="bucket-owner-full-control"  # Uncomment this line to generate error
)

只要我取消注释 ACL 选项,代码就会生成拒绝访问错误消息。如果我将其重定向到我自己组织内的存储桶,则 ACL 选项会成功,并且存储桶的所有者将获得对该对象的完全权限。

我现在不知所措,尤其是亚马逊自己的建议似乎是按照我展示的方式去做。

https://aws.amazon.com/premiumsupport/knowledge-center/s3-bucket-owner-access/

https://aws.amazon.com/premiumsupport/knowledge-center/s3-require-object-ownership/

【问题讨论】:

  • 检查您的用户(或角色)是否在 IAM 中缺少 s3:PutObjectAcl 权限,而不仅仅是存储桶策略。
  • 谢谢,Oleksii,这确实是我缺少的额外部分!以这种方式定义权限非常令人沮丧
  • 我会把它作为答案发布,所以也许其他人会在 google 中找到它,很高兴我提供了帮助
  • 我建议您使用 aws s3api get-object-acl --bucket --key 查看相关对象的 ACL --profile 其中 test-profile 是您尝试使用的,用于访问对象。然后您可以手动使用: aws s3api put-object-acl --bucket --key --acl bucket-owner-full-access --profile 根据需要提供访问权限,请注意使用的配置文件必须拥有足够的访问权限!

标签: python-3.x amazon-web-services amazon-s3 boto3 amazon-iam


【解决方案1】:

仅在存储桶策略中拥有权限是不够的。

检查您的用户(或角色)是否在 IAM 中缺少 s3:PutObjectAcl 权限。

【讨论】:

    【解决方案2】:

    在 boto3 中使用 resource 方法时,可能会进行多个不同的 API 调用,并且并不总是很明显正在进行哪些调用。

    相比之下,当在 boto3 中使用 client 方法时,在 boto3 中进行的 API 调用与 AWS 接收到的 API 调用之间存在一对一的映射。

    因此,resource.put_object() 方法很可能正在调用其他 API,例如 PutObjectAcl。您可以通过查看 AWS CloudTrail 并查看您的应用程序发出了哪些 API 调用来确认这一点。

    在这种情况下,您需要额外的s3:PutObjectAcl 权限。如果上传过程首先创建对象,然后更新对象的访问控制列表,则需要这样做。

    当使用client 方法上传文件时,还可以指定一个ACL,我认为它可以直接应用,而不需要第二次API 调用。因此,使用client 方法创建对象可能不需要需要这个额外的权限。

    【讨论】:

    • 抱歉,我正在使用 client.put_object 方法,而此方法的 ACL 参数失败了。 Oleksii 的评论实际上为我解决了这个问题。以这种方式设置安全性有点令人沮丧,必须将相同的设置放置在多个位置才能工作
    猜你喜欢
    • 2019-10-27
    • 1970-01-01
    • 2020-07-01
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2018-12-14
    • 2015-09-14
    相关资源
    最近更新 更多