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

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

Amazon S3 バケットから配信するコンテンツへのアクセスを制限するには、次のステップに従います。

  1. オリジンアクセスアイデンティティ (OAI) と呼ばれる特別な CloudFront ユーザーを作成し、ディストリビューションに関連付けます。

  2. CloudFront が OAI を使用してバケット内のファイルにアクセスしてユーザーに提供できるように、S3 バケットのアクセス許可を設定します。ユーザーが S3 バケットへのダイレクト URL を使用して、そこにあるファイルにアクセスできないようにしてください。

これらのステップを実行すると、ユーザーは S3 バケットから直接ではなく、CloudFront 経由でのみファイルにアクセスできるようになります。

一般に、CloudFront ディストリビューションのオリジンとして Amazon S3 バケットを使用している場合は、すべてのユーザーにファイルへのアクセス権を付与するか、アクセスを制限することができます。たとえば、CloudFront 署名付き URL または署名付き Cookie を使用してアクセスを制限する場合は、ファイルの直接的な Amazon S3 URL を使用するだけでファイルを表示できる状態も望ましくありません。代わりに、正しく保護できるように、CloudFront URL が使用された場合のみファイルへのアクセスを許可します。署名付き UR Lおよび署名付き Cookie の使用について詳しくは、「署名付き URL と署名付き Cookie を使用したプライベートコンテンツの提供」を参照してください。

このトピックでは、OAI を設定し、S3 ファイルへの安全なアクセスを維持するためのアクセス許可を付与する方法について詳しく説明します。

重要

ウェブサイトエンドポイントとして設定されている Amazon S3 バケットを使用する場合、CloudFront でカスタムオリジンとして設定する必要があります。このトピックで説明するオリジンアクセスアイデンティティ機能を使用することはできません。ただし、カスタムヘッダーを設定し、それらをリクエストするようにオリジンを設定することで、カスタムオリジンのコンテンツへのアクセスを制限できます。詳細については、「 カスタムオリジン上のファイルへのアクセス制限」を参照してください。

OAI セットアップの概要

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 アクセスログが不完全になり、役に立たなくなります。

URL が署名されているかどうかに関係なく、ユーザーからファイルへのアクセスに必ず CloudFront URL のみが使用されるようにするには、以下の操作を行います。

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

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

CloudFront OAI を作成してディストリビューションに追加する

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

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

注記

OAI を作成するには、CloudFront コンソールまたは CloudFront API バージョン 2009-09-09 以降を使用する必要があります。

OAI を作成してディストリビューションに追加する

ディストリビューションの作成時に OAI を作成しなかった場合は、以下の操作を行います。

CloudFront コンソールを使用して CloudFront OAI を作成するには

  1. AWS Management Console にサインインし、https://console.aws.amazon.com/cloudfront/v3/home で CloudFront コンソールを開きます。

  2. S3 オリジンを持つディストリビューションの ID を選択します。

  3. [Origin and Origin Groups (オリジンおよびオリジングループ)] タブを選択します。

  4. オリジンの横にあるチェックボックスを選択して、[編集] を選択します。

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

  6. 使用する OAI がすでにある場合は、 [既存の ID を使用] を選択します。次に、[Your Identities (あなたのID)] リストで OAI を選択します。

    注記

    OAI がすでにある場合は、それを再利用し、メンテナンスを簡素化することをお勧めします。

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

  7. CloudFront で、[オリジンドメイン名] で指定した Amazon S3 バケット内のファイルの読み取りアクセス許可を OAI に自動的に付与するには、[はい、バケットポリシーを更新します] を選択します。

    重要

    [はい、バケットポリシーを更新します] を選択すると、CloudFront は、指定の OAI にバケット内のファイルの読み取りアクセス許可が付与されるように、バケットのアクセス許可を更新します。ただし、CloudFront は既存のアクセス許可を削除しません。Amazon S3 URL を使用してバケット内のファイルにアクセスするためのアクセス許可が現時点で付与されているユーザーについては、CloudFront によってバケットのアクセス許可が更新された後も、そのアクセス許可が付与されたままになります。既存のバケット許可を表示または削除するには、Amazon S3 から提供される方法を使用してください。

    Amazon S3 バケットに対する許可を手動で更新する場合は、[いいえ、自分でアクセス許可を更新します] を選択します。詳細については、「OAI に Amazon S3 バケット内のファイルの読み込みアクセス許可を付与する」を参照してください。

  8. [Yes, Edit (はい、編集します)] を選択します。

  9. 複数のオリジンがある場合は、オリジンの OAI を追加するステップをひとつずつ繰り返します。

