Amazon S3 でのアクセス拒否 (403 Forbidden) エラーのトラブルシューティング - Amazon Simple Storage Service

Amazon S3 でのアクセス拒否 (403 Forbidden) エラーのトラブルシューティング

以下のトピックでは、Amazon S3 でのアクセス拒否 (403 Forbidden) エラーの最も一般的な原因について説明します。

注記

アクセス許可の問題のトラブルシューティングを行う場合は、「バケットポリシーと IAM ポリシー」セクションから始めて、「アクセス許可を確認するためのヒント」のガイダンスに必ず従ってください。

バケットポリシーと IAM ポリシー

バケットレベルの操作

バケットポリシーが設定されていない場合、バケットはバケット所有アカウントの任意のAWS Identity and Access Management (IAM) ID からのリクエストを暗黙的に許可します。また、バケットは、他の任意のアカウントからの他の IAM ID からのリクエストや、匿名の (署名されていない) リクエストを暗黙的に拒否します。ただし、IAM ユーザーポリシーが設定されていない場合、リクエスタは (ルートユーザーでない限り) リクエストを行うことを暗黙的に拒否されます。詳細については、IAM ユーザーガイドの「アカウント内でのリクエストの許可または拒否の決定」を参照してください。

オブジェクトレベルの操作

バケット所有アカウントがオブジェクトを所有している場合、バケットポリシーと IAM ユーザーポリシーは、オブジェクトレベルの操作でもバケットレベルの操作と同じように機能します。例えば、バケットポリシーが設定されていない場合、バケットはバケット所有アカウントの任意の IAM ID からのオブジェクトリクエストを暗黙的に許可します。また、バケットは、他の任意のアカウントの他の IAM ID からのオブジェクトリクエストや、匿名 (署名なし) リクエストを暗黙的に拒否します。ただし、IAM ユーザーポリシーが設定されていない場合、リクエスタは (ルートユーザーでない限り) オブジェクトリクエストを行うことを暗黙的に拒否されます。

オブジェクトが外部アカウントによって所有されている場合、オブジェクトへのアクセスはオブジェクトアクセスコントロールリスト (ACL) を通じてのみ許可されます。バケットポリシーと IAM ユーザーポリシーは、引き続きオブジェクトリクエストを拒否するために使用できます。

したがって、バケットポリシーまたは IAM ユーザーポリシーがアクセス拒否 (403 Forbidden) エラーを引き起こしていないことを確認するには、次の要件が満たされていることを確認してください。

  • 同じアカウントでアクセスする場合、バケットポリシーまたは IAM ユーザーポリシーのいずれにも、アクセス権限を付与するリクエスタに対する明示的な Deny 記述があってはなりません。バケットポリシーと IAM ユーザーポリシーのみを使用してアクセス権限を付与する場合は、これらのポリシーの 1 つに少なくとも 1 つの明示的な Allow ステートメントが必要です。

  • クロスアカウントアクセスの場合、バケットポリシーまたは IAM ユーザーポリシーのいずれにも、アクセス権限を付与するリクエスタに対する明示的な Deny 記述があってはなりません。バケットポリシーと IAM ユーザーポリシーのみを使用してクロスアカウントアクセス権限を付与する場合は、リクエスタのバケットポリシーと IAM ユーザーポリシーの両方に明示的な Allow ステートメントを含める必要があります。

注記

バケットポリシーの Allow ステートメントは、同じバケット所有アカウントが所有するオブジェクトにのみ適用されます。ただし、バケットポリシーの Deny ステートメントは、オブジェクトの所有権に関係なくすべてのオブジェクトに適用されます。

バケットポリシーを確認または編集する方法
注記

バケットポリシーを表示または編集するには、s3:GetBucketPolicy アクセス許可が必要です。

  1. AWS Management Console にサインインし、Amazon S3 コンソール https://console.aws.amazon.com/s3/ を開きます。

  2. 左側のナビゲーションペインで、[バケット] を選択します。

  3. [バケット] リストで、バケットポリシーを表示または編集するバケットの名前を選択します。

  4. [アクセス許可] タブを選択します。

  5. [バケットポリシー][編集] を選択します。[Edit bucket policy] (バケットポリシーを編集) ページが表示されます。

AWS Command Line Interface (AWS CLI) を使用してバケットポリシーを確認または編集するには、get-bucket-policy コマンドを使用します。

注記

