説明
S3 の静的ウェブサイトホスティングは、公開コンテンツを提供する正当な機能です。WebsiteConfiguration 自体はオブジェクトの読み取り権限を与えませんが、ウェブサイトエンドポイントで提供するオブジェクトには公開読み取りが必要です。S3 ウェブサイトエンドポイント自体は HTTPS に対応していません。
想定される影響
- 公開読み取りの範囲に設定ファイルやバックアップが混在すると、意図しない情報が公開されるおそれがあります。
- HTTP で直接配信するコンテンツは、通信中の機密性と完全性を TLS で保護できません。保存内容の改ざんには、別途書き込み権限やほかの侵害経路が必要です。
対処方法
- 不要なウェブサイト設定と公開許可を削除し、パブリックアクセスブロックを有効にしてください。
- ウェブサイトが必要な場合は公開ファイルを分離し、デプロイ権限と読み取り範囲を制限してください。機密ファイルやシークレットを含めないでください。
- HTTPS と非公開オリジンが必要な場合は、S3 の REST オリジンと CloudFront のオリジンアクセスコントロール(OAC)などを検討してください。S3 ウェブサイトエンドポイントは CloudFront でカスタムオリジンとなるため、OAC は利用できません。
例
変更前は、ポリシーでオブジェクトの公開読み取りを許可するウェブサイトの例です。実際の提供にはコンテンツのアップロードも必要で、アカウント単位の公開保護によってポリシーが拒否される場合があります。変更後はウェブサイトが不要になった場合の構成です。稼働中のサービスを止める前に代替の配信経路を準備してください。
変更前
yaml
Resources:
Bucket2:
Type: AWS::S3::Bucket
Properties:
OwnershipControls:
Rules:
- ObjectOwnership: BucketOwnerEnforced
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: false
IgnorePublicAcls: true
RestrictPublicBuckets: false
WebsiteConfiguration:
IndexDocument: index.html
ErrorDocument: error.html
WebsiteReadPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref Bucket2
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal: '*'
Action: s3:GetObject
Resource: !Sub '${Bucket2.Arn}/*'
ACL は無効にし、ポリシーでオブジェクトの公開読み取りを許可しています。このバケットには公開するファイルだけを配置してください。
変更後
yaml
Resources:
Bucket2:
Type: AWS::S3::Bucket
Properties:
OwnershipControls:
Rules:
- ObjectOwnership: BucketOwnerEnforced
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
同じバケットからウェブサイト設定と公開読み取りポリシーを削除し、四つの公開ブロック設定を有効にします。この変更だけで代替の HTTPS ウェブサイトが作成されるわけではありません。