説明
S3 バケットポリシーでワイルドカードのプリンシパルに読み取りを実際に許可すると、匿名リクエストを含む意図しないアクセスを許すおそれがあります。s3:GetObject はオブジェクトの内容を読む権限です。ほかの Get 操作では、バケット設定やオブジェクトの特定の情報を取得できます。読み取り権限だけでオブジェクトの変更や削除ができるわけではありません。
実際のアクセスには、操作、リソース、条件、明示的な拒否、パブリックアクセスブロックが関係します。ウェブサイトの素材など意図的に公開するデータも、必要な読み取り範囲だけを許可してください。
想定される影響
- オブジェクトの読み取りが許可されると、文書、ログ、バックアップの内容が漏えいするおそれがあります。
- 許可された操作によっては、バケット設定やオブジェクトの情報が外部に知られる可能性があります。
対処方法
- 不要な公開許可を削除し、読み取りが必要なロールやサービスだけに該当する権限を付与してください。
- オブジェクト操作には必要なオブジェクト ARN、バケット操作には対象のバケット ARN を指定し、条件も確認してください。
- 非公開バケットにはパブリックアクセスブロックを適用し、ほかのポリシーと ACL も確認してください。必要な読み取りが成功し、意図しない読み取りが拒否されることを試験してください。
例
BucketName に管理対象の既存バケット名を指定します。例ではオブジェクト ARN を使います。アカウントやバケットのパブリックアクセスブロックによって公開ポリシーの設定が拒否される場合があります。例を適用するためだけに既存の保護を解除しないでください。
変更前
yaml
Parameters:
BucketName:
Type: String
Resources:
SampleBucketPolicy3:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref BucketName
PolicyDocument:
Version: '2012-10-17'
Statement:
- Action: s3:GetObject
Effect: Allow
Resource: !Sub 'arn:${AWS::Partition}:s3:::${BucketName}/*'
Principal: '*'
このステートメントは、バケット内のオブジェクトに対する s3:GetObject をすべてのプリンシパルに許可します。公開アクセスが実際に可能かどうかは、ほかのアクセス制御にも依存します。
変更後
yaml
Parameters:
BucketName:
Type: String
Resources:
SampleBucketPolicy3:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref BucketName
PolicyDocument:
Version: '2012-10-17'
Statement:
- Action:
- s3:GetObject
Effect: Deny
Resource: !Sub 'arn:${AWS::Partition}:s3:::${BucketName}/*'
Principal: '*'
この明示的な拒否は、正規のユーザーによる s3:GetObject も遮断する可能性があります。読み取りが必要なユーザーがいる場合は、この一律の拒否をそのまま適用せず、公開許可を削除したうえで必要な権限だけを付与してください。