バケットポリシーが正しくないためにバケットからロックアウトされた場合は、ルートユーザーの認証情報を使用して AWS Management Console にサインインします。バケットへのアクセスを回復するには、必ずルートユーザーの認証情報を使用してバケットポリシーを削除してください。

アクセス許可を確認するためのヒント

リクエスタが Amazon S3 オペレーションを実行するための適切な権限を持っているかどうかを確認するには、以下を試してください。

Amazon S3 ACL 設定

ACL 設定を確認するときは、まずオブジェクト所有権の設定を確認して、バケットで ACL が有効になっているかどうかを確認してください。ACL 権限は権限を付与するためにのみ使用でき、リクエストを拒否するためには使用できないことに注意してください。また、バケットポリシーや IAM ユーザーポリシーでの明示的拒否によって拒否されたリクエスタにアクセス権を付与するために ACL を使用することもできません。

オブジェクト所有権設定にバケット所有者強制を設定

バケット所有者強制設定が有効になっている場合、この設定によってバケットとオブジェクトに適用されるすべての ACL が無効になるため、ACL 設定によってアクセス拒否 (403 Forbidden) エラーが発生する可能性はほとんどありません。Amazon S3 バケットのデフォルト (および推奨) 設定は、バケット所有者強制です。

オブジェクト所有権設定にバケット所有者優先またはオブジェクト作成者を設定

ACL 権限は、バケット所有者優先設定またはオブジェクト作成者設定でも引き続き有効です。ACL には、バケット ACL とオブジェクト ACL の 2 種類があります。この 2 種類の ACL の違いについては、「ACL アクセス許可とアクセスポリシーのアクセス許可のマッピング」を参照してください。

拒否されたリクエストのアクションに応じて、以下のようにバケットまたはオブジェクトの ACL 権限を確認してください

  • Amazon S3 が LISTPUT オブジェクト、GetBucketAcl、または PutBucketAcl リクエストを拒否した場合は、バケットの ACL 権限を確認してください。

    注記

    バケット ACL 設定で GET オブジェクト権限を付与することはできません。

  • Amazon S3 が S3 オブジェクトの GET リクエスト、または PutObjectAcl リクエストを拒否した場合は、そのオブジェクトの ACL 権限を確認してください

    重要

    オブジェクトを所有するアカウントがバケットを所有するアカウントと異なる場合、オブジェクトへのアクセスはバケットポリシーによって制御されません。

クロスアカウントによるオブジェクト所有権である場合の、GET オブジェクトリクエストによるアクセス拒否 (403 Forbidden) エラーのトラブルシューティング

バケットのオブジェクト所有権設定を確認して、オブジェクト所有者を判断します。オブジェクト ACL へのアクセス権限がある場合は、オブジェクト所有者のアカウントを確認することもできます。(オブジェクト所有者のアカウントを表示するには、Amazon S3 コンソールでオブジェクト ACL 設定を確認します)。または、GetObjectAcl リクエストを実行してオブジェクト所有者の正規 ID を検索し、オブジェクト所有者のアカウントを確認することもできます。デフォルトでは、ACL はオブジェクト所有者のアカウントへの GET リクエストに対する明示的な許可権限を付与します。

