Put 操作のプリンシパルにワイルドカードを指定した S3 バケットポリシー

S3 の Put 操作をワイルドカードのプリンシパルに許可すると、不要なアップロードや設定変更を許す可能性があります。操作ごとに必要なロールとリソースへ限定し、実際に適用されるアクセス制御を確認してください。

説明

Put 操作をワイルドカードのプリンシパルに許可すると、意図したユーザーやサービス以外にも書き込み権限を与える可能性があります。これらの操作にはオブジェクトのアップロードに加え、ACL などの設定変更も含まれます。実際のアクセスは、操作、リソース ARN、条件、明示的な拒否、パブリックアクセスブロックに左右されます。

PutObject が許可されていれば、新しいオブジェクトを追加したり、既存キーの現在の内容を変更したりできます。バージョニングが有効な場合、同じキーへの書き込みは新しいバージョンを作成します。以前のバージョンが残っていても、現在のオブジェクトを使うアプリケーションは変更後のデータを読み取る可能性があります。

想定される影響

  • アップロードが不要な主体により、不要なコンテンツが追加されたり、ストレージ費用が増えたりする可能性があります。
  • 既存キーへの書き込みによって、アプリケーションやデプロイシステムが読み取る内容が変わる可能性があります。
  • 設定変更も許可すると、アクセス制御や運用設定が変わる場合があります。アップロードの権限と管理権限を区別してください。

対処方法

  • アップロードと設定変更を、それぞれ必要なロールと操作に限定し、適切なバケットまたはオブジェクトの ARN を指定してください。公開読み取りが必要でも、書き込みまで公開しないでください。
  • ポリシー全体の条件、明示的な拒否、ACL、パブリックアクセスブロックを確認してください。モジュールが実際にポリシーを適用するかも確かめてください。S3 モジュール 3.7.0 のカスタムポリシーには attach_policy = true が必要です。
  • 正当なアップロードと承認していない書き込みを試し、バージョニングと復旧手順を確認してください。アップロードだけが必要なロールに、ACL やバケットポリシーの管理権限を与えないでください。

例

aws_s3_bucket.example は別途定義してください。203.0.113.10/32 は説明用のアドレスなので、実際の送信元アドレスに置き換えてください。二つは異なるポリシーの例であり、同じバケットへ同時に適用しないでください。

IP 条件によるオブジェクト書き込みの許可

hcl
resource "aws_s3_bucket_policy" "put_open_policy" {
  bucket = aws_s3_bucket.example.id

  policy = <<POLICY
{
  "Version": "2012-10-17",
  "Id": "MYBUCKETPOLICY",
  "Statement": [
    {
      "Sid": "IPAllow",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:PutObject",
      "Resource": "${aws_s3_bucket.example.arn}/*",
      "Condition": {
         "IpAddress": {"aws:SourceIp": "203.0.113.10/32"}
      }
    }
  ]
}
POLICY
}

IP 条件は対象となるリクエストを制限しますが、アップロードする主体を特定のロールには限定しません。同じ送信元アドレスを共有するユーザーに不要な書き込み権限を与える可能性があるため、承認済みのロールも指定してください。

IP 条件による明示的な拒否

hcl
resource "aws_s3_bucket_policy" "put_restricted_policy" {
  bucket = aws_s3_bucket.example.id

  policy = <<POLICY
{
  "Version": "2012-10-17",
  "Id": "MYBUCKETPOLICY",
  "Statement": [
    {
      "Sid": "IPDeny",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": "${aws_s3_bucket.example.arn}/*",
      "Condition": {
         "IpAddress": {"aws:SourceIp": "203.0.113.10/32"}
      }
    }
  ]
}
POLICY
}

この拒否は指定した IP アドレスからのオブジェクト操作にだけ適用され、ほかの送信元の書き込み権限は制限しません。アップロードを承認済みの主体に限定する対処の代わりにはならず、正当なリクエストを遮断する場合もあります。適用されるすべての許可と拒否を合わせて確認してください。

参考資料