オリジンアクセスアイデンティティ (OAI) を使用して Amazon S3 コンテンツへのアクセスを制限する
Amazon S3 バケットから配信するコンテンツへのアクセスを制限するには、次のステップに従います。
-
オリジンアクセスアイデンティティ (OAI) と呼ばれる特別な CloudFront ユーザーを作成し、ディストリビューションに関連付けます。
-
CloudFront が OAI を使用してバケット内のファイルにアクセスしてユーザーに提供できるように、S3 バケットのアクセス許可を設定します。ユーザーが S3 バケットへのダイレクト URL を使用して、そこにあるファイルにアクセスできないようにしてください。
これらのステップを実行すると、ユーザーは S3 バケットから直接ではなく、CloudFront 経由でのみファイルにアクセスできるようになります。
CloudFront 署名付き URL または署名付き Cookie を使用してファイルへのアクセスを制限する場合は、ファイルの直接的な Amazon S3 URL を使用するだけで、ビューワーがファイルを表示できるようになることは望ましくありません。代わりに、正しく保護できるように、CloudFront URL が使用された場合のみファイルへのアクセスを許可します。署名付き URL および署名付き 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 のみが使用されるようにするには、以下の操作を行います。
-
特別な CloudFront ユーザーであるオリジンアクセスアイデンティティを作成し、そのオリジンアクセスアイデンティティをディストリビューションに関連付けます。オリジンアクセスアイデンティティをオリジンに関連付けます。そうすることで、Amazon S3 コンテンツのすべてまたは一部のみを保護することができます。ディストリビューションを作成するときに、オリジンアクセスアイデンティティを作成してディストリビューションに追加することもできます。詳細については、「CloudFront OAI を作成してディストリビューションに追加する」を参照してください。
-
オリジンアクセスアイデンティティのみに読み取り許可が付与されるように、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 を使用して、作成と追加を行うことができます。
-
CloudFront コンソールを使用するには – OAI の作成とディストリビューションへの追加を同時に行うことができます。手順については、OAI を作成してディストリビューションに追加する を参照してください。
-
CloudFront API を使用するには – OAI を作成してから、ディストリビューションに追加します。手順については、以下を参照してください。
OAI を作成してディストリビューションに追加する
ディストリビューションの作成時に OAI を作成しなかった場合は、以下の操作を行います。
CloudFront コンソールを使用して CloudFront OAI を作成するには
AWS Management Console にサインインし、https://console.aws.amazon.com/cloudfront/v3/home
で CloudFront コンソールを開きます。 -
S3 オリジンを持つディストリビューションの ID を選択します。
-
[オリジン] タブを選択します。
-
Amazon S3 オリジンを選び、[Edit] (編集) を選択します。
-
S3 バケットアクセスの場合、[Yes use OAI] (はい、OAI を使用します) を選択します。
-
使用する OAI がすでにある場合は、ドロップダウンリストからその OAI を選びます。OAI がすでにある場合は、それを再利用し、メンテナンスを簡素化することをお勧めします。
OAI を作成する場合は、[Create new OAI] (新しい OAI の作成) をクリックします。必要に応じて、自動生成された OAI 名をカスタム名に置き換えることができます。
-
CloudFront が OAI への読み取りアクセスを許可するように Amazon S3 バケットポリシーを自動的に更新する場合は、[Yes, update the bucket policy] (はい、このバケットポリシーを更新します) を選択します。
重要 [Yes, update the bucket policy] (はい、このバケットポリシーを更新します) を選択すると、CloudFront は、バケット内の読み取りファイルに指定された OAI のアクセス許可が付与されるように、バケットのアクセス許可を更新します。ただし、CloudFront は既存のアクセス許可を削除しません。Amazon S3 URL を使用してバケット内のファイルにアクセスするためのアクセス許可が現時点で付与されているユーザーについては、CloudFront によってバケットのアクセス許可が更新された後も、そのアクセス許可が付与されたままになります。既存のバケット許可を表示または削除するには、Amazon S3 から提供される方法を使用してください。
Amazon S3 バケットに対する許可を手動で更新する場合は、[No, I will update the bucket policy] (いいえ、自分でバケットポリシーを更新します) を選択します。詳細については、「OAI に Amazon S3 バケット内のファイルの読み込みアクセス許可を付与する」を参照してください。
-
ページの最下部で [変更の保存] を選択します。
-
複数の Amazon S3 オリジンがある場合は、OAI を追加するステップをひとつずつ繰り返します。
CloudFront API を使用して OAI を作成する
オリジンアクセスアイデンティティがすでにあり、別のオリジンアクセスアイデンティティを作成するのではなくそれを再利用する場合は、このステップをスキップして「CloudFront API を使用して、OAI をディストリビューションに追加する」に進んでください。
CloudFront API を使用して CloudFront OAI を作成するには、CreateCloudFrontOriginAccessIdentity
API アクションを使用します。応答には、新しい OAI 用の Id
と S3CanonicalUserId
が含まれます。これらの値は、プロセスの後半で使用するため書き留めておきます。詳細については、Amazon CloudFront API リファレンスの「CreateCloudFrontOriginAccessIdentity」を参照してください。
CloudFront API を使用して、OAI をディストリビューションに追加する
既存のディストリビューションに CloudFront OAI を追加する場合や、OAI を含む新しいディストリビューションを作成する場合は、CloudFront API を使用できます。どちらの場合も、OriginAccessIdentity
エレメントを含めます。このエレメントには、OAI の作成時に CreateCloudFrontOriginAccessIdentity
API アクションによって返された Id
エレメントの値が含まれます。OriginAccessIdentity
要素は 1 つ以上のオリジンに追加することができます。
Amazon CloudFront API リファレンスの以下のトピックを参照してください。
-
新しいディストリビューションを作成する – 「CreateDistribution」
-
既存のディストリビューションを更新する – 「UpdateDistribution」
OAI に Amazon S3 バケット内のファイルの読み込みアクセス許可を付与する
CloudFront コンソールを使用して OAI を作成するか、OAI をディストリビューションに追加する場合、バケットにアクセスするための OAI の許可を与えるように Amazon S3 バケットポリシーを自動的に更新できます。あるいは、このバケットポリシーの手動での作成または更新を選択することができます。どちらの方法を使用する場合でも、アクセス許可を確認して次のことを確認する必要があります。
-
CloudFront OAI は、CloudFront 経由でリクエストしているビューワーに代わってバケット内のファイルにアクセスできます。
-
ビューワーは、Amazon S3 URL を使用して CloudFront の外のファイルにアクセスすることができません。
CloudFront でサポートされるすべての HTTP メソッドを受け入れて転送するように CloudFront を設定する場合は、必ず CloudFront OAI に目的のアクセス許可を付与してください。例えば、DELETE
メソッドを使用するリクエストを受け入れて転送するように CloudFront を設定する場合、適切なファイルのみをビューワーが削除できるように、DELETE
リクエストを適切に処理するバケットポリシーを設定してください。
Amazon S3 バケットポリシーの使用
Amazon S3 バケット内のファイルへのアクセス許可を CloudFront OAI に付与するには、次の方法でバケットポリシーを作成または更新します。
-
Amazon S3 コンソール
で、Amazon S3 バケットの [アクセス許可] タブを使用する。 -
Amazon S3 API の PutBucketPolicy を使用する。
-
CloudFront コンソール
を使用する。CloudFront コンソールでオリジン設定に OAI を追加するときに、[Yes, update the bucket policy] (はい、バケットポリシーを更新します) を選択すると、ユーザーに代わってバケットポリシーを更新するように 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 コンソールの「オリジンアクセスアイデンティティページ
OAI にアクセス許可を付与
Amazon S3 バケット内のオブジェクトにアクセスするためのアクセス許可を OAI に付与するには、特定の Amazon S3 API オペレーションに関連するポリシーでキーワードを使用します。たとえば、s3:GetObject
アクセス許可は、OAI がバケット内のオブジェクトを読み取ることを許可します。詳細については、次のセクションの例を参照するか、Amazon Simple Storage Service ユーザーガイドの「Amazon S3 のアクション」を参照してください。
Amazon S3 バケットポリシーの例
以下の例は、CloudFront OAI へのアクセスを許可する Amazon S3 バケットポリシーを示しています。これらの例を使用するには、次の手順に従います。
-
EH1HDMB1FH2TC
を OAI の ID に置き換えます。OAI の ID を確認するには、CloudFront コンソールの「オリジンアクセスアイデンティティページ」を参照するか、CloudFront API の「ListCloudFrontOriginAccessIdentities」を使用します。 -
DOC-EXAMPLE-BUCKET
を 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:GetObject
と s3: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 バケットポリシーを使用して OAI へのアクセスを S3 バケットに与えることを推奨します。このセクションで説明したように ACL を使用できますが、それは推奨されません。
Amazon S3 では所有権が強化されたバケットに S3 オブジェクトの所有権を設定することを推奨しており、すなわち、バケットとその中のオブジェクトについて ACL が無効になっているということです。この設定を [オブジェクトの所有権] に適用する場合は、バケットポリシーを使用して OAI へのアクセスを与える必要があります (前のセクションを参照)。
次のセクションは、ACL を必要とするレガシーユースケースのみを対象としています。
Amazon S3 バケット内のファイルへのアクセス許可を CloudFront OAI に付与するには、次の方法でファイルの ACL を作成または更新します。
-
Amazon S3 コンソール
で、Amazon S3 オブジェクトの [アクセス許可] タブを使用する。 -
Amazon S3 API の PutObjectAcl を使用する。
ACL を使用して OAI へのアクセスを許可する場合、Amazon S3 の正規ユーザー ID を使用して OAI を指定する必要があります。これは、CloudFront コンソールのオリジンアクセスアイデンティティページS3CanonicalUserId
要素の値を使用するか、CloudFront API の ListCloudFrontOriginAccessIdentities を呼び出します。
署名バージョン 4 認証のみをサポートする Amazon S3 リージョンでの OAI の使用
新しい Amazon S3 リージョンでは、リクエストの認証用に署名バージョン 4 を使用する必要があります。(各 Amazon S3 リージョンでサポートされている署名バージョンについては、AWS 一般リファレンスにある「Amazon Simple Storage Service エンドポイントおよびクォータ」を参照してください)。オリジンアクセスアイデンティティを使用しており、バケットが署名バージョン 4 が必要なリージョンの 1 つにある場合、以下の点に注意してください。
-
DELETE
、GET
、HEAD
、OPTIONS
、およびPATCH
リクエストは条件なしでサポートされます。 -
CloudFront に
PUT
リクエストを送信してファイルを Amazon S3 バケットにアップロードする場合は、リクエストにx-amz-content-sha256
ヘッダーを追加する必要があります。ヘッダー値にはリクエストの本文の SHA-256 ハッシュが含まれている必要があります。詳細については、Amazon Simple Storage Service API リファレンスの「一般的なリクエストヘッダー」ページでx-amz-content-sha256
ヘッダーに関するドキュメントを参照してください。 -
POST
リクエストはサポートされません。