我有一个非常基本的目标:将我的存储桶的所有内容分享给特定用户列表,只读 . 这曾经使用一个名为s3cmd的工具 . 我需要做的就是将用户(通过电子邮件识别)添加到具有读取权限的访问控制列表中,他们可以顺利地列出或下载数据 .
但最近,这突然间不再起作用了 . 系统只是拒绝任何访问我的存储桶的尝试 .
然后我开始考虑编辑存储桶策略 . 以下是策略生成器生成的策略草稿(敏感信息是匿名的):
{
"Id": "Policy123456789",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1512705836469",
"Action": [
"s3:GetObject",
"s3:ListBucket",
"s3:ListObjects"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::mybucketname",
"Principal": {
"AWS": [
"arn:aws:iam::anotheruserid:user/admin"
]
}
}
]
}
当我点击“保存”时,我收到“策略有无效操作”错误 . 然后我尝试删除“ListObjects”,以便策略成为
{
"Id": "Policy123456789",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1512705836469",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::mybucketname",
"Principal": {
"AWS": [
"arn:aws:iam::anotheruserid:user/admin"
]
}
}
]
}
并得到另一条错误消息“操作不适用于语句中的任何资源” . 这两个错误对我来说没有意义 . 如果我错了,请纠正我 . 如果我没有朝着正确的方向前进,请帮助我 .
顺便说一句:我试图按照http://docs.aws.amazon.com/AmazonS3/latest/dev/example-walkthroughs-managing-access-example2.html的教程,但没有成功 . 通过使用以下存储桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Example permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::AccountB-ID:root"
},
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::examplebucket"
]
}
]
}
使用AccountB的awscli执行“aws s3 ls s3:// examplebucket”时收到错误消息 . 错误消息是“调用ListObjects操作时发生错误(AccessDenied):访问被拒绝” . 这让我很困惑 . 如果我添加ListObjects,我收到“无效”错误 . 如果我删除“ListObjects”,则另一个用户无法读取我的存储桶内容 .
我该怎么办?
2 回答
我怀疑当涉及到操作 on buckets 而不是 within buckets 的操作时,策略编辑器变得更聪明了 .
此外,
ListObjects
似乎令人不安,所以不要理会 .此策略允许列出存储桶的内容并检索对象:
ListBucket
在Bucket上运行 .GetObject
对存储桶的内容进行操作 .它可以写成策略中的两个单独的语句(一个在存储桶上,一个在存储桶的内容上),但是通常更容易按上面的方式编写它 .
granting bucket access to a user in another account分为两个部分 .
在存储桶上设置正确的策略 .
允许其他帐户中的IAM用户对存储桶执行必要的操作 .
这似乎是多余的,但两者都是必需的 .
此外,
ListObjects
操作是欺骗性的,尤其是awspolicygen tool也将其列为权限 . 但是在documentation about S3 permissions中你会发现ListObjects
实际上是一个由ListBucket
权限控制的操作 .在您提供的第二个示例中,我怀疑您不成功的原因是因为请求用户可能没有您的存储桶的
ListBucket
权限 . 此外,我确实认为GetBucketLocation
并非您的方案严格要求,但是如果您希望它们从存储桶中获取项目,则需要授予GetObject
权限 .