オブジェクト所有者がバケット所有者と異なることを確認してから、ユースケースとアクセスレベルに応じて、次のいずれかの方法を選択してアクセス拒否 (403 Forbidden) エラーに対処します。

  • ACL を無効にする (推奨) - この方法はすべてのオブジェクトに適用され、バケット所有者が実行できます。この方法では、バケット所有者に所有権が自動的に与えられ、バケット内のすべてのオブジェクトを完全に制御できます。この方法を実行する前に、ACL を無効にする前提条件を確認します。バケット所有者強制 (推奨) モードにバケットを設定する方法については、「既存のバケットでのオブジェクトの所有権の設定」を参照してください。

    重要

    アクセス拒否 (403 Forbidden) エラーを防ぐには、ACL を無効にする前に、必ず ACL 権限をバケットポリシーに移行してください。詳細については、「ACL 権限からの移行に関するバケットポリシーの例」を参照してください。

  • オブジェクト所有者をバケット所有者に変更 - この方法は個々のオブジェクトに適用できますが、オブジェクトの所有権を変更できるのはオブジェクト所有者 (または適切な権限を持つユーザー) のみです。追加の PUT コストが適用される場合があります。(詳細については、「Amazon S3 の料金」を参照してください)。この方法では、バケット所有者にオブジェクトの完全な所有権が付与され、バケット所有者はバケットポリシーを通じてオブジェクトへのアクセスを制御できます。

    オブジェクトの所有権を変更するには、以下のいずれかを実行します。

    • バケット所有者はオブジェクトをコピーしてバケットに戻すことができます。

    • バケットのオブジェクト所有権設定を「バケット所有者優先」に変更できます。バージョニングを無効にすると、バケット内のオブジェクトは上書きされます。バージョニングが有効になっている場合、同じオブジェクトの重複バージョンがバケットに表示され、バケット所有者はライフサイクルルールを期限切れに設定できます。オブジェクト所有権設定を変更する方法については、「既存のバケットでのオブジェクトの所有権の設定。」を参照してください。

      注記

      オブジェクト所有権の設定をバケット所有者優先に更新すると、その設定はバケットにアップロードされた新しいオブジェクトにのみ適用されます。

    • bucket-owner-full-control 既定オブジェクト ACL を使用して、オブジェクト所有者にオブジェクトを再度アップロードさせることができます。

    注記

    クロスアカウントアップロードの場合、バケットポリシーで bucket-owner-full-control 既定オブジェクト ACL を要求することもできます。バケットポリシーの例については、バケット所有者はフルコントロール権限を持ちながら、オブジェクトをアップロードするためのクロスアカウントアクセス許可を付与するを参照してください。

  • オブジェクト作成者をオブジェクト所有者のままにする - この方法ではオブジェクトの所有者は変更されませんが、オブジェクトへのアクセス権限を個別に付与できます。オブジェクトへのアクセス権限を付与するには、そのオブジェクトに対する PutObjectAcl 権限が必要です。次に、アクセス拒否 (403 Forbidden) エラーを修正するために、リクエスタをオブジェクトの ACL 内のオブジェクトへのアクセス権限付与者として追加します。詳細については、「ACL の設定」を参照してください。

S3 ブロックパブリックアクセス設定

失敗したリクエストにパブリックアクセスまたはパブリックポリシーが含まれる場合は、アカウント、バケット、または S3 アクセスポイントの S3 ブロックパブリックアクセス設定を確認してください。2023 年 4 月以降、デフォルトで新しいバケットに対してすべてのブロックパブリックアクセス設定が有効になります。Amazon S3 が「パブリック」を定義する方法の詳細については、「「パブリック」の意味」を参照してください。

TRUE に設定すると、ブロックパブリックアクセス設定は明示的な拒否ポリシーとして機能し、ACL、バケットポリシー、IAM ユーザーポリシーで許可されている権限よりも優先されます。ブロックパブリックアクセス設定がリクエストを拒否しているかどうかを判断するには、以下のシナリオを確認してください。

  • 指定されたアクセスコントロールリスト (ACL) がパブリックである場合は、BlockPublicAcls 設定によって PutBucketAcl および PutObjectACL コールが拒否されます。

  • リクエストにパブリック ACL が含まれている場合は、BlockPublicAcls 設定によって PutObject コールが拒否されます。

  • あるアカウントに BlockPublicAcls 設定が適用され、リクエストにパブリック ACL が含まれている場合は、パブリック ACL を含む CreateBucket コールはすべて失敗します。

  • リクエストの許可がパブリック ACL によってのみ付与されている場合は、IgnorePublicAcls 設定によってリクエストが拒否されます。

  • 指定されたバケットポリシーでパブリックアクセスが許可されている場合は、BlockPublicPolicy 設定によって PutBucketPolicy コールが拒否されます。

  • BlockPublicPolicy 設定がアクセスポイントに適用されている場合は、パブリックポリシーを指定し、アクセスポイント経由で実行される PutAccessPointPolicy および PutBucketPolicy コールは失敗します。

  • アクセスポイントまたはバケットにパブリックポリシーが設定されている場合は、RestrictPublicBuckets 設定によって AWS のサービス プリンシパルを除くすべてのクロスアカウントコールが拒否されます。この設定では、匿名 (または署名なし) のコールもすべて拒否されます。

ブロックパブリックアクセスの設定を確認および更新するには、「S3 バケットへのパブリックアクセスブロック設定の構成」を参照してください。

Amazon S3 の暗号化設定

Amazon S3 はバケットのサーバー側暗号化をサポートしています。サーバー側の暗号化とは、データを受信するアプリケーションまたはサービスによって、送信先でデータを暗号化することです。Amazon S3 は、AWS データセンターのディスクに書き込まれるときにデータをオブジェクトレベルで暗号化し、お客様がデータにアクセスするときに復号します。

