削除操作にワイルドカードのプリンシパルを使う S3 ポリシー

S3 の削除権限を必要なアクセス主体とリソースに限定し、データ喪失やサービス停止のリスクを抑えます。

説明

S3 バケットポリシーの Principal: "*" は、アクセス主体を特定のユーザーやロールに限定しません。削除を許可するステートメントでこの指定を使い、適切なアクセス制限がなければ、削除権限が不要な主体にもデータや設定の削除を許すおそれがあります。

実際の権限は、許可する操作、対象の Resource、Condition、明示的な拒否、S3 Block Public Access の設定によって決まります。オブジェクトの削除とバケット設定の削除は別の操作なので、必要な権限をそれぞれ確認してください。

想定される影響

  • 実際のポリシー評価で、削除権限が不要なアクセス主体にもオブジェクトの削除が許可される場合、データの喪失やサービスの停止につながるおそれがあります。
  • ログやバックアップが削除されたり、通常の取得操作で参照できなくなったりすると、調査や復旧が難しくなる可能性があります。バージョニングが有効なバケットでは、バージョンIDを指定しない削除は通常、削除マーカーを追加します。特定のバージョンを完全に削除するには、s3:DeleteObjectVersion権限が必要です。
  • バケット設定の削除まで許可すると、その設定に依存する運用や保護機能にも影響するおそれがあります。

対処方法

  • 不要な削除の許可を取り除き、必要な削除権限は特定の運用ロールやアカウントだけに付与してください。
  • 有効な操作名と具体的なバケットまたはオブジェクトのARNで範囲を制限してください。条件、ほかの許可・拒否ポリシー、Block Public Accessもあわせて確認してください。
  • 復旧要件に応じてバージョニングとバックアップを設定し、復旧手順を検証してください。バージョニングは削除権限の制限に代わるものではありません。

例

以下は許可と明示的な拒否を比較する抜粋です。参照先の DOC-EXAMPLE-BUCKET の定義が省略されています。デプロイには、操作に対応するバケットまたはオブジェクトの ARN も指定する必要があります。

不完全な削除許可の指定

yaml
Resources:
  SampleBucketPolicy3:
    Type: "AWS::S3::BucketPolicy"
    Properties:
      Bucket: !Ref DOC-EXAMPLE-BUCKET
      PolicyDocument:
        Statement:
          - Action: "DeleteObject"
            Effect: Allow
            Resource: "*"
            Principal: "*"

このステートメントはすべての主体に削除を許可する意図の指定ですが、DeleteObject には必要な s3: の接頭辞がなく、有効な AWS ポリシーの操作名ではありません。操作名を直すだけでなく、アクセス主体と対象リソースを必要な範囲に限定してください。

オブジェクト削除の明示的な拒否

yaml
Resources:
  SampleBucketPolicy1:
    Type: "AWS::S3::BucketPolicy"
    Properties:
      Bucket: !Ref DOC-EXAMPLE-BUCKET
      PolicyDocument:
        Statement:
          - Action:
              - "s3:DeleteObject"
            Effect: Deny
            Resource: "*"
            Principal: "*"

有効なポリシーでは、Effect: Deny が指定されたリソースの s3:DeleteObject をすべての主体に明示的に拒否するため、正当な運用にも影響する場合があります。このステートメントは s3:DeleteObjectVersion などの別の操作までは拒否しません。適用前に、運用に必要な操作と復旧手順を確認してください。

参考資料