バケットアクセスのIAMポリシーの作成が面倒
S3バケットを作成後、アクセスするユーザーやロールを制限したいというのは当然な要望な一方、いちいちポリシーを作成するのは面倒に感じます。とりあえずフルアクセスなんてしておくと事故の元になります。
基本的なIAMポリシーを事前に作成しておく
理想は拒否設定をしっかり入れておいて、アクセスできるユーザー・ロールのみ明示的に細かく権限を許可していくのが理想なのだが、さほど重要でないバケットにもこの運用は費用対効果に見合わないため
- 書き込み
- 読み込み
- フルアクセス
- リスト
該当のバケットに対してこれらの権限のみのポリシーを作成し、基本的にこれらを組み合わせてアクセスするようにする。
CloudFormationで解決
バケット名をすげ替えるだけで各バケットのアクセスに関するポリシーを生成したい。
以下が実際にそのまま使えるymlです。
実行時にバケット名の入力が可能なので、ポリシーを作りたいバケットの名称を入れます。
AWSTemplateFormatVersion: '2010-09-09'
Description: create iam policy for s3 bucket, read only, write only, full access
Parameters:
BucketName:
Description: "creating policy backet name"
Type: String
Resources:
ReadOnlyPolicy:
Type: "AWS::IAM::ManagedPolicy"
Properties:
ManagedPolicyName: !Sub "s3-${BucketName}-ReadOnlyPolicy"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Action:
- "s3:GetObject"
Resource: !Sub "arn:aws:s3:::${BucketName}/*"
WriteOnlyPolicy:
Type: "AWS::IAM::ManagedPolicy"
Properties:
ManagedPolicyName: !Sub "s3-${BucketName}-WriteOnlyPolicy"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Action:
- "s3:PutObject"
Resource: !Sub "arn:aws:s3:::${BucketName}/*"
ListOnlyPolicy:
Type: "AWS::IAM::ManagedPolicy"
Properties:
ManagedPolicyName: !Sub "s3-${BucketName}-ListOnlyPolicy"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Action:
- "s3:ListBucket"
Resource: !Sub "arn:aws:s3:::${BucketName}"
FullAccessPolicy:
Type: "AWS::IAM::ManagedPolicy"
Properties:
ManagedPolicyName: !Sub "s3-${BucketName}-FullAccessPolicy"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Action: "s3:*"
Resource:
- !Sub "arn:aws:s3:::${BucketName}"
- !Sub "arn:aws:s3:::${BucketName}/*"
Outputs:
ReadOnlyPolicyName:
Description: "read_only_policy_name"
Value: !Ref ReadOnlyPolicy
WriteOnlyPolicyName:
Description: "write_only_policy_name"
Value: !Ref WriteOnlyPolicy
FullAccessPolicyName:
Description: "full_access_policy_name"
Value: !Ref FullAccessPolicy
ymlはシンプルなので、ポリシーの種類を増やすのも簡単です。
このあたりの修正は生成AIに任せてもおそらく完璧に指示通りにやってくれます。
改めて
これでこのバケットへのアクセスはある程度調整できるように思えますが、S3フルアクセスの権限があるとこのバケットへのアクセスも許容することとなります。より厳密にやるなら拒否設定なりなんなりする必要があるので注意です。