Amazon CloudFront
開発者ガイド (API バージョン 2016-09-29)

オリジンアクセスアイデンティティを使用して Amazon S3 コンテンツへのアクセスを制限する

通常、Amazon S3 バケットを CloudFront ディストリビューションのオリジンとして使用する場合、すべてのユーザーにバケット内のオブジェクトの読み取り許可を与えます。これにより、すべてのユーザーが CloudFront または Amazon S3 URL を使用してオブジェクトにアクセスできます。CloudFront は Amazon S3 URL を公開しませんが、アプリケーションが何らかのオブジェクトを Amazon S3 から直接供給したり、Amazon S3 内の特定のオブジェクトへの直接リンクが公表されたりした場合、ユーザーはそれらの URL を知ることができます。

注記

カスタムヘッダーを使用して、カスタムオリジンのコンテンツへのアクセスを制限することもできます。詳細については、「カスタムヘッダーを使用してカスタムオリジンのコンテンツへのアクセスを制限する」を参照してください。

CloudFront 署名付き URL や署名付き Cookie を使用して Amazon S3 バケット内のオブジェクトへのアクセスを提供する場合は、ユーザーが Amazon S3 URL を使用して Amazon S3 オブジェクトにアクセスできないようにすることが必要になる場合もあります。ユーザーが Amazon S3 内のオブジェクトに直接アクセスすると、ユーザーは CloudFront 署名付き URL や署名付き Cookie によって提供される制御をバイパスします。たとえば、ユーザーがコンテンツにアクセスできなくなる日時の制御や、コンテンツへのアクセスに使用できる IP アドレスの制御です。また、ユーザーが CloudFront および直接 Amazon S3 URL 使用してオブジェクトにアクセスする場合、CloudFront アクセスログが不完全になり、役に立たなくなります。

注記

オリジンアクセスアイデンティティを作成するには、CloudFront コンソールまたは CloudFront API バージョン 2009-09-09 以降を使用する必要があります。

URL が署名されているかどうかに関係なく、ユーザーがオブジェクトに CloudFront URL のみを使用してアクセスしていることを確認するには、以下のタスクを実行します。

  1. 特別な CloudFront ユーザーであるオリジンアクセスアイデンティティを作成し、そのオリジンアクセスアイデンティティをディストリビューションに関連付けます。 (ウェブディストリビューションでは、オリジンアクセスアイデンティティをオリジンに関連付けます。そうすることで、Amazon S3 コンテンツのすべてまたは一部のみの保護が可能です)。ディストリビューションを作成するときに、オリジンアクセスアイデンティティを作成してディストリビューションに追加することもできます。詳細については、「CloudFront オリジンアクセスアイデンティティを作成してディストリビューションに追加する」を参照してください。

  2. オリジンアクセスアイデンティティのみが読み取り許可 (または読み取りとダウンロードの許可) を持つように、Amazon S3 バケットに対する許可またはバケット内のオブジェクトに対する許可を変更します。ユーザーが CloudFront を使用して Amazon S3 オブジェクトにアクセスすると、CloudFront オリジンアクセスアイデンティティがユーザーに代わってオブジェクトを取得します。ユーザーが直接 Amazon S3 URL を使用してオブジェクトをリクエストすると、ユーザーはアクセスを拒否されます。オリジンアクセスアイデンティティには、Amazon S3 バケット内のオブジェクトにアクセスするための権限がありますが、ユーザーにはありません。詳細については、「オリジンアクセスアイデンティティに Amazon S3 バケット内のオブジェクトの読み取り許可を付与する」を参照してください。

プライベート Amazon S3 バケットを CloudFront で使用するように設定することに関する詳細は。「How to Set Up and Serve Private Content Using S3 and Amazon CloudFront」を参照してください。

CloudFront オリジンアクセスアイデンティティを作成してディストリビューションに追加する