CloudFront API を使用して OAI を作成する

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

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

  • Id 要素 – OAI をディストリビューションと関連付けるには、Id 要素の値を使用します。

  • S3CanonicalUserId 要素 – Amazon S3 オブジェクト ACL を使用して OAI に Amazon S3 オブジェクトへのアクセスを許可する場合は、S3CanonicalUserId 要素の値を使用します。

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

CloudFront API を使用して、OAI をディストリビューションに追加する

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

Amazon CloudFront API リファレンスの以下のトピックを参照してください。

OAI に Amazon S3 バケット内のファイルの読み込みアクセス許可を付与する

ディストリビューションの作成または更新を行う場合、オリジンアクセスアイデンティティ (OAI) を追加するとともに、OAI に Amazon S3 バケットへのアクセス許可が付与されるようにバケットポリシーを自動的に更新できます。あるいは、バケットポリシーを手動で作成または更新するか、バケット内の個々のファイルへのアクセスを制御するオブジェクト ACL を使用するかを選択することもできます。

どちらの方法を使用する場合でも、アクセス許可を確認して次のことを確認する必要があります。

  • CloudFront OAI は、CloudFront 経由でリクエストしているビューワーに代わってバケット内のファイルにアクセスできます。

  • ビューワーは、Amazon S3 URL を使用して CloudFront の外のファイルにアクセスすることができません。

重要

CloudFront でサポートされるすべての HTTP メソッドを受け入れて転送するように CloudFront を設定する場合は、必ず CloudFront OAI に目的のアクセス許可を付与してください。たとえば、DELETE メソッドを使用するリクエストを受け入れて転送するように CloudFront を設定する場合、適切なファイルのみをビューワーが削除できるように、DELETE リクエストを適切に処理するバケットポリシーまたはオブジェクト ACL を設定してください。

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

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

  • デフォルトでは、Amazon S3 バケットとその中のファイルはすべてプライベートです。バケット内のファイルを読み書きする許可を持つのは、そのバケットを作成した AWS アカウントだけです。

  • 別の AWS アカウントでファイルをバケットにアップロードする場合、そのアカウントはファイルの所有者です。バケットポリシーは、バケット所有者が所有するファイルにのみ適用されます。つまり、別のアカウントでファイルをバケットにアップロードする場合、OAI 用に作成されたバケットポリシーはそれらのファイルでは評価されません。その場合は、オブジェクト ACL を使用して OAI にアクセス許可を付与します。

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

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

重要

Amazon S3 のアクセス許可への変更を保存してから変更が有効になるまでに、わずかな遅延が生じる場合があります。変更が有効になるまでは、バケット内のファイルにアクセスしようとすると、アクセス許可が拒否されたことを示すエラーが表示されることがあります。

Amazon S3 バケットポリシーの使用

Amazon S3 バケット内のファイルへのアクセス許可を CloudFront OAI に付与するには、次の方法でバケットポリシーを作成または更新します。

  • Amazon S3 コンソールで、Amazon S3 バケットの [アクセス許可] タブを使用する。

  • Amazon S3 API の PutBucketPolicy を使用する。

  • CloudFront コンソールを使用する。CloudFront コンソールでオリジン設定に OAI を追加するときに、[はい、バケットポリシーを更新します] を選択すると、ユーザーに代わってバケットポリシーを更新するように CloudFront に指示できます。

バケットポリシーを手動で更新する場合は、次の点を確認してください。

  • ポリシーで正しい OAI を Principal として指定します。

  • ビューワーに代わってオブジェクトにアクセスするために必要なアクセス許可を OAI に付与します。

