Amazon Simple Storage Service
開発者ガイド (API バージョン 2006-03-01)

Amazon S3 ブロックパブリックアクセスの使用

Amazon S3 には、バケットとアカウント用のブロックパブリックアクセス設定があり、Amazon S3 リソースへのパブリックアクセスを管理するのに役立ちます。デフォルトでは、新しいバケットとオブジェクトはパブリックアクセスを許可しませんが、ユーザーはパブリックアクセスを許可するようにバケットポリシーまたはオブジェクトのアクセス許可を変更できます。Amazon 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 コンソールユーザーガイド』の「アクセス許可の設定: ブロックパブリックアクセス」を参照してください。


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

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

Amazon 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 を監査、絞り込み、またはその他の方法で変更することができます。

IgnorePublicAcls

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

BlockPublicPolicy

このオプションを TRUE 設定すると、指定されたバケットポリシーでパブリックアクセスが許可されている場合、Amazon S3 は PUT Bucket ポリシーへの呼び出しを拒否します。この設定により、バケットやその中に含まれるオブジェクトを公に共有することを許可せずに、ユーザーがバケットポリシーを管理できるようになります。この設定を有効にしても、既存のバケットポリシーには影響しません。

重要

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

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

      { "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 ブロックパブリックアクセス機能を使用するには、以下のアクセス許可が必要です。

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

注記

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

AWS CLI で、ブロックパブリックアクセスを使用する

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

  • バケット

    • バケットでブロックパブリックアクセス操作を実行するには、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 の以下のトピックを参照してください。