Amazon S3 の静的ウェブサイト機能を使用していますが、アクセス拒否エラーが発生します。なぜこのようなことが起こるのですか?
Amazon Simple Storage Service(Amazon S3)バケットを使用して、S3静的ウェブサイトエンドポイントで静的ウェブサイトをホストしています。アクセス拒否エラーが出るのはなぜですか?
簡単な説明
Amazon S3 を使用して静的ウェブサイトをホストしようとして、Access Denied エラーが表示される場合は、次の要件を確認してください:
- バケット内のオブジェクトは公開されている必要があります。
- S3バケットポリシーは, s3:GetObjectアクションへのアクセスを許可する必要があります。
- バケットを所有する AWS アカウントは、オブジェクトも所有している必要があります。
- オブジェクトは、AWS Key Management Service(AWS KMS)では暗号化できません。
- リクエストされるオブジェクトは、S3バケットに存在する必要があります。
- Amazon S3ブロックパブリックアクセスは、バケットおよびアカウントレベルで無効にする必要があります。
解決方法
バケット内のオブジェクトは公開されている必要がある
S3静的ウェブサイトエンドポイントは、公的にアクセス可能なコンテンツのみをサポートしますS3バケット内のオブジェクトが公開的ににアクセス可能かどうかを確認するには、WebブラウザーでオブジェクトのURLを開きます。または、URL に対してcURL コマンドを実行することもできます。
以下は、S3 オブジェクトの URL の例です。
http://doc-example-bucket.s3-website-us-east-1.amazonaws.com/index.html
ウェブブラウザまたはcURL コマンドが Access Denied エラーを返した場合、そのオブジェクトは公開的にアクセスできません。S3 オブジェクトへのパブリック読み取りアクセスを許可するには、 バケット内のすべてのオブジェクトに対するパブリック読み取りアクセスを許可するバケットポリシーを作成します。
S3バケットポリシーは、s3:GetObjectアクションへのアクセスを許可する必要があります
バケットポリシーを確認し、s3: GetObject アクションへのパブリック読み取りアクセスをブロックする拒否ステートメントがないことを確認します。バケットポリシーにs3:GetObjectに対する明示的な許可ステートメントがある場合でも、競合する明示的な拒否ステートメントがないことを確認してください。明示的な拒否ステートメントは常に明示的な許可ステートメントを上書きします。
s3: GetObject のバケットポリシーを確認するには、次の手順を実行します。
1. Amazon S3 コンソールを開きます。
2. [アクセス許可] タブを選択します。
3. [バケットポリシー] を選択します。
4. "Action": "s3:GetObject" or "Action": "s3:*". のステートメントのバケットポリシーを確認します。
5. (オプション) バケットポリシーを変更します。 たとえば、 s3:GetObjectへのパブリック読み取りアクセスをブロックするステートメントを削除または編集できます。
バケットを所有する AWS アカウントは、オブジェクトも所有する必要がある
オブジェクトへのパブリック読み取りアクセスを許可するには、バケットを所有するAWSアカウントもオブジェクトを所有している必要があります。バケットまたはオブジェクトは、そのバケットまたはオブジェクトを作成した AWS Identity and Access Management (IAM) ID のアカウントによって所有されます。
注: オブジェクト所有権の要件は、バケットポリシーによって付与されたパブリック読み取りアクセスに適用されます。オブジェクトのアクセスコントロールリスト (ACL) によって許可されたパブリック読み取りアクセスには適用されません。
Amazon S3バケットとオブジェクトが同じAWSアカウントによって所有されているかどうかを確認するには、次の手順を実行します:
1. バケット所有者の S3 正規 ID を取得するには、次のコマンドを使用します:
aws s3api list-buckets --query Owner.ID
2. オブジェクト所有者の S3 正規 ID を取得するには、以下のコマンドを使用します:
aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html
**注:**この例では、1 つのオブジェクトが表示されています。複数のオブジェクトをチェックするには、リスト コマンドを使用します。
3. バケット所有者とオブジェクト所有者の正規 ID が一致しているかどうかを確認します。正規 ID が一致しない場合、バケットとオブジェクトの所有者が異なります。
注: Amazon S3 コンソールを使用してバケットとオブジェクトの所有者を確認することもできます。所有者はそれぞれのバケットまたはオブジェクトの 許可 タブにあります。
4. バケットとオブジェクト所有者の正規IDが一致しない場合は、オブジェクトの所有者をバケット所有者に変更します。
オブジェクト所有者のアカウントから、次のコマンドを実行して、オブジェクトに割り当てられたACLアクセス許可を取得します:
aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name
オブジェクトに bucket-owner-full-control の ACL アクセス許可がない場合は、オブジェクトの所有者のアカウントから次のコマンドを実行します:
aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control
オブジェクトにbucket-owner-full-control ACL アクセス許可がある場合は、バケット所有者のアカウントから次のコマンドを実行します。このコマンドは、オブジェクトをそれ自体にコピーすることにより、オブジェクトの所有者を変更します:
aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html --storage-class STANDARD
また、 S3 Object Ownership を使用して、匿名ユーザーまたは他の AWS アカウントによってアップロードされたオブジェクトの所有権をバケット所有者に自動的に付与することもできます。
バケット内のオブジェクトを AWS KMS で暗号化することができない
AWS KMS は匿名リクエストをサポートしていません。 その結果、匿名アクセスまたはパブリックアクセスを許可する Amazon S3 バケットは、AWS KMS で暗号化されたオブジェクトには適用されません。Amazon S3 静的ウェブサイトエンドポイントを使用して提供するオブジェクトから KMS 暗号化を削除する必要があります。
注: AWS KMS での暗号化を使用する代わりに、AES-256 を使用してオブジェクトを暗号化できます。
バケット内のオブジェクトが次の方法を使用してKMS暗号化されているかどうかを確認できます:
- Amazon S3 コンソールを使用してオブジェクトのプロパティを表示します。暗号化ダイアログボックスを確認します。AWS-KMSが選択されている場合、オブジェクトは KMS 暗号化されています。
- AWS コマンドラインインターフェイス (AWS CLI) を使用して head-object コマンドを実行します。コマンドがServerSideEncryption を aws:kmsとして返す場合、オブジェクトは KMS 暗号化されています。
注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
Amazon S3 コンソールを使用してオブジェクトの暗号化設定を変更するには、「Amazon S3 の暗号化の指定」を参照してください。
AWS CLIを使用してオブジェクトの暗号化設定を変更するには、オブジェクトのバケットにデフォルトの暗号化がないことを確認します。バケットにデフォルトの暗号化がない場合は、オブジェクトをそれ自体にコピーして、オブジェクトの暗号化を削除します:
aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html --storage-class STANDARD
警告: オブジェクトを上書きコピーすると、 storage-class と website-redirect-location の設定が削除されます。これらの設定を新しいオブジェクトでも維持するには、コピーリクエストで storage-class または website-redirect-locationの値を明示的に指定してください。
リクエストされたオブジェクトは S3 バケットに存在する必要があります。
リクエストを実行するユーザーがs3:ListBucket許可を持っていない場合、ユーザーは不足しているオブジェクトに対してAccess Deniedエラーを受け取ります。
AWS CLI コマンド head-object を実行して、オブジェクトがバケットに存在するかどうかをチェックします。
**注:**S3 オブジェクト名では大文字と小文字が区別されます。リクエストに有効なオブジェクト名がない場合、Amazon S3 はオブジェクトが見つからないことを報告します。
オブジェクトがバケットに存在する場合、 Access Denied エラーは404 Not Foundエラーをマスクしていません。Access Deniedエラーを解決するには、他の設定要件を確認してください。
オブジェクトがバケットに存在しない場合、Access Denied エラーは404 Not Foundエラーをマスクしています。存在しないオブジェクトに関連する問題を解決します。
注: パブリックs3:ListBucketアクセスを有効にすることは、セキュリティ上のベストプラクティスではありません。パブリックs3:ListBucketアクセスを有効にすると、ユーザーはバケット内のすべてのオブジェクトを表示およびリスト化できます。これにより、ユーザーがオブジェクトをダウンロードするアクセス許可を持っていない場合でも、オブジェクトのメタデータの詳細 (キーやサイズなど) がユーザーに公開されます。
Amazon S3 ブロックパブリックアクセスを無効にする必要がある
Amazon S3 ブロックパブリックアクセス設定は、個々のバケットまたは AWS アカウントに適用できます。S3バケットまたはAWSアカウントのいずれにもAmazon S3ブロックパブリックアクセス設定が適用されていないことを確認します。これらの設定は、パブリック読み取りアクセスを可能にする許可を上書きできます。

関連するコンテンツ
- 質問済み 3年前lg...
- 質問済み 2ヶ月前lg...
- 質問済み 5年前lg...
- 質問済み 4年前lg...
- 質問済み 3ヶ月前lg...