这里已经提出了一个关于这个主题的类似问题,但该帖子中的解决方案都不适用于我,而且它已经很旧了,这让我相信AWS中可能发生了一些变化,需要提出一个新问题。
基本上,我使用CloudFormation模板来定义具有内联策略的IAM组,以便其用户只能访问单个S3存储桶。基于链接的问题,我得到了以下模板(最初的帖子使用JSON,但我使用的是YAML):
BucketAccessGroup:
Type: AWS::IAM::Group
Properties:
GroupName: my-bucket-admins
Path: /my-bucket-admins/
Policies:
- PolicyName: MyBucketAccess
PolicyDocument:
Version: 2012-10-17
Statement:
-
Effect: Allow
Action: s3:*
Resource:
- arn:aws:s3:::my-bucket-name
- arn:aws:s3:::my-bucket-name/*
-
Effect: Allow
Action: s3:ListAllMyBuckets
Resource: "*"
不幸的是,此组中的IAM用户不仅可以列出其他每个bucket(控制台访问所需),还可以打开、修改和删除它们及其对象!显然,这不是所期望的行为!AWS是否发生了什么变化,导致该政策不再有效?该策略在CloudFormation模板中的工作方式是否与其本身不同?任何帮助都将不胜感激!
编辑:
正如@wjordan的回答中所说,事实证明,另一个策略已经赋予了该组完整的S3权限。我添加了AWSLambdaFullAccess管理的策略,它意外地有一行允许s3:*
(我在上面的代码b/c中遗漏了,我认为它不相关!)。考虑到需要与该策略共存,以下是我更新的CF模板,它按预期工作,也更安全:
BucketAccessGroup:
Type: AWS::IAM::Group
Properties:
GroupName: my-bucket-admins
ManagedPolicyArns: [ "arn:aws:iam::aws:policy/AWSLambdaFullAccess" ]
Policies:
- PolicyName: MyBucketAccess
PolicyDocument:
Version: 2012-10-17
Statement:
- # Prevent changing permissions in any way on the desired bucket
Effect: Deny
Action:
- s3:DeleteBucket
- s3:DeleteBucketPolicy
- s3:PutBucketPolicy
- s3:PutBucketAcl
Resource:
- arn:aws:s3:::my-bucket-name
- arn:aws:s3:::my-bucket-name
- # Prevent all S3 actions except listing buckets, on everything except the desired bucket (AWSLambdaFullAccess already allows s3:*)
Effect: Deny
NotAction: s3:ListAllMyBuckets
NotResource:
- arn:aws:s3:::my-bucket-name
- arn:aws:s3:::my-bucket-name
提供的策略对我来说是正确的,并且没有过期。您确定有问题的IAM用户在指定的AWS::IAM::Group
之外没有应用任何其他组/策略来授予他们意外的权限吗?
确认这一点的一种方法是从头开始创建一个新的IAM用户,并尝试在那里重现问题。