Amazon S3 の静的ウェブサイト機能を使用するときに、Access Denied エラーが発生する理由を知りたいです。

所要時間2分
0

Amazon Simple Storage Service (Amazon S3) バケットを使用して S3 静的ウェブサイトのエンドポイントで静的ウェブサイトをホストすると、Access Denied エラーとなる理由を知りたいです。

解決策

Amazon S3 を使用して静的ウェブサイトをホストしようとして、Access Denied エラーが発生する場合は、次の要件を確認してください。

バケット内のオブジェクトはパブリックにアクセス可能である必要があります

S3 静的ウェブサイトのエンドポイントは、パブリックにアクセス可能なコンテンツのみをサポートします。ウェブブラウザでオブジェクトの URL を開き、S3 バケット内のオブジェクトがパブリックにアクセス可能かどうかを確認します。または、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 アクションへのパブリック読み取りアクセスをブロックする deny ステートメントがないことを確認します。バケットポリシーに s3:GetObject に対する明示的な allow ステートメントがある場合も、競合する明示的な deny ステートメントがないことを確認してください。常に、明示的な deny ステートメントは明示的な allow ステートメントをオーバーライドします。

次の手順を実行し、s3:GetObject のバケットポリシーを確認します。

  1. Amazon S3 コンソールを開きます。
  2. [アクセス許可] タブを選択します。
  3. [バケットポリシー] を選択します。
  4. バケットポリシーで、"Action": "s3:GetObject" または "Action": "s3:*" を含むステートメントを確認します。
  5. (オプション) バケットポリシーを変更します。たとえば、s3:GetObject へのパブリック読み取りアクセスをブロックするステートメントを削除または編集します。

バケットを所有する AWS アカウントは、オブジェクトも所有している必要があります

オブジェクトへのパブリック読み取りアクセスを許可するためには、バケットを所有する AWS アカウントがオブジェクトも所有している必要があります。バケットまたはオブジェクトは、そのバケットまたはオブジェクトを作成した AWS Identity and Access Management (IAM) アカウントが所有します。

注: オブジェクトの所有権の要件が、バケットポリシーによって付与されるパブリック読み取りアクセスに適用されます。オブジェクトのアクセスコントロールリスト (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 つのオブジェクトを示しています。複数のオブジェクトを確認するには、list コマンドを使用します。

  3. バケット所有者とオブジェクト所有者の正規 ID が一致しているかどうかを確認します。一致しない場合、バケットとオブジェクトの所有者が別であることを示します。
    注: Amazon S3 コンソールでバケットとオブジェクトの所有者を確認することもできます。所有者は、対応するバケットまたはオブジェクトの [アクセス許可] タブに表示されます。

  4. バケットとオブジェクト所有者の正規 ID が一致していない場合は、オブジェクトの所有者をバケットの所有者に変更します。
    オブジェクト所有者のアカウントから次のコマンドを実行して、オブジェクトに割り当てられた ACL アクセス許可を取得します。

    aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name

    オブジェクトに ACL アクセス許可 bucket-owner-full-control がない場合は、オブジェクト所有者のアカウントから次のコマンドを実行します。

    aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control

    オブジェクトに ACL アクセス許可 bucket-owner-full-control がある場合は、バケット所有者のアカウントから次のコマンドを実行します。このコマンドは、オブジェクトをそれ自体にコピーすることでオブジェクトの所有者を変更します。

    aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html --storage-class STANDARD

    匿名ユーザーまたは他の AWS アカウントによってアップロードされたオブジェクトの所有権を、S3 Object Ownership を使用して自動的にバケット所有者に付与することもできます。

バケット内のオブジェクトを AWS KMS で暗号化できない

AWS KMS は匿名リクエストをサポートしていません。したがって、匿名アクセスまたはパブリックアクセスを許可する Amazon S3 バケットは、AWS KMS で暗号化されたオブジェクトには適用されません。Amazon S3 静的ウェブサイトのエンドポイントを使用して提供するオブジェクトからは、KMS 暗号化を削除する必要があります。

注: AWS KMS 暗号化ではなく、AES-256 を使用してオブジェクトを暗号化します。

バケット内のオブジェクトが KMS で暗号化されているかどうかは、次の方法で確認できます。

  • Amazon S3 コンソールを使用してオブジェクトのプロパティを確認します。[暗号化] ダイアログボックスを確認します。AWS KMS を選択した場合、オブジェクトは AWS KMS で暗号化されています。
  • AWS コマンドラインインターフェイス (AWS CLI) を使用して head-object コマンドを実行します。コマンドで ServerSideEncryption が aws:kms と返される場合、オブジェクトは AWS 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 エラーが発生します。

head-object AWS CLI コマンドを実行すると、オブジェクトがバケットに存在するかどうかを確認できます。

注: 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 パブリックアクセスブロックが適用されていないことを確認します。これらの設定で、パブリック読み取りアクセスを許可するアクセス許可をオーバーライドすることができます。

AWS公式
AWS公式更新しました 6ヶ月前
コメントはありません

関連するコンテンツ