詳細については、次のセクションを参照してください。

バケットポリシーで OAI を Principal として指定

Amazon S3 バケットポリシーで Principal として OAI を指定するには、OAI の ID を含む OAI の Amazon リソースネーム (ARN) を使用します。次に例を示します。

"Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EH1HDMB1FH2TC" }

上記の例を使用するには、EH1HDMB1FH2TC を OAI の ID に置き換えます。OAI の ID を確認するには、CloudFront コンソールのオリジンアクセスアイデンティティページを参照するか、CloudFront API の ListCloudFrontOriginAccessIdentities を使用します。

また、Amazon S3 の正規 ID を使用して OAI を Principal として指定することもできます。次に例を示します。

"Principal": { "CanonicalUser": "79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be" }

上記の例を使用するには、79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be を OAI の正規 ID に置き換えます。OAI の正規 ID は、その ID と同じ方法で見つけることができます。

注記

ARN を使用して OAI を Principalとして指定することの利点の 1 つは、バケットポリシーによって誰にアクセス許可が付与されているかを理解しやすくなることです。Amazon S3 の正規 ID は、CloudFront OAI だけでなく、さまざまな種類の AWS ID を指していることがあるため、正規 ID がどのアイデンティティを指しているのかを判断することが難しい場合があります。OAI の ARN を使用すると、バケットポリシーを理解しやすくなります。

また、バケットポリシーで OAI の正規 ID を使用すると、AWS が正規 ID を OAI の ARN に置き換えます。OAI の正規 ID を指定するポリシーを記述し、後で同じポリシーを表示すると、正規 ID が対応する ARN に置き換えられていることがわかります。このため、OAI の ARN を使用してポリシーを記述するのが適切な場合があります。

OAI にアクセス許可を付与

Amazon S3 バケット内のオブジェクトにアクセスするためのアクセス許可を OAI に付与するには、特定の Amazon S3 API オペレーションに関連するポリシーでキーワードを使用します。たとえば、s3:GetObject アクセス許可は、OAI がバケット内のオブジェクトを読み取ることを許可します。詳細については、次のセクションの例を参照するか、Amazon Simple Storage Service ユーザーガイドの「ポリシーでの許可の指定」を参照してください。

Amazon S3 バケットポリシーの例

以下の例は、CloudFront OAI へのアクセスを許可する Amazon S3 バケットポリシーを示しています。これらの例を使用するには、次の手順に従います。

例 OAI に読み取りアクセスを許可する Amazon S3 バケットポリシー

次の例では、指定されたバケット (s3:GetObject) 内のオブジェクトの読み取りを OAI に許可します。

{ "Version": "2012-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EH1HDMB1FH2TC" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" } ] }

例 OAI に読み取りおよび書き込みアクセスを許可する Amazon S3 バケットポリシー

次の例では、指定されたバケット (s3:GetObjects3:PutObject) 内のオブジェクトの読み取りおよび書き込みを OAI に許可します。これにより、ビューワーは CloudFront を介して Amazon S3 バケットにファイルをアップロードできます。

{ "Version": "2012-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EH1HDMB1FH2TC" }, "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" } ] }

Amazon S3 オブジェクト ACL の更新

Amazon S3 バケット内のファイルへのアクセス許可を CloudFront OAI に付与するには、次の方法でファイルの ACL を作成または更新します。

ACL を使用して OAI へのアクセスを許可する場合、Amazon S3 の正規ユーザー ID を使用して OAI を指定する必要があります。これは、CloudFront コンソールのオリジンアクセスアイデンティティページにある [Amazon S3 正規ユーザー ID] の値を使用します。CloudFront API を使用している場合は、OAI の作成時に返された S3CanonicalUserId 要素の値を使用するか、CloudFront API の ListCloudFrontOriginAccessIdentities を呼び出します。

Amazon S3 オブジェクト ACL に関する詳細は、Amazon Simple Storage Service ユーザーガイドの「ACL によるアクセスの管理」を参照してください。

署名バージョン 4 認証のみをサポートする Amazon S3 リージョンでの OAI の使用

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

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

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

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