AWS アカウントは最大で 100 個の CloudFront オリジンアクセスアイデンティティを持つことができます。ただし、1 つのオリジンアクセスアイデンティティを、必要な数のディストリビューションに追加できるため、通常は 1 つのオリジンアクセスアイデンティティで十分です。

ディストリビューションの作成時にオリジンアクセスアイデンティティを作成してディストリビューションに追加しなかった場合は、ここで、CloudFront コンソールまたは CloudFront API を使用して、作成と追加を行うことができます。

CloudFront コンソールを使用して、オリジンアクセスアイデンティティを作成してディストリビューションに追加する

ディストリビューションの作成時にオリジンアクセスアイデンティティを作成しなかった場合、以下の手順を実行します。

CloudFront コンソールを使用して CloudFront オリジンアクセスアイデンティティを作成するには

  1. AWS マネジメントコンソール にサインインし、https://console.aws.amazon.com/cloudfront/ にある、CloudFront コンソールを開きます。

  2. S3 オリジンを持つディストリビューションの ID をクリックし、[Distribution Settings (ディストリビューション設定)] を選択します。

  3. [オリジン] タブを選択します。

  4. オリジンを選択し、[編集] を選択します。

  5. [バケットアクセスの制限] で、[はい] を選択します。

  6. 使用するオリジンアクセスアイデンティティがすでにある場合は、[Use an Existing Identity] をクリックします。次に、[Your Identities] リストでアイデンティティを選択します。

    注記

    オリジンアクセスアイデンティティがすでにある場合は、それを再利用し、メンテナンスを簡素化することをお勧めします。

    アイデンティティを作成する場合は、[Create a New Identity] をクリックします。必要に応じて、[コメント] フィールドのバケット名をカスタムの説明に置き換えることができます。

  7. [Origin Domain Name] に指定された Amazon S3 バケット内のオブジェクトの読み取り許可を、CloudFront でオリジンアクセスアイデンティティに自動的に与える場合は、[Yes, Update Bucket Policy] をクリックします。

    重要

    [Yes, Update Bucket Policy (はい、バケットポリシーを更新します)] を選択すると、CloudFront は、指定されたオリジンアクセスアイデンティティにバケット内のオブジェクトの読み取り許可を付与するようにバケットアクセス許可を更新します。ただし、CloudFront は既存の許可を削除しません。現在、Amazon S3 URL を使用してバケット内のオブジェクトにアクセスするための許可を持っているユーザーは、CloudFront がバケット許可を更新した後もその許可を依然として持っています。既存のバケット許可を表示または削除するには、Amazon S3 によって提供される方法を使用します。詳細については、「オリジンアクセスアイデンティティに Amazon S3 バケット内のオブジェクトの読み取り許可を付与する」を参照してください。

    Amazon S3 バケットに対する許可を手動で更新する場合は、[No, I Will Update Permissions (いいえ、自分でアクセス許可を更新します)] を選択します。

  8. [Yes, Edit] を選択します。

  9. 複数のオリジンがある場合は、1 つのオリジンのオリジンアクセスアイデンティティを追加するステップを繰り返します。

CloudFront API を使用してオリジンアクセスアイデンティティを作成する

オリジンアクセスアイデンティティがすでにあり、別のオリジンアクセスアイデンティティを作成するのではなくそれを再利用する場合は、このステップをスキップして「CloudFront API を使用してディストリビューションにオリジンアクセスアイデンティティを追加する」に進んでください。

CloudFront API を使用して CloudFront オリジンアクセスアイデンティティを作成するには、POST Origin Access Identity API アクションを使用します。レスポンスに新しいオリジンアクセスアイデンティティの IdS3CanonicalUserId が含まれます。これらの値をプロセスの後半で使用するため、これらの値を書き留めておきます。

  • Id エレメントId エレメントの値を使用して、オリジンアクセス ID をディストリビューションと関連付けます。

  • S3CanonicalUserId エレメント – CloudFront に Amazon S3 バケットまたはオブジェクトへのアクセスを与える場合に S3CanonicalUserId エレメントの値を使用します。

