説明
削除操作をワイルドカードのプリンシパルに許可するバケットポリシーは、必要なユーザーやサービス以外にも権限を与える可能性があります。実際のアクセスは、ポリシーの条件、リソース範囲、明示的な拒否、パブリックアクセスブロックに左右されます。条件付きのワイルドカード指定が、インターネット全体への無条件の削除許可になるとは限りません。
削除に関する操作には、オブジェクトの削除だけでなく、ポリシーや設定の削除も含まれます。バージョニングが有効なバケットでは、バージョン ID を指定しない DeleteObject は削除マーカーを作成します。特定バージョンの完全な削除には s3:DeleteObjectVersion が必要です。実際に許可する操作とバケットの状態を区別して確認してください。
想定される影響
- 削除権限が不要な主体により、オブジェクトが削除されたり、削除マーカーによって現在のオブジェクトを読み取れなくなったりする可能性があります。
- サービスに必要なオブジェクトや設定が失われると、サービスが中断する場合があります。
- 復旧には保存されたバージョンやバックアップが必要になることがあります。バージョニングだけですべての完全削除を防げるわけではありません。
対処方法
- 削除権限を必要なロール、具体的な操作、バケットまたはオブジェクトの ARN に限定してください。
s3:*のような広すぎる権限は削除してください。 - ポリシー全体の条件と明示的な拒否、パブリックアクセスブロックを確認し、実際に適用されたポリシーを確かめてください。S3 モジュール 3.7.0 のカスタムポリシーには
attach_policy = trueが必要です。 - オブジェクト削除とバージョン削除の権限を分け、復旧手順を試してください。承認済みの整理処理が動作し、承認していない削除リクエストが拒否されることを確認してください。
例
参照先の aws_s3_bucket.example は別途定義してください。203.0.113.10/32 は説明用のアドレスなので、実際のリクエスト送信元に置き換えてください。二つは別々の構成例であり、同じバケットへ同時に適用するものではありません。
IP 条件による削除の許可
resource "aws_s3_bucket_policy" "delete_open_policy" {
bucket = aws_s3_bucket.example.id
policy = <<POLICY
{
"Version": "2012-10-17",
"Id": "MYBUCKETPOLICY",
"Statement": [
{
"Sid": "IPAllow",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:DeleteObject",
"Resource": "${aws_s3_bucket.example.arn}/*",
"Condition": {
"IpAddress": {"aws:SourceIp": "203.0.113.10/32"}
}
}
]
}
POLICY
}
IP 条件を満たすリクエストにオブジェクト削除を許可しますが、主体は特定のロールに限定していません。同じ送信元アドレスを使う全員が削除権限を必要とするとは限らないため、承認済みのロールも明示してください。
IP 条件による明示的な拒否
resource "aws_s3_bucket_policy" "delete_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 条件を満たすオブジェクト操作にだけ適用されます。ほかの IP アドレスからのリクエストを遮断するものでも、削除を承認済みロールだけに限定する完全な対処でもありません。正当なユーザーを遮断しないよう、ポリシー全体の許可と拒否を確認してください。