我正在为我的客户端设置一个新的 S3 存储桶以上传到其中。 我只想只允许每个客户端查看自己的文件夹,这样每个客户端就无法分辨我在和谁一起工作。
我可以对其进行设置,以便每个客户端都无法列出或查看任何其他客户端文件夹中的对象,但目前每个客户端都可以列出存储桶中的所有文件夹。
理想情况下,我希望存储桶的顶层包含多个文件夹,例如client-1-folder
、client-2-folder
等。 然后当有人以client-1
身份登录时,他们只能看到client-1-folder
,甚至看不到client-2
文件夹的存在(所以他们不知道我正在使用客户端 2(。
这可以通过 IAM 权限实现吗?
我当前的 IAM 策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "id1",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::*"
},
{
"Sid": "id2",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::client-bucket",
"Condition": {
"StringEquals": {
"s3:prefix": [
"",
"client-1-folder/"
],
"s3:delimiter": [
"/"
]
}
}
}
]
}
策略的这一部分:
"Condition": {
"StringEquals": {
"s3:prefix": [
"",
"client-1-folder/"
],
"s3:delimiter": [
"/"
]
}
}
说:"仅当前缀为空或client-1-folder
时。
因此,它允许人们列出存储桶的root
。如果您删除""
,则只允许他们列出自己的目录。
此外,您不必为每个人编写单独的策略,而是可以利用如下策略变量:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::mybucket"],
"Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}}
},
{
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::mybucket/${aws:username}/*"]
}
]
}
这允许将相同的策略应用于所有用户,而无需指定其用户名。但是,它希望文件夹的名称与其用户名相同。
请参阅: IAM 策略元素:变量和标签 - AWS 身份和访问管理
为什么不为不同的客户端创建不同的 s3 存储桶?为每个客户端创建一个专用存储桶。然后,您为每个客户端创建的用户创建策略,该策略允许客户端仅查看他/她的 s3 存储桶。