詳細については、Amazon CloudFront API リファレンスの「CreateCloudFrontOriginAccessIdentity」を参照してください。

CloudFront API を使用してディストリビューションにオリジンアクセスアイデンティティを追加する

CloudFront API を使用して、CloudFront オリジンアクセスアイデンティティを既存のディストリビューションに追加したり、オリジンアクセスアイデンティティを含む新しいディストリビューションを作成したりできます。どちらの場合も、OriginAccessIdentity エレメントを含めます。このエレメントには、オリジンアクセスアイデンティティの作成時に POST Origin Access Identity API アクションによって返された Id エレメントの値が含まれます。ウェブディストリビューションの場合、OriginAccessIdentity エレメントを 1 つ以上のオリジンに追加します。RTMP ディストリビューションの場合、OriginAccessIdentity エレメントをディストリビューションに追加します。

Amazon CloudFront API リファレンス」の該当するトピックを参照してください。

オリジンアクセスアイデンティティに Amazon S3 バケット内のオブジェクトの読み取り許可を付与する

ディストリビューションの作成または更新を行う場合、オリジンアクセスアイデンティティを追加するとともに、オリジンアクセスアイデンティティにバケットへのアクセス権限を与えるようにバケットポリシーを自動的に更新できます。また、バケットポリシーまたは ACL を手動で変更するように選択することもできます。ACL とは、バケット内の個々のオブジェクトに対する許可を制御するものです。

どちらの方法を使用する場合も、バケットに対するバケットポリシーと、オブジェクトに対する許可を見直して、以下の点を確認する必要があります。

  • CloudFront を使用してオブジェクトを要求するユーザーに代わって、CloudFront がバケット内のオブジェクトにアクセスできること。

  • ユーザーが Amazon S3 URL を使用してオブジェクトにアクセスできないこと。

重要

CloudFront がサポートするすべての HTTP メソッドを受け入れて Amazon S3 に転送するように CloudFront を構成する場合、お客様の Amazon S3 コンテンツへのアクセスを制限する CloudFront オリジンアクセスアイデンティティを作成して、そのオリジンアクセスアイデンティティに適切な許可を付与します。たとえば、PUT メソッドを使用したいので、上記のメソッドを受け入れて転送するように CloudFront を構成するという場合は、削除すべきでないリソースをユーザーが削除できないようにするために、DELETE リクエストを適切に処理する Amazon S3 バケットポリシーまたは ACL を構成する必要があります。

次の点に注意してください。

  • アクセス権限を更新しなくてもオブジェクトをバケットに追加できるため、ACL を更新するよりも Amazon S3 バケットポリシーを更新するほうが簡単な場合があります。ただし、ACL を使用すると、各オブジェクトに対する許可を付与できるため、より詳細な制御が可能になります。

  • デフォルトでは、Amazon S3 バケットと、バケット内のすべてのオブジェクトはプライベートです。バケットを作成した AWS アカウントのみが、バケット内のオブジェクトの読み取りまたは書き込み許可を持っています。

  • オリジンアクセスアイデンティティを既存のディストリビューションに追加する場合、バケットポリシーまたはすべてのオブジェクト ACL を必要に応じて変更し、オブジェクトがパブリックに公開されないようにします。

  • Amazon S3 バケットのコンテンツを引き続き更新できるように、追加の許可を 1 つ以上のセキュア管理者アカウントに付与します。

重要

Amazon S3 のアクセス権限への変更を保存してから変更が有効になるまでわずかな遅延が生じる場合があります。変更が有効になるまでは、バケット内のオブジェクトにアクセスしようとすると、アクセス権限が拒否されたことを示すエラーを受け取ることがあります。

Amazon S3 バケットポリシーを更新する

