Amazon S3 オリジンへのアクセスを制限する
CloudFront には、認証済みリクエストを Amazon S3 オリジンに送信するために、オリジンアクセスコントロール (OAC) とオリジンアクセスアイデンティティ (OAI) という 2 つの方法が用意されています。OAC は、Amazon S3 などのオリジンを保護するのに役立ちます。
以下の機能をサポートしているため、代わりに OAC を使用することをお勧めします。
-
すべての AWS リージョンのすべての Amazon S3 バケット (2022 年 12 月以降に開始されたオプトインリージョンを含む)
-
AWS KMS による Amazon S3 サーバー側の暗号化 (SSE-KMS)
-
Amazon S3 に対する動的なリクエスト (
PUT
とDELETE
)
OAI はこれらの機能をサポートしていないか、これらのシナリオでは追加の回避策が必要です。既に OAI を使用していて、移行する場合は、「オリジンアクセスアイデンティティ (OAI) からオリジンアクセスコントロール (OAC) への移行」を参照してください。
メモ
-
Amazon S3 バケットオリジンで CloudFront OAC を使用する場合は、[Amazon S3 オブジェクト所有権] を、新しい Amazon S3 バケットのデフォルトである [バケット所有者の強制] に設定する必要があります。ACL が必要な場合は、[希望するバケット所有者] を使用し、CloudFront 経由でアップロードされたオブジェクトの制御を維持します。
-
オリジンが、ウェブサイトエンドポイントとして設定されている Amazon S3 バケットである場合、CloudFront でカスタムオリジンとして設定する必要があります。つまり、OAC (または OAI) を使用することはできません。OAC は、Lambda@Edge を使用したオリジンリダイレクトをサポートしていません。
以下のトピックでは、Amazon S3 オリジンで OAC を使用する方法について説明します。
トピック
新しいオリジンアクセスコントロールを作成する
次のトピックで説明されているステップを実行して、CloudFront で新しいオリジンアクセスコントロールを設定します。
前提条件
オリジンアクセスコントロール (OAC) を作成して設定する前に、Amazon S3 バケットオリジンを持つ CloudFront ディストリビューションが必要です。このオリジンは、ウェブサイトエンドポイントとして設定されたバケットではなく、通常の S3 バケットである必要があります。S3 バケットオリジンを使用した CloudFront ディストリビューションのセットアップの詳細については、「CloudFront 標準ディストリビューションの開始方法」を参照してください。
重要
OAC を使用して Amazon S3 オリジンを保護する場合、CloudFront と Amazon S3 間の通信は常に HTTPS を介して行われますが、[常にリクエストに署名] を選択した場合に限られます。コンソールで [リクエストに署名 (推奨)] を選択するか、CloudFront API、AWS CLI、または CloudFormation で [always
] を指定する必要があります。
[リクエストに署名しない] または [認証ヘッダーを上書きしない] オプションを選択した場合、CloudFront は次のポリシーで指定した接続プロトコルを使用します。
-
オリジンプロトコルポリシー (カスタムオリジンのみ)
例えば、[認証ヘッダーを上書きしない] を選択し、CloudFront と Amazon S3 オリジンの間で HTTPS を使用する場合は、ビューワープロトコルポリシーに HTTP を HTTPS にリダイレクトまたは HTTPS のみを使用します。
S3 バケットへのアクセス許可を CloudFront に付与する
オリジンアクセスコントロール (OAC) を作成したり、CloudFront ディストリビューションで設定したりする前に、CloudFront に S3 バケットオリジンへのアクセス許可があることを確認してください。これは CloudFront ディストリビューションを作成した後、ディストリビューション設定の S3 オリジンに OAC を追加する前に行います。
S3 バケットポリシーを使用して、CloudFront サービスプリンシパル (cloudfront.amazonaws.com
) がバケットにアクセスできるようにします。ポリシーの Condition
要素を使用して、S3 オリジンを含む CloudFront ディストリビューションに代わってリクエストが行われた場合にのみ CloudFront がバケットにアクセスできるようにします。これは、OAC を追加する S3 オリジンを持つディストリビューションです。
バケットポリシーの追加または変更の詳細については、Amazon S3 ユーザーガイドの「Amazon S3 コンソールを使用したバケットポリシーの追加」を参照してください。
以下の例は、OAC が有効になっている CloudFront ディストリビューションに S3 オリジンへのアクセスを許可する S3 バケットポリシーを示しています。
例 OAC が有効になっている CloudFront ディストリビューションへの読み取り専用アクセスを許可する S3 バケットポリシー
例 OAC が有効になっている CloudFront ディストリビューションへの読み取りおよび書き込みアクセスを許可する S3 バケットポリシー
SSE-KMS
S3 バケットオリジン内のオブジェクトが AWS Key Management Service (SSE-KMS) でのサーバー側の暗号化を使用して暗号化されている場合は、CloudFront ディストリビューションに AWS KMS キーを使用するアクセス許可があることを確認する必要があります。KMS キーを使用するアクセス許可を CloudFront ディストリビューションに付与するには、KMS キーポリシーにステートメントを追加します。キーポリシーを変更する方法については、AWS Key Management Service デベロッパーガイドの「キーポリシーの変更」を参照してください。
例 KMS キーポリシーステートメント
次の例は、OAC を使用した CloudFront ディストリビューションが SSE-KMS の KMS キーにアクセスできるようにする AWS KMS ポリシーステートメントを示しています。
{ "Sid": "AllowCloudFrontServicePrincipalSSE-KMS", "Effect": "Allow", "Principal": { "Service": [ "cloudfront.amazonaws.com" ] }, "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:GenerateDataKey*" ], "Resource": "*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::
111122223333
:distribution/<CloudFront distribution ID>
" } } }
オリジンアクセスコントロールを作成する
オリジンアクセスコントロール (OAC) を作成するには、AWS Management Console、AWS CloudFormation、AWS CLI、または CloudFront API を使用します。
S3 バケットに OAC がアタッチされたディストリビューションを削除する
S3 バケットに OAC がアタッチされたディストリビューションを削除する必要がある場合は、S3 バケットオリジンを削除する前に、ディストリビューションを削除する必要があります。または、オリジンドメイン名にリージョンを含めます。これが不可能な場合は、削除前にパブリックに切り替えることで、OAC をディストリビューションから削除できます。詳細については、「 ディストリビューションを削除する」を参照してください。
オリジンアクセスアイデンティティ (OAI) からオリジンアクセスコントロール (OAC) への移行
レガシーのオリジンアクセスアイデンティティ (OAI) からオリジンアクセスコントロール (OAC) に移行するには、まず S3 バケットオリジンを更新して、OAI と OAC が有効になっているディストリビューションの両方がバケットのコンテンツにアクセスできるようにします。これにより、移行中に CloudFront がバケットにアクセスできなくなる状況を回避できます。OAI と OAC が有効になっているディストリビューションの両方が S3 バケットにアクセスできるようにするには、バケットポリシーを更新し、プリンシパルの種類ごとに 1 つずつ、2 つのステートメントを含めます。
次の S3 バケットポリシー例では、OAI と OAC が有効になっているディストリビューションの両方に S3 オリジンへのアクセスを許可しています。
例 OAC が有効になっている OAI と CloudFront ディストリビューションの読み取り専用アクセスを許可する S3 バケットポリシー
S3 オリジンのバケットポリシーを更新して OAI と OAC の両方へのアクセスを許可したら、OAI の代わりに OAC を使用するようにディストリビューション設定を更新できます。詳細については、「新しいオリジンアクセスコントロールを作成する」を参照してください。
ディストリビューションが完全にデプロイされたら、OAI へのアクセスを許可するバケットポリシー内のステートメントを削除できます。詳しくは、「S3 バケットへのアクセス許可を CloudFront に付与する」を参照してください。
オリジンアクセスコントロールの詳細設定
CloudFront オリジンアクセスコントロール機能には、特定のユースケースのみを対象とした詳細設定が含まれています。詳細設定が特に必要でない限り、推奨設定を使用してください。
オリジンアクセスコントロールには、[署名動作] (コンソール)、または SigningBehavior
(API、CLI、および AWS CloudFormation) という設定が含まれています この設定では、次のオプションを使用できます。
- オリジンリクエストに常に署名する (推奨設定)
-
コンソールの [Sign requests (recommended)] (署名リクエスト (推奨))、または API、CLI、および AWS CloudFormation の
always
という設定を使用することをお勧めします。この設定では、CloudFront は S3 バケットオリジンに送信するすべてのリクエストに常に署名します。 - オリジンリクエストに署名しない
-
この設定は、コンソールでは [リクエストに署名しない]、または API、CLI、およびAWS CloudFormation では
never
です。この設定を使用して、このオリジンアクセスコントロールを使用するすべてのディストリビューションのすべてのオリジンに対して、オリジンアクセスコントロールをオフにします。これにより、オリジンアクセスコントロールを使用するすべてのオリジンとディストリビューションからコントロールを 1 つずつ削除する場合に比べて、時間と労力を節約できます。この設定では、CloudFront は S3 バケットオリジンに送信するリクエストには署名しません。警告
この設定を使用するには、S3 バケットオリジンがパブリックにアクセス可能である必要があります。パブリックにアクセスできない S3 バケットオリジンでこの設定を使用すると、CloudFront はオリジンにアクセスできません。S3 バケットオリジンは CloudFront にエラーを返し、CloudFront はそれらのエラーをビューワーに渡します。
- ビューワー (クライアント) の
Authorization
ヘッダーを上書きしない -
この設定は、コンソールでは [認可ヘッダーを上書きしない] で、API、CLI、および AWS CloudFormation では
no-override
です。この設定は、対応するビューワーリクエストにAuthorization
ヘッダーに含まれていない場合にのみ、CloudFront がオリジンリクエストに署名するよう指定する場合に使用します。この設定では、ビューワーリクエストが存在するが、ビューワーリクエストにAuthorization
ヘッダーが含まれていないときにオリジンリクエストに署名する (独自のAuthorization
ヘッダーを追加) ときに、CloudFront はビューワーリクエストからAuthorization
ヘッダーを渡します。警告
ビューワーリクエストから
Authorization
ヘッダーを渡すには、このオリジンアクセスコントロールに関連付けられた S3 バケットオリジンを使用するすべてのキャッシュ動作に対して、Authorization
ヘッダーをキャッシュポリシーに必ず追加する必要があります。
オリジンアクセスアイデンティティを使用する (レガシー、非推奨)
CloudFront のオリジンアクセスアイデンティティ (OAI) はオリジンアクセスコントロール (OAC) と類似した機能を提供しますが、すべてのシナリオで機能するわけではありません。具体的には、OAI は以下をサポートしていません。
-
オプトインリージョンを含む、すべての AWS リージョンの Amazon S3 バケット
-
AWS KMS による Amazon S3 サーバー側の暗号化 (SSE-KMS)
-
Amazon S3 に対する動的なリクエスト (
PUT
、POST
、またはDELETE
) -
2023 年 1 月以降に新しい AWS リージョンをリリース
ヒント
代わりに OAC を使用することをお勧めします。OAC を設定するには、「新しいオリジンアクセスコントロールを作成する」を参照してください。OAI から OAC への移行に関する詳細については、「オリジンアクセスアイデンティティ (OAI) からオリジンアクセスコントロール (OAC) への移行」を参照してください。
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
<origin access identity ID>
" }
CloudFront コンソールの [セキュリティ]、[オリジンアクセス]、[アイデンティティ (レガシー)] で OAI ID を検索します。または、CloudFront API の ListCloudFrontOriginAccessIdentities を使用します。
OAI にアクセス許可を付与
Amazon S3 バケット内のオブジェクトにアクセスするためのアクセス許可を OAI に付与するには、特定の Amazon S3 API オペレーションに関連するポリシーでアクションを使用します。例えば、s3:GetObject
アクションは、OAI がバケット内のオブジェクトを読み取ることを許可します。詳細については、次のセクションの例を参照するか、Amazon Simple Storage Service ユーザーガイドの「Amazon S3 のアクション」を参照してください。
Amazon S3 バケットポリシーの例
以下の例は、S3 バケットへのアクセスを CloudFront OAI に許可する Amazon S3 バケットポリシーを示しています。
CloudFront コンソールの [セキュリティ]、[オリジンアクセス]、[アイデンティティ (レガシー)] で OAI ID を検索します。または、CloudFront API の ListCloudFrontOriginAccessIdentities を使用します。
例 OAI に読み取りアクセスを許可する Amazon S3 バケットポリシー
次の例では、指定されたバケット (s3:GetObject
) 内のオブジェクトの読み取りを OAI に許可します。
例 OAI に読み取りおよび書き込みアクセスを許可する Amazon S3 バケットポリシー
次の例では、指定されたバケット (s3:GetObject
と s3:PutObject
) 内のオブジェクトの読み取りおよび書き込みを OAI に許可します。これにより、ビューワーは CloudFront を介して Amazon S3 バケットにファイルをアップロードできます。
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 コンソールでは、この ID を [セキュリティ]、[オリジンアクセス]、[アイデンティティ (レガシー)] で検索できます。CloudFront API を使用している場合は、OAI の作成時に返された S3CanonicalUserId
要素の値を使用するか、CloudFront API の ListCloudFrontOriginAccessIdentities を呼び出します。
新しい Amazon S3 リージョンでは、リクエストの認証用に署名バージョン 4 を使用する必要があります。(各 Amazon S3 リージョンでサポートされている署名バージョンについては、「AWS 全般のリファレンス」の「Amazon Simple Storage Service エンドポイントおよびクォータ」を参照してください)。オリジンアクセスアイデンティティを使用しており、バケットが、署名バージョン 4 が必要なリージョンの 1 つにある場合、以下の点に注意してください。
-
DELETE
、GET
、HEAD
、OPTIONS
、およびPATCH
リクエストは条件なしでサポートされます。 -
POST
リクエストはサポートされません。