オブジェクトが Amazon CloudFront ディストリビューションを介してのみアクセスできるように、Amazon Simple Storage Service (Amazon S3) バケットへのアクセスを制限したいと考えています。
解決方法
重要: 開始する前に、CloudFront ディストリビューションの Amazon S3 オリジンが、REST API エンドポイントとして設定されていることを確認してください。例えば、AWSDOC-EXAMPLE-BUCKET.s3.amazonaws.com です。この解決策は、ウェブサイトエンドポイントとして設定されている S3 オリジンには適用されません。例えば、AWSDOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com です。詳細は、CloudFront を使用して、Amazon S3 でホストされた静的ウェブサイトを提供するにはどうすればよいですか?をご覧ください。
オプション 1 (ベストプラクティス): CloudFront オリジンアクセスコントロール (OAC) を作成する
- CloudFront コンソールを開きます。
- 配信のリストから、アクセス制限の対象である S3 バケットからのコンテンツを提供しているものを選択します。
- [Origins] (オリジン) タブを選択します。
- S3 オリジンを選択して [編集] を選択します。
- [Origin access] (オリジンアクセス) で、[Origin access control settings (recommended)] (オリジンアクセスコントロール設定 (推奨)) を選択します。
- [Origin access control] (Originのアクセス制御) では、既存のOACを選択するか、[Create Control] (制御を作成) 設定を選択します。
- ダイアログボックスで、コントロール設定に名前を付けます。デフォルト設定の [Sign requests (recommended)] (リクエストに署名する (推奨)) のままにしておくのがベストプラクティスです。その後、[Create] を選択します。
- S3 バケットアクセスの場合、 S3 バケットにバケットポリシーを適用します。[ポリシーをコピー] を選択し、 [保存] を選択します。
- [S3 バケット権限に移動] を選択すると、S3 バケットコンソールに移動します。
- [変更を保存] を選択します。
- Amazon S3 コンソールで、バケットのリストから、CloudFront ディストリビューションのオリジンであるバケットを選択します。
- [Permissions] タブを選択します。
- [Bucket Policy] (バケットポリシー) で、次のようなステートメントが表示されていることを確認します。
{
"Version": "2012-10-17",
"Statement": {
"Sid": "AllowCloudFrontServicePrincipalReadOnly",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EDFDVBD6EXAMPLE"
}
}
}
}
CloudFront OAC がバケットからオブジェクトを読み取れるようにするには、前述のステートメントを追加する必要があります。
**注:**CloudFront OAC を使用してバケットへのアクセスを制限すると、AWS WAF を統合してセキュリティをさらに強化することができます。
オプション 2: レガシー CloudFront オリジンアクセスアイデンティティ (OAI) を作成する
- CloudFront コンソールを開きます。
- 配信のリストから、アクセス制限の対象である S3 バケットからのコンテンツを提供しているものを選択します。
- [Origins] (オリジン) タブを選択します。
- S3 オリジンを選択して [編集] を選択します。
- オリジンアクセスで、[レガシーアクセスアイデンティティ] を選択します。
- オリジンアクセスアイデンティティドロップダウンリストで、オリジンアクセスアイデンティティ名を選択するか、[Create new OAI] を選択します。
- ダイアログボックスで、新しいオリジンアクセスアイデンティティに名前を付け、[作成] を選択します。
- [バケットポリシー] で [はい] を選択し、バケットポリシーを更新します。
- [Save changes] (変更を保存) を選択します。
- Amazon S3 コンソールで、バケットのリストから、CloudFront ディストリビューションのオリジンであるバケットを選択します。
- [Permissions] タブを選択します。
- [Bucket Policy] (バケットポリシー) で、次のようなステートメントが表示されていることを確認します。
{{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5XXXXXXXXX"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET/*"
}
**注:**バケットポリシーを確認して、CloudFront OAI からのバケットへのアクセスを妨げる "Effect": "Deny" を含むステートメントがないかどうかを確認してください。CloudFront OAI がバケット内のオブジェクトにアクセスできるように、これらのステートメントを変更します。
また、バケットポリシーを確認して、CloudFront OAI 以外のソースからのバケットへのアクセスを許可する "Effect": "Allow" を含むステートメントがないかどうかを確認してください。ユースケースの必要に応じてこれらのステートメントを変更します。
関連情報
ディストリビューションの作成
Amazon S3 での Identity and Access Management