S3のACLの非推奨になったのでBucketPolicyへ移行してみた

S3のACLの非推奨になったのでBucketPolicyへ移行してみた

Clock Icon2024.11.11

はじめに

Amazon S3のAccess Control List (ACL)が非推奨となることが2021年に発表されました。
これに伴い、とある業務でCloudFormationを使った、ACLからバケットポリシーへの権限委譲を行いましたので、どのような対応をしたか紹介します。

S3ログ配信グループの権限移譲手順

現状の確認

まず初めに、現在のACL設定を確認し、どのようにアクセス制御が行われているかを把握します。

バケットポリシー

BucketPolicy

→何も設定されていません。

ACL

ACL
→S3ログ配信グループにオブジェクトの書き込み権限が付与されています。この権限を利用し、ログを受信しています。

権限の移譲方針について

ACLからバケットポリシーに権限を移譲する方針を記載します。
configuration-diagram

全体のイメージとして、cm-sample-bucketバケットに対してアクセスした結果のログを、S3のログ配信機能を利用し、s3-access-log-depositoryに保管します。

authority-transfer

バケットACLの読み、書きに関する権限は、バケットポリシーを使うので引き継ぐ必要はありません。

ACL無効化後、バケット所有者は、オブジェクトの書き込み、リスト(読み込み)の権限をデフォルトで付与されます。

バケットポリシーに記載するのは、必須ではないですが、明示的に記載することで保守性を高めます。

参考:オブジェクトの所有権の制御とバケットの ACL の無効化

CloudFormationテンプレートの準備

次にCloudFormationテンプレートを使用してBucketPolicyを設定します。

ユーザがアクセスするS3バケット (cm-sample-bucket)

cm-sample-bucket.yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: Access by users and cli
Resources:
  SampleBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: cm-sample-bucket
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
      BucketEncryption:
        ServerSideEncryptionConfiguration:
        - ServerSideEncryptionByDefault:
            SSEAlgorithm: "AES256"
      LoggingConfiguration:
        DestinationBucketName: s3-access-log-depository
        LogFilePrefix: "cm-sample-bucket-log/"

Outputs:
  SampleBucket:
    Value: !Ref SampleBucket
解説
  • PublicAccessBlockConfigurationは、パブリックアクセスに関する設定項目です。

  • BucketEncryptionは、暗号化に関する設定項目です。

  • LoggingConfigurationは、ログの配信先の設定項目です。

    LoggingConfiguration:
      DestinationBucketName: s3-access-log-depository
      LogFilePrefix: "cm-sample-bucket-log/"
    

    ログの配信先をs3://s3-access-log-depository/cm-sample-bucket-log/に設定しています。

    s3-access-log-depositoryバケットが作成されたあと、 cm-sample-bucketバケットを作成してください。

ログを配信するS3バケット (s3-access-log-depository)

s3-access-log-depository.yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: S3 Access log depository
Resources:
  S3AccessLogDepositoryBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: "s3-access-log-depository"
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
      BucketEncryption:
        ServerSideEncryptionConfiguration:
        - ServerSideEncryptionByDefault:
            SSEAlgorithm: "AES256"
  S3AccessLogDepositoryBucketPolicy:
    Type: 'AWS::S3::BucketPolicy'
    Properties:
      Bucket: !Ref S3AccessLogDepositoryBucket
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Sid: BucketOwnerWrite
            Effect: Allow
            Principal:
              AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
            Action:
              - s3:ListBucket
              - s3:PutObject
            Resource:
              - "arn:aws:s3:::s3-access-log-depository"
              - "arn:aws:s3:::s3-access-log-depository/*"
          - Sid: AWSS3LogWrite 
            Effect: Allow
            Principal:
              Service: 'logging.s3.amazonaws.com'
            Action: 's3:PutObject'
            Resource: "arn:aws:s3:::s3-access-log-depository/*"

Outputs:
  S3AccessLogDepositoryBucket:
    Value: !Ref S3AccessLogDepositoryBucket
  S3AccessLogDepositoryBucketPolicy:
    Value: !Ref S3AccessLogDepositoryBucketPolicy
解説
- Sid: BucketOwnerWrite
  Effect: Allow
  Principal:
    AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
  Action:
    - s3:ListBucket
    - s3:PutObject
  Resource:
    - "arn:aws:s3:::s3-access-log-depository"
    - "arn:aws:s3:::s3-access-log-depository/*"

ACLのバケット所有者と同じ権限を、バケットポリシーでも付与しています。
ACL無効化後、デフォルトで付与される権限ですが、保守性の観点から明示的に記載しています。

- Sid: AWSS3LogWrite 
  Effect: Allow
  Principal:
    Service: 'logging.s3.amazonaws.com'
  Action: 's3:PutObject'
  Resource: "arn:aws:s3:::s3-access-log-depository/*"

S3ログ配信グループに、s3-access-log-depositoryバケットへの書き込み権限を付与しています。
これにより、バケットポリシーでログを受信できるようになります。

検証と確認

CloudFormationのデプロイ

デプロイ成功です。

cfn-cm-sample-bucket
cfn-s3-access-log-depository

ログ保存の確認

テンプレートを適用した後、S3ログ配信グループにログが正しく保存されていることを確認します。これには、AWSコンソールを使用してバケットの内容を確認するか、AWS CLIを使用してログファイルの存在をチェックする方法があります。
今回は以下のスクリプトを実行しました。

aws s3 ls cm-sample-bucket

s3-access-log-deposiotry-prefix
バケットポリシー移行後に、ログが受信されていることがわかります。

結論

まとめ

S3のACLからBucketPolicyへの移行は、セキュリティと管理性を向上させるための重要な今後のメンテナンスやセキュリティ向上のために、BucketPolicyの設定を定期的に見直すことをお勧めします。

参考資料

リンクとリソース

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.