我有一个非常基本的目标:将我的存储桶的所有内容分享到特定用户列表,只读。这曾经使用一个名为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”,则另一个用户无法读取我的存储桶内容。
我该怎么办?
答案 0 :(得分:6)
我怀疑策略编辑器在运行在存储桶上的操作时变得更聪明,而不是在存储桶中 。
此外,ListObjects
似乎让人感到不安,所以请不要这样做。
此策略允许列出存储桶的内容和检索的对象:
{
"Id": "Policy1",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
],
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/user-name"
}
}
]
}
ListBucket
在Bucket上运作。
GetObject
对存储桶的内容进行操作。
它可以写成策略中的两个单独的语句(一个在存储桶上,一个在存储桶的内容上),但通常更容易按上面的方式编写它。
答案 1 :(得分:2)
granting bucket access to a user in another account分为两部分。
这似乎是多余的,但两者都是必需的。
此外,ListObjects
操作是欺骗性的,尤其是awspolicygen tool也将其列为权限。但是,在documentation about S3 permissions中,您会发现ListObjects
实际上是由ListBucket
权限控制的操作。
在您提供的第二个示例中,我怀疑您不成功的原因是因为请求用户可能没有您的存储区的ListBucket
权限。此外,我确实认为您的方案并不严格要求GetBucketLocation
,但是如果您希望他们从存储桶中获取项目,则需要授予GetObject
权限。