问题描述
我正在尝试使用我的存储桶策略限制用户访问我的存储桶。我有一组用户,他们都有一个 S3FullAccess 策略。我无法更改 IAM 中的任何内容。我只能访问我的存储桶策略。所以我想使用存储桶策略来控制用户的访问。我将用户分为 3 类。
- 对我的存储桶的管理员访问权限(对我的存储桶的所有访问权限)
- 对我的存储桶具有有限访问权限的用户(例如 get-bucket-policy、get-bucket-location)
- 无法访问我的存储桶。 (无法访问我的存储桶)
以下策略是我尝试过的,但不起作用。
{
"Version": "2012-10-17","Id": "PolicyTesting","Statement": [
{
"Sid": "0","Effect": "Allow","Principal": {
"AWS": "arn:aws:iam::<<account_id>>:user/users_with_limited_access"
},"Action": [
"s3:GetBucketPolicy","s3:GetBucketLocation","s3:ListBucket"
],"Resource": [
"arn:aws:s3:::<<my_bucket_name>>","arn:aws:s3:::<<my_bucket_name>>/*"
]
},{
"Sid": "1","Effect": "Deny","NotPrincipal": {
"AWS": "arn:aws:iam::<<account_id>>:user/admin_users"
},"Action": "s3:*","arn:aws:s3:::<<my_bucket_name>>/*"
]
}
]
}
我尝试了上述策略,但只有管理员用户才能访问存储桶。访问受限的用户无法执行他们授予的操作,如 get-bucket-policy、get-bucket-location。他们收到拒绝访问异常。帮我解决这个问题。
解决方法
AWS IAM 策略中没有优先级顺序。请参考策略评估逻辑here。
AWS 执行代码会评估账户中适用于请求的所有策略。如果代码发现即使是一个适用的明确拒绝,代码也会返回拒绝的最终决定。
您当前的政策拒绝除管理员用户以外的所有用户进行任何 S3 操作。因此 users_with_limited_access 无法执行授予的操作。
请使用适当的委托人更新您的政策(根据您问题中的评论),并参考以下更新后的政策以使其生效。
{
"Version": "2012-10-17","Statement": [
{
"Sid": "1","Effect": "Allow","Principal": {
"AWS": "arn:aws:iam::111111111111:user/s3-limited-access-user"
},"Action": [
"s3:GetBucketPolicy","s3:GetBucketLocation","s3:ListBucket"
],"Resource": [
"arn:aws:s3:::example-bucket","arn:aws:s3:::example-bucket/*"
]
},{
"Sid": "2","Effect": "Deny","Principal": {
"AWS": "arn:aws:iam::111111111111:user/s3-no-access-user"
},"Action": "s3:*",{
"Sid": "3","Principal": {
"AWS": "arn:aws:iam::111111111111:user/admin-user"
},"arn:aws:s3:::example-bucket/*"
]
}
]
}
,
您应该非常小心NotPrincipal
。最好的做法是避免同时使用它们。大多数情况下,无需使用“危险的”NotPrincipal
即可轻松实现相同的功能(策略语义)。
我认为您最好创建特定的 IAM 角色并将它们分配给您希望允许访问 S3 存储桶的相应用户组。之后,使用针对 Deny
和 "Principal" : "*"
或 aws:userId
的显式 aws:PrincipalArn
阻止对存储桶的所有其他访问。
查看这篇文章了解更多详情https://levelup.gitconnected.com/how-i-locked-the-whole-company-out-of-an-amazon-s3-bucket-1781de51e4be
最好的,斯蒂芬