説明
S3バケットポリシーの許可ステートメントで Principal に * を指定すると、匿名リクエストを含む幅広い主体にアクセスを許可する可能性があります。実際の権限は、許可する操作とリソース、ポリシーの条件、明示的な拒否、Block Public Accessの設定によって決まります。主体の範囲が未指定の場合は意図する範囲を明確にし、ポリシーの構文を検証する必要があります。省略しただけでアクセス権限が付与されるわけではありません。
想定される影響
- 意図しない主体にオブジェクトの読み取り権限があると、データが漏えいする可能性があります。書き込みや削除も許可されていれば、データの変更や消失につながるおそれがあります。
- 現在公開アクセスを遮断している条件や設定を緩和すると、ポリシーの広範な権限によってアクセス範囲が広がる可能性があります。
対処方法
- 必要なアカウント、ロール、ユーザー、サービスを指定し、操作とリソースを最小限にしてください。ポリシーの不足や誤りを修正し、全体を検証してください。
- 内部用バケットにBlock Public Accessを適用し、アカウントとバケットで実際に適用される設定を確認してください。意図的に公開するデータも、対象リソースに必要な操作だけを許可し、条件を確認してください。
- ポリシーのリソースARNがデプロイするバケットを指すことを確認してください。IAM Access Analyzerなどでポリシーを確認し、必要なアクセスが維持され、不要なアクセスが拒否されることを検証してください。
例
例のバケットには BucketName がありませんが、ポリシーは固定名 DOC-EXAMPLE-BUCKET のオブジェクトARNを使用しています。実際のバケット内のオブジェクトARNと存在するIAMプリンシパルに置き換え、Block Public Accessの設定も確認してください。
変更前
yaml
Resources:
Bucket:
Type: AWS::S3::Bucket
BucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref Bucket
PolicyDocument:
Statement:
- Effect: Allow
Principal:
AWS:
- "*"
Action: s3:GetObject
Resource: arn:aws:s3:::DOC-EXAMPLE-BUCKET/*
変更後
yaml
Resources:
Bucket:
Type: AWS::S3::Bucket
BucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref Bucket
PolicyDocument:
Statement:
- Effect: Allow
Principal:
AWS:
- arn:aws:iam::111122223333:user/Alice
- arn:aws:iam::111122223333:user/foo
Action: s3:GetObject
Resource: arn:aws:s3:::DOC-EXAMPLE-BUCKET/*
説明:
- 変更前: すべての主体に
s3:GetObjectを許可するステートメントです。他のアクセス制御で遮断されなければ、指定したオブジェクトが公開される可能性があります。書き込みや削除を許可する例ではありません。 - 変更後: 同じ読み取り操作の主体を二つのユーザーARNに限定しています。このステートメントで他のポリシーから得た権限まで制限されるわけではないため、権限全体を確認してください。