すべてのユーザーに一覧取得を許可するS3バケットACL

S3バケットの公開ACLを取り除き、オブジェクト一覧と内容のアクセス権限を個別に確認してください。

説明

AccessControl: PublicReadのバケットACLが有効な場合、匿名の呼び出しを含むすべてのユーザーがバケット内のオブジェクト一覧を取得できる可能性があります。バケットのREADとオブジェクトの内容を読む権限は異なるため、各オブジェクトの読み取り権限も確認してください。

新規バケットは既定でACLが無効になり、公開アクセスもブロックされます。実際の公開状態はObject Ownership、アカウント・バケットのパブリックアクセスブロック、全体のポリシーによって決まります。

想定される影響

  • オブジェクト名やパスから、内部構成や保存データに関する情報が分かる可能性があります。
  • オブジェクトの読み取りも別途許可されている場合、外部から内容を取得される可能性があります。

対処方法

  • 既存の必要なアクセスをポリシーで設定してから、BucketOwnerEnforcedでACLを無効にしてください。
  • 公開が不要なバケットではパブリックアクセスブロックを維持し、バケットポリシーと既存オブジェクトのACLを併せて確認してください。
  • 正規のアクセスが継続し、意図しない匿名の一覧取得や読み取りが拒否されることを確認してください。

例

同じバケットの構成を比較します。グローバルに一意なBucketNameを指定してください。最初の例は公開ACLが動作する条件を示すもので、推奨構成ではありません。アカウントや組織の保護が優先される場合があるため、実行のために保護を解除しないでください。

変更前

yaml
Parameters:
  BucketName:
    Type: String
Resources:
  JenkinsArtifacts01:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: PublicRead
      BucketName: !Ref BucketName
      OwnershipControls:
        Rules:
          - ObjectOwnership: ObjectWriter
      PublicAccessBlockConfiguration:
        BlockPublicAcls: false
        IgnorePublicAcls: false
        BlockPublicPolicy: true
        RestrictPublicBuckets: true
      Tags:
        - Key: CostCenter
          Value: ITEngineering

バケット側でACLと公開ACLの付与を有効にしています。ほかの制限がなければ匿名の一覧取得を許可する可能性があります。

変更後

yaml
Parameters:
  BucketName:
    Type: String
Resources:
  JenkinsArtifacts01:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref BucketName
      OwnershipControls:
        Rules:
          - ObjectOwnership: BucketOwnerEnforced
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        IgnorePublicAcls: true
        BlockPublicPolicy: true
        RestrictPublicBuckets: true
      VersioningConfiguration:
        Status: Enabled
      Tags:
        - Key: CostCenter
          Value: ITEngineering
        - Key: Type
          Value: CICD

ACLを無効にし、四つのパブリックアクセスブロック設定を有効にします。必要なアクセスをポリシーに移してから適用してください。バージョニングは別の復旧機能であり、公開アクセスを拒否する設定ではありません。

参考資料