Amazon S3 ストレージへのパブリックアクセスのブロック - Amazon Simple Storage Service

Amazon S3 ストレージへのパブリックアクセスのブロック

Amazon S3 のパブリックアクセスブロック機能は、Amazon S3 のリソースへのパブリックアクセスの管理に役立つ、アクセスポイント、バケット、アカウントの設定を提供します。デフォルトでは、新しいバケット、アクセスポイント、およびオブジェクトはパブリックアクセスを許可しません。ただし、ユーザーはバケットポリシー、アクセスポイントポリシー、またはオブジェクトのアクセス許可を変更することで、パブリックアクセスを許可できます。S3 ブロックパブリックアクセス設定は、これらのポリシーやアクセス許可を上書きして、これらのリソースへのパブリックアクセスを制限できるようにします。

S3 のパブリックアクセスブロックでは、アカウント管理者やバケット所有者は Amazon S3 のリソースへのパブリックアクセスを制限する一元的な管理を簡単に設定して、リソースがどのように作成されたかに関係なく強制的に適用することができます。

Amazon S3 はバケットやオブジェクトへのアクセスのリクエストを受け取ると、バケットやバケット所有者のアカウントに適用されているパブリックアクセスブロック設定があるかどうかを確認します。リクエストがアクセスポイントを経由している場合、Amazon S3 はアクセスポイントのパブリックアクセスブロック設定も確認します。リクエストされたアクセスを禁止する既存のパブリックアクセスブロック設定がある場合、Amazon S3 はそのリクエストを拒否します。

Amazon S3 のパブリックアクセスブロックには、4 つの設定があります。これらの設定は、独立しており、任意の組み合わせで使用できます。各設定は、アクセスポイント、バケット、または AWS アカウント 全体に適用できます。アクセスポイント、バケット、アカウントのパブリックアクセスブロック設定が異なる場合、Amazon S3 は、アクセスポイント、バケット、アカウントの設定の組み合わせで最も制限が厳しいものを適用します。

Amazon S3 は、パブリックアクセスブロック設定でオペレーションが禁止されているかどうかを評価し、アクセスポイント、バケット、アカウントの設定に違反しているすべてのリクエストを拒否します。

警告

パブリックアクセスは、アクセスコントロールリスト (ACL)、アクセスポイントポリシー、バケットポリシー、またはそのすべてからバケットおよびオブジェクトに付与されます。Amazon S3 のすべてのアクセスポイント、バケット、オブジェクトへのパブリックアクセスを確実にブロックするために、アカウントへのパブリックアクセスをブロックする 4 つの設定をすべて有効にすることをお勧めします。これらの設定によって、現在および将来のバケットおよびアクセスポイントのパブリックアクセスはすべてブロックされます。

これらの設定を適用する前に、アプリケーションがパブリックアクセスなしで正しく動作することを確認してください。「Amazon S3 を使用して静的ウェブサイトをホスティングする」に示す静的なウェブサイトをホストする場合など、バケットやオブジェクトにある程度のパブリックアクセスが必要な場合は、ストレージのユースケースに合わせて個別に設定をカスタマイズできます。

注記
  • パブリックアクセスブロック設定は、アクセスポイント、バケット、 AWS アカウント に対してのみ有効にすることができます。Amazon S3 では、オブジェクトごとのパブリックアクセスブロック設定はサポートされていません。

  • アカウントにブロックパブリックアクセス設定を適用すると、その設定はすべての AWS リージョン にグローバルに適用されます。設定はすべてのリージョンで即時または同時に有効になるわけではありませんが、最終的にはすべてのリージョンに反映されます。

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

S3 のブロックパブリックアクセスには 4 つの設定があります。これらの設定は、個別のアクセスポイント、バケット、または AWS アカウント 全体に任意の組み合わせで適用できます。設定をアカウントに適用すると、その設定はアカウントが所有するすべてのバケットとアクセスポイントに適用されます。同様に、設定をバケットに適用すると、その設定はバケットに関連付けられているすべてのアクセスポイントに適用されます。

次の表に、利用可能な設定が含まれます。

名前 説明
BlockPublicAcls

このオプションを TRUE に設定すると、次のように動作します。

  • 指定されたアクセスコントロールリスト (ACL) がパブリックの場合、PUT Bucket acl 呼び出しと PUT Object acl 呼び出しは失敗します。

  • リクエストにパブリック ACL が含まれていると、PUT Object 呼び出しは失敗します。

  • この設定がアカウントに適用されている場合、リクエストにパブリック ACL が含まれていると PUT Bucket の呼び出しは失敗します。