デフォルトで、Amazon S3 では、Amazon S3 のすべてのバケットに対する基本レベルの暗号化として、Amazon S3 マネージドキーによるサーバー側の暗号化 (SSE-S3) が適用されるようになりました。Amazon S3 では、オブジェクトをアップロードするときにサーバー側を暗号化する方法も指定できます。

バケットのサーバー側暗号化ステータスと暗号化設定を確認する方法
  1. AWS Management Console にサインインし、Amazon S3 コンソール https://console.aws.amazon.com/s3/ を開きます。

  2. 左側のナビゲーションペインで、[バケット] を選択します。

  3. [バケット] リストで、暗号化設定を確認するバケットを選択します。

  4. プロパティ タブを選択します。

  5. [デフォルトの暗号化] セクションまでスクロールして、[暗号化タイプ] 設定を表示します。

AWS CLI を使用して暗号化設定を確認するには、get-bucket-encryption コマンドを使用します。

オブジェクトの暗号化状態を確認する方法
  1. AWS Management Console にサインインし、Amazon S3 コンソール https://console.aws.amazon.com/s3/ を開きます。

  2. 左側のナビゲーションペインで、[バケット] を選択します。

  3. [バケット] リストで、オブジェクトが含まれるバケットの名前を選択します。

  4. [オブジェクト] リストで、暗号化を追加または変更するオブジェクトの名前を選択します。

    オブジェクトの詳細ページが表示されます。

  5. [サーバー側の暗号化設定] セクションまでスクロールすると、オブジェクトのサーバー側暗号化設定が表示されます。

AWS CLI を使用してオブジェクト暗号化ステータスを確認するには、head-object コマンドを使用します。

暗号化とアクセス許可の要件

Amazon S3 では 3 種類のサーバー側暗号化がサポートされます。

  • Amazon S3 マネージドキーを用いたサーバー側の暗号化 (SSE-S3)

  • AWS Key Management Service (AWS KMS) キー (SSE-KMS) によるサーバー側の暗号化

  • 顧客提供のキーを用いたサーバー側の暗号化 (SSE-C)。

暗号化設定に基づいて、以下のアクセス許可要件が満たされていることを確認します。

  • SSE-S3 - 追加の権限は必要ありません。

  • SSE-KMS (カスタマー管理キーを使用) - オブジェクトをアップロードするには、AWS KMS key に kms:GenerateDataKey 権限が必要です。オブジェクトをダウンロードしてオブジェクトのマルチパートアップロードを実行するには、KMS キーに kms:Decrypt 権限が必要です。

  • SSE-KMS (AWS マネージドキー を使用) - リクエスタは aws/s3 KMS キーを所有しているのと同じアカウントに属している必要があります。また、リクエスタはオブジェクトにアクセスするための正しい Amazon S3 権限を持っている必要があります。

  • SSE-C (お客様提供のキーを使用) - 追加の権限は必要ありません。バケットポリシーを設定すると、バケットのオブジェクトに対してお客様が用意した暗号化キーでサーバー側の暗号化をリクエストおよび制限できます

オブジェクトがカスタマーマネージドキーで暗号化されている場合は、KMS キーポリシーによって kms:GenerateDataKey または kms:Decrypt アクションの実行が許可されていることを確認してください。KMS キーポリシーを確認する手順については、AWS Key Management Service デベロッパーガイドの「キーポリシーの表示」を参照してください。

S3 オブジェクトロック設定

バケットで S3 オブジェクトロックが有効で、オブジェクトが保持期間またはリーガルホールドで保護されている場合、オブジェクトを削除しようとすると Amazon S3 はアクセス拒否 (403 Forbidden) エラーを返します。

バケットでオブジェクトロックが有効になっているかどうかを確認する方法
  1. AWS Management Console にサインインし、Amazon S3 コンソール https://console.aws.amazon.com/s3/ を開きます。

  2. 左側のナビゲーションペインで、[バケット] を選択します。

  3. [バケット] リストで、確認するバケットの名前を選択します。

  4. プロパティ タブを選択します。

  5. [オブジェクトロック] セクションまでスクロールします。[オブジェクトロック] 設定が [有効] または [無効] であるかを確認します。

オブジェクトが保持期間またはリーガルホールドで保護されているかを判断するには、オブジェクトのロック情報を参照します。

