用于只能访问特定 S3 存储桶的 IAM 组的 AWS CloudFormation 模板
AWS CloudFormation Template for an IAM Group That May Only Access a Specific S3 Bucket
关于这个主题的类似问题已经被问到 here,但是关于 post 的解决方案中有 none 对我有用,而且它已经很老了,这让我想到了相信 AWS 中可能发生了一些变化,值得提出一个新问题。
基本上,我使用 CloudFormation 模板来定义具有内联策略的 IAM 组,以便其用户只能访问单个 S3 存储桶。基于链接的问题,我得到了以下模板(原来的 posts 使用 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 用户不仅可以列出所有其他存储桶(控制台访问所需),还可以打开、修改和删除它们及其对象!显然这不是我们想要的行为! AWS 是否发生了某些变化,使该政策不再有效?该策略在 CloudFormation 模板中的工作方式是否与它在其自身中的工作方式不同?如有任何帮助,我们将不胜感激!
编辑:
如@wjordan 的回答所述,事实证明,另一项政策已经为该组提供了完整的 S3 权限。我正在添加 AWSLambdaFullAccess 托管策略,它意外地有一个 allow 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
之外没有应用任何额外的 groups/policies 会授予他们意外的权限吗?
确认这一点的一种方法是从头开始创建一个新的 IAM 用户并尝试在那里重现该问题。
关于这个主题的类似问题已经被问到 here,但是关于 post 的解决方案中有 none 对我有用,而且它已经很老了,这让我想到了相信 AWS 中可能发生了一些变化,值得提出一个新问题。
基本上,我使用 CloudFormation 模板来定义具有内联策略的 IAM 组,以便其用户只能访问单个 S3 存储桶。基于链接的问题,我得到了以下模板(原来的 posts 使用 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 用户不仅可以列出所有其他存储桶(控制台访问所需),还可以打开、修改和删除它们及其对象!显然这不是我们想要的行为! AWS 是否发生了某些变化,使该政策不再有效?该策略在 CloudFormation 模板中的工作方式是否与它在其自身中的工作方式不同?如有任何帮助,我们将不胜感激!
编辑:
如@wjordan 的回答所述,事实证明,另一项政策已经为该组提供了完整的 S3 权限。我正在添加 AWSLambdaFullAccess 托管策略,它意外地有一个 allow 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
之外没有应用任何额外的 groups/policies 会授予他们意外的权限吗?
确认这一点的一种方法是从头开始创建一个新的 IAM 用户并尝试在那里重现该问题。