ワイルドカードのプリンシパルを使用する S3 バケットポリシー

S3 バケットポリシーのワイルドカードのプリンシパルを、操作、条件、明示的な拒否、公開アクセスのブロック設定と合わせて確認します。

説明

S3 バケットポリシーの Principal: "*" には、他の AWS アカウントだけでなく匿名のリクエストも含まれ得ます。必要以上にアクセスを許可すると、意図しない相手がオブジェクトを読み取ったり変更したりするおそれがあります。実際の権限は、許可する操作、リソース、条件、明示的な拒否、S3 Block Public Access の設定によって決まるため、ポリシー全体を確認する必要があります。

想定される影響

  • 意図しないプリンシパルが実際にオブジェクトを読み取れる場合、ファイル、ログ、バックアップなどの情報が漏えいする可能性があります。
  • 書き込みや削除が許可されていれば、データの完全性や可用性に影響するおそれがあります。ワイルドカードのプリンシパルだけで、すべての操作が許可されるわけではありません。

対処方法

  • 必要なアカウント、ロール、サービスプリンシパルを指定し、各操作とリソースの範囲を必要最小限に制限してください。
  • 条件付きのワイルドカードが必要な場合は、条件のキー、演算子、値が意図したリクエストだけを許可するか確認してください。
  • 公開アクセスが不要なら S3 Block Public Access を適用し、アカウントとバケットで有効な設定を合わせて確認してください。必要な外部連携が引き続き利用できるかも確認してください。

例

最初の例では、Resource に SQS リソースを指す ${aws_sqs_queue.q.arn} を指定しているため、有効な S3 バケットポリシーとしてデプロイできません。実際の S3 リソースの ARN が必要です。二つ目の例も、アカウントとロールの ARN を実際の値に置き換え、関連する権限と公開アクセスのブロック設定を確認してください。

変更前

yaml
- name: Create a simple s3 bucket with a policy
  amazon.aws.s3_bucket:
    name: mys3bucket
    policy:
      Version: "2012-10-17"
      Id: "sqspolicy"
      Statement:
        - Sid: First
          Effect: Allow
          Principal: "*"
          Action: "*"
          Resource: ${aws_sqs_queue.q.arn}

変更後

yaml
- name: Create a simple s3 bucket with a policy
  amazon.aws.s3_bucket:
    name: mys3bucket
    policy:
      Version: "2012-10-17"
      Id: "bucket-policy"
      Statement:
        - Sid: AllowReadFromSpecificRole
          Effect: Allow
          Principal:
            AWS: "arn:aws:iam::123456789012:role/app-bucket-reader"
          Action:
            - "s3:GetObject"
          Resource: "arn:aws:s3:::mys3bucket/*"

補足:

  • 変更前: Principal: "*" と Action: "*" は、プリンシパルや操作を限定しない組み合わせです。ただし、Resource が誤っているため、この例を有効なアクセス許可ポリシーとして使用することはできません。
  • 変更後: このステートメントは、指定したロールに、このバケットのオブジェクトに対する s3:GetObject だけを許可します。他のポリシーが追加の権限を与えていないかも確認してください。

参考資料