オブジェクトが保持期間またはリーガルホールドで保護されている場合は、次の点を確認します。

  • オブジェクトバージョンがコンプライアンス保存モードで保護されている場合、それを完全に削除する方法はありません。ルートユーザーを含む、任意のリクエスタからの永続的な DELETE リクエストは、アクセス拒否 (403 Forbidden) エラーになります。また、コンプライアンス保持モードで保護されているオブジェクトの DELETE リクエストを送信すると、Amazon S3 はそのオブジェクトの削除マーカーを作成することに注意してください。

  • オブジェクトバージョンがガバナンス保持モードで保護されていて s3:BypassGovernanceRetention 権限がある場合は、保護をバイパスしてバージョンを完全に削除できます。詳細については、「ガバナンスモードのバイパス」を参照してください。

  • オブジェクトバージョンがリーガルホールドで保護されている場合は、永久 DELETE リクエストを実行するとアクセス拒否 (403 Forbidden) エラーが発生する可能性があります。オブジェクトバージョンを永久に削除するには、オブジェクトバージョンのリーガルホールドを解除する必要があります。リーガルホールドを解除するには、s3:PutObjectLegalHold 許可が必要です。リーガルホールドの解除の詳細については、「オブジェクトロックの設定」を参照してください。

VPC エンドポイントポリシー

仮想プライベートクラウド (VPC) エンドポイントを使用して Amazon S3 にアクセスする場合は、VPC エンドポイントポリシーによって Amazon S3 リソースへのアクセスがブロックされていないことを確認します。デフォルトでは、VPC エンドポイントポリシーは Amazon S3 へのすべてのリクエストを許可します。特定のリクエストを制限するように VPC エンドポイントポリシーを設定することもできます。VPC エンドポイントポリシーを確認する方法については、AWS PrivateLink ガイドの「エンドポイントポリシーを使用して VPC エンドポイントへのアクセスを制御する」を参照してください。

AWS Organizations ポリシー

あなたの AWS アカウント が組織に所属している場合、AWS Organizations ポリシーによって Amazon S3 リソースへのアクセスがブロックされる場合があります。デフォルトでは、AWS Organizations ポリシーは Amazon S3 へのリクエストをブロックしません。ただし、AWS Organizations ポリシーが S3 バケットへのアクセスをブロックするように設定されていないことを確認してください。AWS Organizations ポリシーを確認する手順については、AWS Organizations ユーザーガイドの「すべてのポリシーの一覧表示」を参照してください。

アクセスポイント設定

Amazon S3 Access Points 経由でリクエストを行っているときにアクセス拒否 (403 Forbidden) エラーが表示される場合は、次の点を確認する必要がある場合があります。

  • アクセスポイントの設定

  • アクセスポイントに使用される IAM ユーザーポリシー

  • クロスアカウントアクセスポイントの管理または設定に使用されるバケットポリシー

アクセスポイントの設定とポリシー
  • アクセスポイントを作成するときに、インターネットまたは VPC をネットワークオリジンとして指定できます。ネットワークオリジンが VPC のみに設定されている場合、Amazon S3 は指定 VPC 以外のアクセスポイントへのリクエストをすべて拒否します。アクセスポイントのネットワークオリジンを確認するには、Virtual Private Cloud に制限されたアクセスポイントの作成 を参照してください。

  • アクセスポイントでは、カスタムのブロックパブリックアクセス設定を構成することもできます。これは、バケットレベルまたはアカウントレベルのブロックパブリックアクセス設定と同様に機能します。カスタムのブロックパブリックアクセス設定を確認する方法は、「アクセスポイントへのパブリックアクセスの管理」を参照してください。

  • アクセスポイントを使用して Amazon S3 へのリクエストを正常に行うには、リクエスタが必要な IAM 権限を持っていることを確認します。詳細については、「アクセスポイントを使用するための IAM ポリシーの設定」を参照してください。

  • リクエストにクロスアカウントアクセスポイントが含まれる場合、バケット所有者がアクセスポイントからのリクエストを許可するようにバケットポリシーを更新済みであることを確認します。詳細については、「クロスアカウントアクセスポイントへのアクセス許可の付与」を参照してください。

このトピックのすべての項目を確認してもアクセス拒否 (403 Forbidden) エラーが解決しない場合は、Amazon S3 リクエスト ID を取得して、追加ガイダンスについて AWS Support まで問い合わせてください。