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 リージョンにグローバルに適用されます。設定はすべてのリージョンで即時または同時に有効になるわけではありませんが、最終的にはすべてのリージョンに反映されます。

Amazon S3 コンソールでパブリックアクセスブロックを有効にする

Amazon S3 ブロックパブリックアクセスには 4 つの設定があります。これらの設定は、個別のアクセスポイント、バケット、または AWS アカウント全体に任意の組み合わせで適用できます。次の図は、アカウントの Amazon S3 コンソールでブロックパブリックアクセスを有効にする方法を示しています。詳細については、『Amazon Simple Storage Service コンソールユーザーガイド』の「アクセス許可の設定: ブロックパブリックアクセス」を参照してください。


				ブロックパブリックアクセスのアカウント設定を示すコンソールのスクリーンショット。

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

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 設定が有効になっているとします。この場合、GET Bucket acl は、バケットに関連付けられている実際の ACL ではなく、Amazon S3 が実施しているアクセス許可を反映した ACL を返します。

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

「パブリック」の意味

バケット

  • ACL

    • Amazon S3 は、定義済みの AllUsers または AuthenticatedUsers グループのメンバーにアクセス許可を付与した場合、バケットまたはオブジェクト ACL はパブリックであると見なします。定義済みグループの詳細については、「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/* へのアクセスを許可すると、バケットポリシーをパブリックにすることなく、リージョン us-west-2 のアカウント 123456789012 に関連付けられているすべてのアクセスポイントへのアクセスを許可できます。この動作は、アクセスポイントポリシーでは異なることに注意してください。詳細については、「アクセスポイント」を参照してください。

      • 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"}} }
    • バケットポリシーの詳細については、「バケットポリシーとユーザーポリシーの使用」を参照してください。

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

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

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

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

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

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

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

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 サービスに指定されている現在のアクションのみを分析します。

Access Analyzer for S3 の詳細については、Amazon Simple Storage Service コンソールユーザーガイド の「Access Analyzer for S3 の使用方法」を参照してください。

アクセス許可

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 CLI でのパブリックアクセスブロックの使用

AWS CLI を介して Amazon S3 ブロックパブリックアクセスを使用できます。使用するコマンドは、アクセスポイント、バケット、またはアカウントのいずれにブロックパブリックアクセスの呼び出しを実行するかによって異なります。AWS CLI のセットアップおよび使用の詳細については、「AWS Command Line Interface とは?」を参照してください。

  • アクセスポイント

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

  • バケット

    • バケットでブロックパブリックアクセス操作を実行するには、AWS CLI サービス s3api を使用します。このサービスを使用するバケットレベルの操作は次のとおりです。

      • PUT PublicAccessBlock (バケット対象)

      • GET PublicAccessBlock (バケット対象)

      • DELETE PublicAccessBlock (バケット対象)

      • GET BucketPolicyStatus

  • アカウント

    • アカウントでブロックパブリックアクセス操作を実行するには、AWS CLI サービス s3control を使用します。このサービスを使用するアカウントレベルの操作は次のとおりです。

      • PUT PublicAccessBlock (アカウント対象)

      • GET PublicAccessBlock (アカウント対象)

      • DELETE PublicAccessBlock (アカウント対象)

AWS SDK for Java でのパブリックアクセスブロックの使用

以下の例に示しているのは、AWS SDK for Java で Amazon S3 ブロックパブリックアクセスを使用する方法です。作業サンプルを作成およびテストする方法については、「AWS SDK for Java の使用」を参照してください。

例 1

この例では、AWS SDK for Java を使用して S3 バケットにパブリックアクセスブロック設定を設定する方法を示します。

AmazonS3 client = AmazonS3ClientBuilder.standard() .withCredentials(<credentials>) .build(); client.setPublicAccessBlock(new SetPublicAccessBlockRequest() .withBucketName(<bucket-name>) .withPublicAccessBlockConfiguration(new PublicAccessBlockConfiguration() .withBlockPublicAcls(<value>) .withIgnorePublicAcls(<value>) .withBlockPublicPolicy(<value>) .withRestrictPublicBuckets(<value>)));
重要

この例は、AmazonS3 クライアントクラスを使用するバケットレベルの操作にのみ関係します。アカウントレベルの操作については、次の例を参照してください。

例 2

この例では、AWS SDK for Java を使用して Amazon S3 アカウントにパブリックアクセスブロック設定を配置する方法を示します。

AWSS3ControlClientBuilder controlClientBuilder = AWSS3ControlClientBuilder.standard(); controlClientBuilder.setRegion(<region>); controlClientBuilder.setCredentials(<credentials>); AWSS3Control client = controlClientBuilder.build(); client.putPublicAccessBlock(new PutPublicAccessBlockRequest() .withAccountId(<account-id>) .withPublicAccessBlockConfiguration(new PublicAccessBlockConfiguration() .withIgnorePublicAcls(<value>) .withBlockPublicAcls(<value>) .withBlockPublicPolicy(<value>) .withRestrictPublicBuckets(<value>)));
重要

この例は、AWSS3Control クライアントクラスを使用するアカウントレベルの操作にのみ関係します。バケットレベルの操作については、前述の例を参照してください。

他の AWS SDK でのパブリックアクセスブロックの使用

他の AWS SDK の使用の詳細については、「AWS SDK、CLI、Explorer の使用」を参照してください。

REST API でのパブリックアクセスブロックの使用

REST API を介した Amazon S3 ブロックパブリックアクセスの使用については、Amazon Simple Storage Service API Reference の以下のトピックを参照してください。