この設定が TRUE に設定されている場合、指定された操作は失敗します (REST API、AWS CLI、または AWS SDK のいずれを介して行われたかにかかわらず)。ただし、バケットとオブジェクトの既存のポリシーと ACL は変更されません。この設定により、パブリックアクセスから保護しながら、バケットとオブジェクトの既存のポリシーと ACL を監査、絞り込み、またはその他の方法で変更することができます。

注記

アクセスポイントには ACL が関連付けられていません。この設定をアクセスポイントに適用すると、基になるバケットへのパススルーとして機能します。この設定がアクセスポイントで有効になっている場合、このアクセスポイントを介したリクエストは、基になるバケットでこの設定が実際に有効になっているかどうかに関係なく、この設定がバケットで有効になっているかのように動作します。

IgnorePublicAcls

このオプションを TRUE に設定すると、Amazon S3 はバケットとそれに含まれるオブジェクトのすべてのパブリック ACL を無視します。この設定を使用すると、パブリック ACL を含む PUT Object 呼び出しを許可しながら、ACL によって許可されたパブリックアクセスを安全にブロックできます (BlockPublicAcls はパブリック ACL を含む PUT Object 呼び出しを拒否します)。この設定を有効にしても、既存の ACL の永続性には影響せず、新しいパブリック ACL の設定も妨げられません。

注記

アクセスポイントには ACL が関連付けられていません。この設定をアクセスポイントに適用すると、基になるバケットへのパススルーとして機能します。この設定がアクセスポイントで有効になっている場合、このアクセスポイントを介したリクエストは、基になるバケットでこの設定が実際に有効になっているかどうかに関係なく、この設定がバケットで有効になっているかのように動作します。

BlockPublicPolicy

バケットに対してこのオプションを TRUE に設定すると、Amazon S3 は、指定されたバケットポリシーでパブリックアクセスが許可されている場合に、PUT バケットポリシーの呼び出しを拒否します。また、指定されたポリシーでパブリックアクセスが許可されている場合に、バケットのすべてのアクセスポイントで PUT アクセスポイントポリシーの呼び出しを拒否します。アクセスポイントに対してこのオプションを TRUE に設定すると、Amazon S3 は、指定されたポリシー (アクセスポイントまたは基になるバケットのいずれかのポリシー) がパブリックである場合に、アクセスポイントを経由した PUT アクセスポイントポリシーと PUT バケットポリシーの呼び出しを拒否します。

この設定により、バケットやバケット内のオブジェクトをパブリックに共有することを許可することなく、アクセスポイントとバケットポリシーを管理することをユーザーに許可できます。この設定を有効にしても、既存のアクセスポイントやバケットポリシーには影響しません。

重要

この設定を効果的に使用するには アカウント レベルで適用する必要があります。バケットポリシーでは、ユーザーがバケットのブロックパブリックアクセス設定を変更できます。そのため、バケットポリシーを変更する権限を持つユーザーは、バケットのブロックパブリックアクセス設定を無効にすることを許可するポリシーを挿入できます。この設定が特定のバケットではなくアカウント全体で有効になっている場合、ユーザーがこの設定を無効にするようにバケットポリシーを変更しても、Amazon S3 はパブリックポリシーをブロックします。

RestrictPublicBuckets

このオプションをTRUE に設定すると、パブリックポリシーを持つアクセスポイントやバケットへのアクセスは、バケット所有者のアカウント内の AWS のサービスプリンシパルと承認されたユーザーのみに制限されます。この設定は、アカウント内のユーザーにアクセスポイントやバケットの管理を許可しながら、アクセスポイントやバケットへのすべてのクロスアカウントアクセス (AWS のサービスプリンシパルによるアクセスを除く) をブロックします。

この設定を有効にしても、既存のアクセスポイントポリシーやバケットポリシーには影響しません。ただし、Amazon S3 は、特定のアカウントへのパブリックではない委任を含むパブリックアクセスポイントポリシーやパブリックバケットポリシーから派生したパブリックアクセスやクロスアカウントアクセスをブロックします。

重要
  • GET Bucket acl および GET Object acl を呼び出すと、指定されたバケットまたはオブジェクトに対して有効なアクセス許可が常に返されます。たとえば、パブリックアクセスを許可する ACL がバケットにあり、そのバケットにも IgnorePublicAcls 設定が有効になっているとします。この場合、GetBucketAcl は、バケットに関連付けられている実際の ACL ではなく、Amazon S3 が強制的に適用しているアクセス許可を反映した ACL を返します。

  • ブロックパブリックアクセス設定は既存のポリシーまたは ACL を変更しません。そのため、ブロックパブリックアクセス設定を削除しても、パブリックポリシーまたは ACL を持つバケットまたはオブジェクトは再びパブリックにアクセス可能になります。

アクセスポイントでのパブリックアクセスブロックオペレーションの実行

