【发布时间】: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