Amazon S3 ウェブサイトエンドポイントを CloudFront ディストリビューションのオリジンとして使用すると、「403 access denied」エラーが表示されるのはなぜですか?
私は Amazon CloudFront ディストリビューションのオリジンとして Amazon Simple Storage Service (Amazon S3) バケットを使用しています。「403 access denied」エラーのトラブルシューティングをしたいと考えています。
解決策
Amazon S3 ウェブサイトエンドポイントをオリジンとして CloudFront ディストリビューションをトラブルシューティングするには、次のタスクを実行します。
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
バケット内のオブジェクトの暗号化を確認する
AWS キー管理サービス (AWS KMS) は匿名リクエストをサポートしていません。匿名アクセスまたはパブリックアクセスを許可する Amazon S3 バケットは、AWS KMS で暗号化されたオブジェクトにこのアクセスを適用しません。提供したい S3 オブジェクトから AWS KMS 暗号化を削除します。AWS KMS 暗号化の代わりに AES-256 を使用してオブジェクトを暗号化します。
オブジェクトが AWS KMS で暗号化されているかどうかを判断する
バケット内のオブジェクトが AWS KMS で暗号化されているかどうかを確認するには、次のタスクを実行します。
Amazon S3 コンソールを使用してオブジェクトのプロパティを表示します。暗号化ダイアログボックスで AWS-KMS を選択した場合、オブジェクトは AWS KMS で暗号化されます。
または、AWS CLI を実行して head-object コマンドを実行します。コマンドで ServerSideEncryption が aws:kms として返される場合、オブジェクトは AWS KMS で暗号化されています。
オブジェクトの暗号化設定の変更
Amazon S3 コンソールを使用してオブジェクトの暗号化設定を変更するには、「AWS KMS (SSE-KMS) によるサーバー側の暗号化の指定」を参照してください。
AWS CLI を使用してオブジェクトの暗号化設定を変更するには、オブジェクトのバケットにデフォルトの暗号化として AWS KMS がないことを確認します。バケットのデフォルトの暗号化が AWS KMS の場合は、暗号化を SSE-S3 に変更します。
バケットにデフォルトの暗号化がない場合は、次のコマンドを実行してオブジェクトをそれ自体にコピーし、オブジェクトの暗号化を解除します。
aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html
注: DOC-EXAMPLE-BUCKET は、お使いのバケット名に置き換えてください。オブジェクトをコピーすると、storage-class と website-redirect-location の設定が削除されます。これらの設定を新しいオブジェクトで維持するには、コピーリクエストでこれらの値を明示的に指定します。
バケットポリシーを確認する
バケットポリシーには、s3: GetObject アクションへのパブリック読み取りアクセスをブロックする拒否ステートメントを含めることはできません。
s3: GetObject に明示的な許可ステートメントがある場合は、そのステートメントと矛盾する明示的な拒否ステートメントがないことを確認してください。明示的な拒否ステートメントは、明示的な許可ステートメントよりも常に優先されます。
s3: GetObject のバケットポリシーを確認するには、次の手順を実行します。
- Amazon S3 コンソールを開き、S3 バケットに移動します。
- [アクセス許可] タブを選択します。
- [バケットポリシー] を選択します。
- バケットポリシーで "Action": "s3:GetObject" または "Action": "s3:*" を含むステートメントがないか確認します。
- バケットポリシーを変更して、CloudFront OAI アクセスまたは s3:GetObject へのパブリックアクセスをブロックするステートメントを削除するか、編集します
たとえば、次のポリシーには、s3:GetObject へのパブリックアクセスの明示的な許可ステートメントが含まれています。ただし、リクエストが特定の Amazon Virtual Private Cloud (Amazon VPC) からのものでない場合、s3:GetObject アクセスの明示的な拒否ステートメントも含まれます。s3:GetObject アクションを許可するようにこのポリシーを変更します。
{ "Version": "2012-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "Allow-OAI-Access-To-Bucket", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5#########" }, "Action": "s3:GetObject", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ] }, { "Sid": "Allow-Public-Access-To-Bucket", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ] }, { "Sid": "Access-to-specific-VPCE-only", "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ], "Condition": { "StringNotEquals": { "aws:sourceVpce": "vpce-1a2b3c4d" } } } ] }
以下のポリシーは、S3 ウェブサイトエンドポイントへの読み取り専用パブリックアクセスを許可する Amazon S3 バケットポリシーの例です。
{ "Version": "2012-10-17", "Statement": { "Sid": "AllowPublicReadOnly", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" } }
バケットとオブジェクトの所有権を確認する
オブジェクトへのパブリック読み取りアクセスを許可するバケットポリシーでは、バケットを所有する AWS アカウントがオブジェクトも所有している必要があります。
**注:**オブジェクトの所有権の要件が、バケットポリシーによって付与されるパブリック読み取りアクセスに適用されます。オブジェクトのアクセスコントロールリスト (ACL) が付与するパブリック読み取りアクセスには適用されません。
バケットとオブジェクトの所有者が同じであることを確認する
注:Amazon S3 コンソールでバケットとオブジェクトの所有者を確認することもできます。所有者はバケットまたはオブジェクトの [アクセス許可] タブで確認できます。
AWS CLI を使用してバケットとオブジェクトの所有者を確認するには、次のコマンドを実行します。
list-buckets コマンドを実行して、バケット所有者の S3 正規 ID を取得します。
aws s3api list-buckets --query Owner.ID
list-objects コマンドを実行して、オブジェクト所有者の S3 正規 ID を取得します。
aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html
**注:**前述のコマンド例の出力には 1 つのオブジェクトが表示されていますが、list-objects コマンドを使用して複数のオブジェクトを確認できます。正規 ID が一致しない場合、バケットとオブジェクトの所有者は異なります。
ソースオブジェクトの所有権
バケット所有者は S3 オブジェクト所有権を使用してオブジェクトの所有権を管理できます。S3 オブジェクトの所有権設定は、すべての新しい S3 バケットでデフォルトでオンになっています。既存のバケットを更新するには、「既存のバケットのオブジェクト所有権の設定」を参照してください。
バケット所有者にとっては、すべてのバケットで S3 オブジェクト所有権設定を使用するのがベストプラクティスです。また、AWS Identity and Access Management (IAM) ロールとバケットポリシーを使用してアクセス権限を管理することもベストプラクティスです。
バケットの ACL を削除し、バケット内のすべてのオブジェクトの所有権を取得するには、put-bucket-ownership-controls コマンドを実行します。
aws s3api put-bucket-ownership-controls --bucket example-bucket --ownership-controls 'Rules=[{ObjectOwnership=BucketOwnerEnforced}]'
S3 バケットの ACL を無効にしたくない場合は、オブジェクトの所有者をバケット所有者に変更してください。
次の手順を実行します。
-
オブジェクト所有者のアカウントから get-object-acl コマンドを実行して、オブジェクトに割り当てられている ACL 権限を取得します。
aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name
**注:**オブジェクトに bucket-owner-full-control ACL 権限がある場合は、ステップ #3 に進んでください。
-
オブジェクトに bucket-owner-full-control ACL 権限がない場合は、オブジェクト所有者のアカウントから put-object-acl コマンドを実行します。
aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control
-
バケット所有者のアカウントから、次のコマンドを実行してオブジェクトをコピーし、オブジェクトの所有者を変更します。
aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html
**注:**DOC-EXAMPLE-BUCKET は S3 バケットの名前に置き換えます。DOC-EXAMPLE-BUCKET は S3 バケットの名前に置き換えます。
バケットの「パブリックアクセスをブロック」設定を確認する
Amazon S3 パブリックアクセスブロック設定 がバケットまたはアカウントに適用されていないことを確認します。これらの設定は、パブリック読み取りアクセスを許可するアクセス権限を上書きできます。Amazon S3 ブロックパブリックアクセス設定は個々のバケットまたは AWS アカウントに適用できます。
バケット内のオブジェクトがパブリックにアクセス可能であることを確認する
Web サイトエンドポイントを使用するディストリビューションは、公開されているコンテンツのみをサポートします。S3 バケット内のオブジェクトがパブリックにアクセスできるかどうかを判断するには、S3 Web サイトエンドポイントのオブジェクト URL を Web ブラウザで開きます。または、URL で curl コマンドを実行します。
例:
http://DOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com/index.html
Web ブラウザまたは curl コマンドで Access Denied エラーが返される場合、そのオブジェクトはパブリックにアクセスできません。
パブリック読み取りアクセスを許可するには、次のタスクのいずれかを実行します。
- バケット内のすべてのオブジェクトにパブリック読み取りアクセスを許可するバケットポリシーを作成します。
- Amazon S3 コンソールを使用して、オブジェクトへのパブリック読み取りアクセスを許可します。
申請者による支払いオプションを確認
**[申請者による支払い]**がオンになっている場合は、このオプションをオフにします。申請者による支払いバケットでは、Web サイトエンドポイントを介したアクセスは許可されません。
カスタムヘッダーを確認
referer ヘッダーを使用して CloudFront から S3 Web サイトエンドポイントオリジンへのアクセスを制限する場合は、バケットポリシーを確認してください。S3 バケットポリシーに設定されているシークレット値またはトークンが CloudFront オリジンカスタムヘッダーの値と一致することを確認します。
バケットポリシーで明示的な拒否ステートメントを使用するには、referer ヘッダーに基づいてアクセスを許可する許可ステートメントが必要です。明示的な拒否ステートメントだけではアクセスを許可することはできません。
たとえば、次のバケットポリシーでは、リクエストに "aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER." という文字列が含まれている場合、S3 オリジンへのアクセスを許可します。
CloudFront オリジンカスタムヘッダーには次の設定が必要です。
- ヘッダー:referer
- 値: MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER
バケットポリシーの例:
{ "Version":"2012-10-17", "Id":"http referer policy example", "Statement":[ { "Sid":"Allow get requests originating from my CloudFront with referer header", "Effect":"Allow", "Principal":"*", "Action":"s3:GetObject", "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*", "Condition":{ "StringLike":{"aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER"} } } ] }
**注:**Principal はワイルドカード値 (("Principal":"*") なので、サンプルバケットポリシーではバケットへのパブリック (匿名) アクセスを許可しています。条件ステートメントのため、リクエストには referer ヘッダーを含める必要があり、ヘッダー値はバケットポリシーの値と一致する必要があります。条件ステートメントが満たされない場合、S3 オリジンにアクセスできません。
組織の管理アカウントを確認
AWS Organizations で組織の管理アカウントを使用して、拒否サービスコントロールポリシー (SCP) を確認してください。組織ルート、組織単位 (OU)、またはアカウントに直接添付されている s3: GetObject アクションの拒否ポリシーを確認してください。
関連情報
S3 REST API エンドポイントを CloudFront ディストリビューションのオリジンとして使用すると、「403 access denied」エラーが表示されるのはなぜですか?
CloudFront のエラー応答ステータスコードのトラブルシューティング
Amazon S3 からの「403 access denied」エラーをトラブルシューティングするにはどうすればよいですか?
CloudFront を使用して Amazon S3 でホストされている静的ウェブサイトを提供する方法を教えてください。
関連するコンテンツ
- 質問済み 5年前lg...
- 質問済み 7年前lg...
- 質問済み 5ヶ月前lg...
- AWS公式更新しました 1ヶ月前