我正在使用Amazon S3存储客户端数据。有多个客户端,每个客户端在“ / Users /”文件夹中都有其名称的文件夹。客户具有读写权限。
要动态地为每个客户端分配权限,我创建了一个标准策略,该策略是在用户创建时分配的(该策略在下面,可以正常工作)。
现在,客户端的用户也可以访问该数据。但是他们应该只对属于其客户端的文件夹具有只读权限,没有其他文件夹。
我创建了一个具有读写访问权限的策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowUserToSeeBucketListInTheConsole",
"Action": [
"s3:ListAllMyBuckets"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::*"
]
},
{
"Sid": "AllowRootAndHomeListingOfCompanyBucket",
"Action": [
"s3:*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucket-name"
],
"Condition": {
"StringEquals": {
"s3:prefix": [
"",
"Users/",
"Users/${aws:username}"
],
"s3:delimiter": [
"/"
]
}
}
},
{
"Sid": "AllowListingOfUserFolder",
"Action": [
"s3:*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucket-name"
],
"Condition": {
"StringLike": {
"s3:prefix": [
"",
"Users/",
"Users/${aws:username}/*"
]
}
}
},
{
"Sid": "AllowAllS3ActionsInUserFolder",
"Effect": "Allow",
"Action": [
"s3:GetObject"
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::bucket-name/Users/${aws:username}/*"
]
}
]
}
假设${aws:username}
是属于客户端的同一文件夹。
如果我创建具有与上述相同的第二个策略只是具有只读权限,则只读用户的用户名必须更改为不同的名称(因为用户名不能相同),因此如果第二个用户的名称不同那么他将无法访问该文件夹。
问题:
${aws:username}
一样,在创建用户并可以像使用变量一样在策略中使用时,我们可以分配什么吗?答案 0 :(得分:0)
首先,我建议尽可能避免使用s3:*,因为它可能导致某些安全问题。例如-在下面的策略规则中-s3:*
与条件s3:prefix
等于""
的组合在我看来似乎有效地允许管理整个存储桶。即使对用户文件夹有正确的限制,他们仍然可以通过更改ACL将内容更改为公共内容。可能不错,但是我宁愿明确定义它,以便您知道这是需要的。
您还可以在存储区ARN中使用路径"arn:aws:s3:::bucket-name/Users/{username}"
,并可能完全避免这种情况。
{
"Sid": "AllowRootAndHomeListingOfCompanyBucket",
"Action": [
"s3:*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucket-name"
],
"Condition": {
"StringEquals": {
"s3:prefix": [
"",
"Users/",
"Users/${aws:username}"
],
"s3:delimiter": [
"/"
]
}
}
},
对于您的问题,是否可以使用通过CloudFormation模板生成的内联策略来创建用户名和username_ro,其中用户名将作为参数。不仅可以使用参数化的处方,还可以使用一种方法来始终如一地为所有用户更新策略。是有帮助的还是我没有正确收到您的问题?