即使使用存储桶 and/or 用户策略,AWS s3 存储桶上的访问也被拒绝
Access denied on AWS s3 bucket even with bucket and/or user policy
我已经尝试了几乎所有可能的存储桶策略。还尝试向用户添加策略,但每次我尝试使用 AWS 控制台从 s3 存储桶下载对象时,我都会收到访问被拒绝的消息。
存储桶策略:
{
"Version": "2012-10-17",
"Id": "MyPolicy",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::12345678901011:user/my-username"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
},
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"XX.XXX.XXX.XXX/24",
"XXX.XXX.XXX.XXX/24"
]
}
}
}
]
}
这不起作用,所以我尝试向我的用户名添加 策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "StmtXXXXXXXXXX",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
}
]
}
尽管听起来很奇怪,但可以将拥有存储桶的帐户无法访问的对象上传到 Amazon S3。
将对象上传到 Amazon S3 (PutObject
) 时,可以指定访问控制列表 (ACL)。可能的值为:
- 私有
- public-阅读
- public-读写
- 已验证读取
- aws-exec-读取
- bucket-owner-read
- bucket-owner-full-control
您通常应该使用 bucket-owner-full-control
ACL 上传对象。这允许存储桶的所有者访问对象和控制对象的权限(例如删除它)。
如果未提供此权限,则他们无法访问或修改该对象。
我知道这与您认为存储桶的工作方式相矛盾,但这是真的!
如何解决:
- 使用
bucket-owner-full-control
ACL 或 重新上传对象
- 原始上传者可以遍历对象并使用新的 ACL 就地
CopyObject
。这会更改权限而无需重新上传。
更新: 2021 年 11 月,发布了一项新功能:Amazon S3 Object Ownership can now disable access control lists to simplify access management for data in S3。这避免了指定对象所有权的需要并修复了对象所有权的大多数问题。
您可以使用以下方法解决它:http://docs.aws.amazon.com/cli/latest/reference/s3api/put-object-acl.html
put-object-acl : 这必须由原始上传者完成。
但绝对比再次复制数据快。
我有 TB 的数据要处理。
aws s3api put-bucket-acl --bucket $foldername --key $i --grant-full-control uri=http://acs.amazonaws.com/groups/global/AllUsers
我已经尝试了几乎所有可能的存储桶策略。还尝试向用户添加策略,但每次我尝试使用 AWS 控制台从 s3 存储桶下载对象时,我都会收到访问被拒绝的消息。
存储桶策略:
{
"Version": "2012-10-17",
"Id": "MyPolicy",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::12345678901011:user/my-username"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
},
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"XX.XXX.XXX.XXX/24",
"XXX.XXX.XXX.XXX/24"
]
}
}
}
]
}
这不起作用,所以我尝试向我的用户名添加 策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "StmtXXXXXXXXXX",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
}
]
}
尽管听起来很奇怪,但可以将拥有存储桶的帐户无法访问的对象上传到 Amazon S3。
将对象上传到 Amazon S3 (PutObject
) 时,可以指定访问控制列表 (ACL)。可能的值为:
- 私有
- public-阅读
- public-读写
- 已验证读取
- aws-exec-读取
- bucket-owner-read
- bucket-owner-full-control
您通常应该使用 bucket-owner-full-control
ACL 上传对象。这允许存储桶的所有者访问对象和控制对象的权限(例如删除它)。
如果未提供此权限,则他们无法访问或修改该对象。
我知道这与您认为存储桶的工作方式相矛盾,但这是真的!
如何解决:
- 使用
bucket-owner-full-control
ACL 或 重新上传对象
- 原始上传者可以遍历对象并使用新的 ACL 就地
CopyObject
。这会更改权限而无需重新上传。
更新: 2021 年 11 月,发布了一项新功能:Amazon S3 Object Ownership can now disable access control lists to simplify access management for data in S3。这避免了指定对象所有权的需要并修复了对象所有权的大多数问题。
您可以使用以下方法解决它:http://docs.aws.amazon.com/cli/latest/reference/s3api/put-object-acl.html
put-object-acl : 这必须由原始上传者完成。
但绝对比再次复制数据快。
我有 TB 的数据要处理。
aws s3api put-bucket-acl --bucket $foldername --key $i --grant-full-control uri=http://acs.amazonaws.com/groups/global/AllUsers