説明
S3 バケットポリシーで Principal: "*" に書き込み操作を許可し、適切なアクセス制限がなければ、信頼していない主体にもデータの保存や設定変更を許すおそれがあります。必要なサービスや運用ロールだけに権限を付与してください。
s3:PutObject はオブジェクトのアップロード権限ですが、ほかの Put 操作にはバケットやオブジェクトの設定を変更するものもあります。実際のアクセス範囲は、操作、対象リソース、条件、明示的な拒否、S3 Block Public Access の設定によって決まります。アップロード権限と管理権限を分けて確認してください。
想定される影響
s3:PutObjectが実際に必要な範囲を超えて許可されると、アップロード権限が不要なアクセス主体も、新しいオブジェクトを追加したり、既存のキーに新たな内容を書き込んだりできます。バージョニングが有効な場合、同じキーへのアップロードは以前のバージョンを残して新しいバージョンを作成します。- Webサービスやデータ処理システムがそのオブジェクトを利用する場合、意図しない内容が配信されたり処理されたりするおそれがあります。設定変更の操作が許可されている場合は、その操作に応じた影響を別途評価してください。
- 不要なアップロードが実際に許可されると、ストレージ料金や処理負荷が増える可能性があります。
対処方法
- 不要な公開書き込みの許可を取り除き、必要な操作は指定したロールやアカウントだけに許可してください。
- アップロード権限と管理用の設定変更権限を分け、有効な操作名と具体的なバケットまたはオブジェクトのARNを指定してください。条件、ほかのポリシー、Block Public Accessもあわせて確認してください。
- 運用要件に応じてアップロードの監視やファイル検査を設定してください。これらの補助的な対策は、アクセス権限の制限に代わるものではありません。
例
以下はアップロードの許可と明示的な拒否を比較する抜粋です。DOC-EXAMPLE-BUCKET の定義が省略されています。デプロイ前に、操作に対応するバケットまたはオブジェクトの ARN も指定してください。
不完全なアップロード許可の指定
yaml
Resources:
SampleBucketPolicy3:
Type: "AWS::S3::BucketPolicy"
Properties:
Bucket: !Ref DOC-EXAMPLE-BUCKET
PolicyDocument:
Statement:
- Action: "PutObject"
Effect: Allow
Resource: "*"
Principal: "*"
PutObject には必要なサービスの接頭辞がなく、有効な AWS ポリシーの操作名ではありません。s3:PutObject に修正しても、すべての主体への許可という意図は別途見直す必要があります。必要なアクセス主体とオブジェクトのパスを明確に限定してください。
オブジェクトのアップロードを明示的に拒否
yaml
Resources:
SampleBucketPolicy1:
Type: "AWS::S3::BucketPolicy"
Properties:
Bucket: !Ref DOC-EXAMPLE-BUCKET
PolicyDocument:
Statement:
- Action:
- "s3:PutObject"
Effect: Deny
Resource: "*"
Principal: "*"
有効なポリシーでは、Effect: Deny が指定されたリソースの s3:PutObject をすべての主体に明示的に拒否するため、正当なアップロードも妨げる場合があります。ほかの Put 操作すべてを拒否するものではありません。必要なアップロードを維持できるよう、許可・拒否のステートメントと対象リソースを併せて設計してください。