AWS S3 存储桶策略显式拒绝
AWS S3 Bucket Policy Explicit Deny
我试图限制我的存储桶拒绝所有内容,但允许来自一个特定 IAM 用户的上传并根据 referer
header 获得 objects。这是我的政策:
{
"Version": "2012-10-17",
"Id": "Meteor refer policy",
"Statement": [
{
"Sid": "allow upload",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::556754141176:user/username"
},
"Action": "s3:PutObject*",
"Resource": [
"arn:aws:s3:::bucketname",
"arn:aws:s3:::bucketname/*"
]
},
{
"Sid": "Allow get",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "bucketname/*",
"Condition": {
"StringLike": {
"aws:Referer": [
"http://myapp.com*",
"http://localhost*"
]
}
}
},
{
"Sid": "Explicit deny",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "bucketname/*",
"Condition": {
"StringNotLike": {
"aws:Referer": [
"http://myapp.com*",
"http://localhost*"
]
}
}
}
]
}
此政策正确地将 GetObject 指令强制执行到引用 header,但我无法像我所说的那样上传与该用户的任何内容。如果我取消显式拒绝,我可以从任何地方访问 object 而 referer 并不重要。我的政策有什么问题?此外,我无法从控制台访问存储桶中的任何内容。我需要为此做什么?
谢谢,
默认情况下,Amazon S3 存储桶中的所有内容都是私有的。因此,只需添加对应该允许的用户的访问权限。
此外,仅授予 PutObject
将只允许 API 调用, 将不允许通过 AWS 管理控制台 进行访问,这需要像 ListAllMyBuckets
。因此,请确保上传用户具有必要的权限,或者仅使用允许的 API 调用。
因此:
- 删除拒绝政策——不需要
- 在
GetObject
策略中,您还应该删除 "Resource": "bucketname/*",
因为存储桶策略适用于它所附加的存储桶这一事实是明确的
- 让上传用户使用AWS Command-Line Interface (CLI)或网页上传,只需要
PutObject
或授予额外权限即可使用适用于 Amazon S3 的 AWS 管理控制台(如下所示)
这是一组权限,可以在 Amazon S3 管理控制台中授予上传访问权限(感谢 Is there an S3 policy for limiting access to only see/access one bucket?):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucketname"
]
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
}
]
}
我试图限制我的存储桶拒绝所有内容,但允许来自一个特定 IAM 用户的上传并根据 referer
header 获得 objects。这是我的政策:
{
"Version": "2012-10-17",
"Id": "Meteor refer policy",
"Statement": [
{
"Sid": "allow upload",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::556754141176:user/username"
},
"Action": "s3:PutObject*",
"Resource": [
"arn:aws:s3:::bucketname",
"arn:aws:s3:::bucketname/*"
]
},
{
"Sid": "Allow get",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "bucketname/*",
"Condition": {
"StringLike": {
"aws:Referer": [
"http://myapp.com*",
"http://localhost*"
]
}
}
},
{
"Sid": "Explicit deny",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "bucketname/*",
"Condition": {
"StringNotLike": {
"aws:Referer": [
"http://myapp.com*",
"http://localhost*"
]
}
}
}
]
}
此政策正确地将 GetObject 指令强制执行到引用 header,但我无法像我所说的那样上传与该用户的任何内容。如果我取消显式拒绝,我可以从任何地方访问 object 而 referer 并不重要。我的政策有什么问题?此外,我无法从控制台访问存储桶中的任何内容。我需要为此做什么?
谢谢,
默认情况下,Amazon S3 存储桶中的所有内容都是私有的。因此,只需添加对应该允许的用户的访问权限。
此外,仅授予 PutObject
将只允许 API 调用, 将不允许通过 AWS 管理控制台 进行访问,这需要像 ListAllMyBuckets
。因此,请确保上传用户具有必要的权限,或者仅使用允许的 API 调用。
因此:
- 删除拒绝政策——不需要
- 在
GetObject
策略中,您还应该删除"Resource": "bucketname/*",
因为存储桶策略适用于它所附加的存储桶这一事实是明确的 - 让上传用户使用AWS Command-Line Interface (CLI)或网页上传,只需要
PutObject
或授予额外权限即可使用适用于 Amazon S3 的 AWS 管理控制台(如下所示)
这是一组权限,可以在 Amazon S3 管理控制台中授予上传访问权限(感谢 Is there an S3 policy for limiting access to only see/access one bucket?):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucketname"
]
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
}
]
}