我有一组用户:user1和user2。理想情况下,他们应该有权在自己的存储桶中进行读写。
我想给他们控制台访问权限,这样他们就可以通过拖放登录并上传S3中的数据。
所以我希望一个用户能够查看其他用户的bucket。
我使用以下IAM策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::user1_bucket",
"Condition": {}
},
{
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:GetObjectVersionAcl",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectVersionAcl"
],
"Resource": "arn:aws:s3:::user1_bucket/*",
"Condition": {}
}
]
}
但它没有为用户显示任何bucket。用户只能看到访问被拒绝。我试图在政策中添加主体:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::9xxxxxxxxxx:user/user1"},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::user1_bucket"
]
}
]
}
这会产生一个错误。
This policy contains the following error: Has prohibited field Principal For more information about the IAM policy grammar, see AWS IAM Policies
我能做什么?
您的要求似乎是:
- 用户应该能够使用AmazonS3管理控制台访问(查看、上传、下载(他们自己的S3存储桶
- 他们应该不能查看其他bucket的名称,也不能访问这些bucket
带列表桶
第一个要求可以通过这样的策略来满足:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AccessThisBucket",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
},
{
"Sid": "ListAllBucketForS3Console",
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "arn:aws:s3:::*"
}
]
}
这允许他们访问特定的bucket,但也允许他们列出所有bucket名称。这是AmazonS3管理控制台的要求,因为它做的第一件事就是列出所有的bucket。
不列出存储桶
但是,由于您不想让这些用户能够列出所有bucket的名称,因此可以使用这样的策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
}
]
}
这使他们可以完全访问自己的bucket,但不能列出其他bucket的名称。
要在管理控制台中使用它,他们需要使用如下URL直接跳转到他们的bucket:
https://console.aws.amazon.com/s3/buckets/my-bucket
这将允许他们访问和使用他们的铲斗。
他们还可以使用AWS命令行界面(CLI(命令,如:
aws s3 ls s3://my-bucket
aws s3 cp foo.txt s3://my-bucket/foo.txt
底线:要在没有列出所有存储桶的权限的情况下使用管理控制台,他们需要使用直接跳转到存储桶的URL。
有两种方法可以做到这一点。
存储桶策略:您可以通过附加策略来选择谁可以访问和控制所述存储桶。案例示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "bucketAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::AWS-account-ID:user/user-name"
},
"Action": [
"s3:GetObject",
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:GetObjectVersionAcl",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectVersionAcl"
],
"Resource": [
"arn:aws:s3:::examplebucket/*"
]
}
]
}
来源:Bucket策略示例-亚马逊简单存储服务
或者,您可以通过角色策略授予访问权限,我认为这更好。你差点就赢了,但最后你搞砸了。你的政策应该是这样的:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::examplebucket"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::examplebucket/"
}
]
}
来源:用户策略示例-亚马逊简单存储服务
我希望这能有所帮助。