アクセスポイントに対してブロックパブリックアクセスオペレーションを実行するにはAWS CLI サービス s3control を使用します。現在、アクセスポイントの作成後はアクセスポイントのブロックパブリックアクセス設定を変更できないことに注意してください。したがって、アクセスポイントのブロックパブリックアクセス設定を指定する唯一の方法は、アクセスポイントの作成時に設定を含めることです。

「パブリック」の意味

Buckets

  • ACL

    • Amazon S3 は、バケットやオブジェクトの ACL が事前定義済みの AllUsers グループまたは AuthenticatedUsers グループのメンバーにアクセス許可を付与する場合にパブリックとみなします。事前定義済みのグループの詳細については、「Amazon S3 の事前定義済みのグループ」を参照してください。

  • ポリシー

    • バケットポリシーを評価する場合、Amazon S3 はまずポリシーがパブリックであると想定します。その後、ポリシーを評価して非パブリックとしての資格があるかどうかを判断します。非パブリックと見なすには、バケットポリシーで、次のうち 1 つ以上の固定値 (ワイルドカードを含まない値) にのみアクセスを許可する必要があります。

      • aws:SourceIp を使用した一連のクラスレスドメイン間ルーティング (CIDR)。CIDR の詳細については、RFC Editor のウェブサイトで RFC 4632 を参照してください。

      • AWS プリンシパル、ユーザー、ロール、またはサービスプリンシパル (例: aws:PrincipalOrgID)

      • aws:SourceArn

      • aws:SourceVpc

      • aws:SourceVpce

      • aws:SourceOwner

      • aws:SourceAccount

      • s3:x-amz-server-side-encryption-aws-kms-key-id

      • aws:userid、「」パターンの外側AROLEID:*

      • s3:DataAccessPointArn

        注記

        この値をバケットポリシーで使用すると、アカウント ID が固定されている限り、ポリシーをパブリックにすることなく、アクセスポイント名にワイルドカードを含めることができます。たとえば、arn:aws:s3:us-west-2:123456789012:accesspoint/* へのアクセスを許可すると、バケットポリシーをパブリックにすることなく、リージョン 123456789012 のアカウント us-west-2 に関連付けられているすべてのアクセスポイントへのアクセスを許可できます。この動作は、アクセスポイントポリシーでは異なることに注意してください。詳細については、「アクセスポイント」を参照してください。

      • s3:DataAccessPointAccount

    • これらのルールでは、次のポリシー例はパブリックと見なされます。

      { "Principal": { "Federated": "graph.facebook.com" }, "Resource": "*", "Action": "s3:PutObject", "Effect": "Allow" }
      { "Principal": "*", "Resource": "*", "Action": "s3:PutObject", "Effect": "Allow" }
      { "Principal": "*", "Resource": "*", "Action": "s3:PutObject", "Effect": "Allow", "Condition": { "StringLike": {"aws:SourceVpc": "vpc-*"}} }

      これらのポリシーは、固定値を使用して、前述のいずれかの条件キーを含めることによって非パブリックにすることができます。たとえば、上記の最後のポリシーは、次のように aws:SourceVpc を固定値に設定することで非パブリックにすることができます。

      { "Principal": "*", "Resource": "*", "Action": "s3:PutObject", "Effect": "Allow", "Condition": {"StringEquals": {"aws:SourceVpc": "vpc-91237329"}} }
    • バケットポリシーの詳細については、「バケットポリシーとユーザーポリシー」を参照してください。

Example

この例では、Amazon S3 がパブリックと非パブリックの両方のアクセス許可を含むバケットポリシーを評価する方法を示します。

バケットに一連の固定プリンシパルへのアクセスを許可するポリシーがあるとします。前述のルールの下では、このポリシーはパブリックではありません。したがってRestrictPublicBuckets 設定を有効にしても、ポリシーは記述どおりに有効になります。これは、RestrictPublicBuckets はパブリックポリシーを持つバケットにのみ適用されるためです。ただし、パブリックステートメントをポリシーに追加すると、RestrictPublicBuckets はバケットに有効になります。これにより、AWS サービスプリンシパルとバケット所有者のアカウントの認証されたユーザーのみがバケットにアクセスできるようになります。

たとえば、「アカウント - 1」が所有するバケットに次の内容を含むポリシーがあるとします。

  1. AWS CloudTrail (AWS サービスプリンシパル) へのアクセスを許可するステートメント

  2. 「アカウント - 2」アカウントへのアクセスを許可するステートメント

  3. "Principal": "*" 制限なしで Condition などを指定して、パブリックへのアクセスを許可するステートメント

このポリシーは、3 番目のステートメントのためにパブリックとしての資格があります。このポリシーがあって RestrictPublicBuckets を有効にすると、Amazon S3 は CloudTrail によるアクセスのみを許可します。ステートメント 2 がパブリックでなくても、Amazon S3 は「アカウント - 2」によるアクセスを無効にします。これは、ステートメント 3 がポリシー全体をパブリックにレンダリングするため、RestrictPublicBuckets が適用されるためです。その結果、ポリシーで特定のアカウントの「アカウント - 2」にアクセスが委任されていても、Amazon S3 はクロスアカウントアクセスを無効にします。しかし、ポリシーからステートメント 3 を削除した場合、そのポリシーはパブリックとして認められず、RestrictPublicBuckets は適用されなくなります。したがって、RestrictPublicBuckets を有効のままにしていても、「アカウント - 2」はバケットへのアクセスを再取得できます。

アクセスポイント

Amazon S3 がパブリックアクセスブロック設定を評価する方法は、バケットとアクセスポイントで少しだけ異なります。アクセスポイントポリシーがパブリックであることを確認するために Amazon S3 が適用するルールは、通常、アクセスポイントでもバケットと同じですが、次の場合を除きます。

  • VPC ネットワークオリジンを持つアクセスポイントは、アクセスポイントポリシーの内容に関係なく、常に非パブリックと見なされます。

  • s3:DataAccessPointArn を使用して一連のアクセスポイントへのアクセスを許可するアクセスポイントポリシーは、パブリックと見なされます。この動作は、バケットポリシーとは異なることに注意してください。たとえば、s3:DataAccessPointArn と一致する arn:aws:s3:us-west-2:123456789012:accesspoint/* の値へのアクセスを許可するバケットポリシーは、パブリックと見なされません。ただし、アクセスポイントポリシーにおける同じステートメントは、アクセスポイントをパブリックと見なします。

Access Analyzer for S3 を使用したパブリックバケットの確認

Access Analyzer for S3 を使用して、パブリックアクセスを許可するバケットの ACL、バケットポリシー、またはアクセスポイントポリシーを持つバケットを確認できます。Access Analyzer for S3 は、インターネットの任意のユーザーや他の AWS アカウント (組織外の AWS アカウント を含む) にアクセスを許可するように設定されている バケットに関して警告します。パブリックバケットまたは共有バケットごとに、パブリックアクセスや共有アクセスのソースとレベルを報告する結果が送信されます。

結果に示された知識を駆使して、迅速かつ正確な是正措置を取ることができます。Access Analyzer for S3 では、バケットへのすべてのパブリックアクセスをワンクリックでブロックすることができます。また、バケットレベルのアクセス許可の設定を参照して、きめ細かいアクセスレベルを設定することもできます。パブリックアクセスまたは共有アクセスを必要とする特定の検証済みユースケースについては、バケットの調査結果をアーカイブすることで、バケットをパブリックまたは共有とすることを確定して記録できます。

まれに、Amazon S3 のパブリックアクセスブロックの評価でパブリックと報告されたバケットが Access Analyzer for S3 では何も報告されない場合があります。これは、Amazon S3 のパブリックアクセスブロックでは、ポリシーの現在のアクションだけでなく、後で追加される可能性があるアクションについても、バケットがパブリックになるかどうかが確認されるためです。一方、Access Analyzer for S3 は、アクセスの状態の評価で Amazon S3 サービスに指定されている現在のアクションのみを分析します。

S3 用 Access Analyzer の詳細については、「S3 のアクセスアナライザーを使用したバケットアクセスの確認」を参照してください。

Permissions

Amazon S3 のパブリックアクセスブロック機能を使用するには、以下のアクセス許可が必要です。

オペレーション 必要なアクセス許可
GET バケットのポリシーステータス s3:GetBucketPolicyStatus
GET bucket のブロックパブリックアクセス設定 s3:GetBucketPublicAccessBlock
PUT bucket のブロックパブリックアクセス設定 s3:PutBucketPublicAccessBlock
DELETE bucket のブロックパブリックアクセス設定 s3:PutBucketPublicAccessBlock
GET アカウントのブロックパブリックアクセス設定 s3:GetAccountPublicAccessBlock
PUT アカウントのブロックパブリックアクセス設定 s3:PutAccountPublicAccessBlock
DELETE アカウントのブロックパブリックアクセス設定 s3:PutAccountPublicAccessBlock
PUT アクセスポイントのブロックパブリックアクセス設定 s3:PutAccessPointPublicAccessBlock
注記

DELETE 操作には、PUT オペレーションと同じアクセス許可が必要です。DELETE 操作に対する個別のアクセス許可はありません。

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

AWS アカウント と Amazon S3 バケットのパブリックアクセスブロック設定の詳細については、以下のトピックを参照してください。