AWS マネジメントコンソール または Amazon S3 API を使用して Amazon S3 バケットポリシーを更新できます。

  • バケットに対する適切な許可を CloudFront オリジンアクセスアイデンティティに付与します。

    オリジンアクセスアイデンティティを指定するには、CloudFront コンソールの [Origin Access Identity] ページにある [Amazon S3 Canonical User ID] の値を使用します。CloudFront API を使用する場合は、オリジンアクセスアイデンティティの作成時に返された S3CanonicalUserId エレメントの値を使用します。

  • Amazon S3 URL を使用したアクセスが望まれないすべてのユーザーへのアクセスを拒否します。

詳しくは、『Amazon Simple Storage Service 開発者ガイド』の「バケットポリシーとユーザーポリシーの使用」を参照してください。

たとえば、『Amazon Simple Storage Service 開発者ガイド』にもあるトピック「バケットポリシーの例」の「Amazon CloudFront オリジンアイデンティティへのアクセス許可の付与」を参照してください。

Amazon S3 ACL を更新する

AWS マネジメントコンソール または Amazon S3 API を使用して、Amazon S3 ACL を変更します。

  • CloudFront ディストリビューションによって供給される各オブジェクトに対する適切な許可を CloudFront オリジンアクセスアイデンティティに付与します。

    オリジンアクセスアイデンティティを指定するには、CloudFront コンソールの [Origin Access Identity] ページにある [Amazon S3 Canonical User ID] の値を使用します。CloudFront API を使用する場合は、オリジンアクセスアイデンティティの作成時に返された S3CanonicalUserId エレメントの値を使用します。

  • Amazon S3 URL を使用したアクセスが望まれないすべてのユーザーへのアクセスを拒否します。

別の AWS アカウントでオブジェクトをバケットにアップロードする場合、そのアカウントはオブジェクトの所有者です。バケットポリシーは、バケット所有者が所有するオブジェクトにのみ適用されます。つまり、別のアカウントでオブジェクトをバケットにアップロードする場合、OAI 用に作成されたバケットポリシーはそれらのオブジェクトでは評価されません。

詳細については、Amazon Simple Storage Service 開発者ガイドの「ACL によるアクセス管理」を参照してください。

AWS SDK の 1 つを使用して、ACL をプログラムで変更することもできます。たとえば、「C# と .NET Framework を使用して URL 署名を作成する」にあるダウンロード可能なサンプルコードを参照してください。

署名バージョン 4 のみをサポートする Amazon S3 リージョンでのオリジンアクセスアイデンティティの使用

新しい Amazon S3 リージョンでは、認証済みリクエストに対して署名バージョン 4 を使用する必要があります (各 Amazon S3 リージョンでサポートされている署名のバージョンについては、『アマゾン ウェブ サービス全般のリファレンス』の「リージョンとエンドポイント」の「Amazon Simple Storage Service (S3)」を参照してください)。ただし、オリジンアクセスアイデンティティを作成して CloudFront ディストリビューションに追加する場合、CloudFront は Amazon S3 バケット内のオブジェクトをリクエストする場合、通常、認証に署名バージョン 2 を使用します。オリジンアクセスアイデンティティを使用しており、認証に署名バージョン 4 が必要なリージョンの 1 つにある場合、以下の点に注意してください。

  • DELETEGETHEADOPTIONS、および PATCH リクエストは条件なしでサポートされます。

  • CloudFront に PUT リクエストを送信してオブジェクトを Amazon S3 バケットにアップロードする場合は、リクエストに x-amz-content-sha256 ヘッダーを追加する必要があり、ヘッダー値にはリクエストの本文の SHA256 ハッシュが含まれている必要があります。詳細については、『Amazon Simple Storage Service API Reference』の「一般的なリクエストヘッダー」ページで x-amz-content-sha256 ヘッダーのドキュメントを参照してください。

  • POST リクエストはサポートされません。