0
0

【CloudFormation】S3バケットアクセスの基本ポリシーの生成

Last updated at Posted at 2024-09-20

バケットアクセスの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フルアクセスの権限があるとこのバケットへのアクセスも許容することとなります。より厳密にやるなら拒否設定なりなんなりする必要があるので注意です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0