Amazon Web Services ブログ

Amazon CloudFront オリジンアクセスコントロール(OAC)のご紹介

本記事は、「Amazon CloudFront introduces Origin Access Control (OAC)」と題された記事の翻訳となります。

Amazon CloudFront は、アプリケーション、ウェブサイト、動画、API を世界中の視聴者にミリ秒で安全に配信するグローバルなコンテンツ配信ネットワークです。CloudFront を利用することで、お客様はユースケースに合わせて様々なタイプのオリジンサービスにアクセスすることができます。お客様が採用されているパフォーマンスの高いアーキテクチャの1つは、Amazon S3 をオリジンとして Web サイトや動画などのコンテンツをホストし、CloudFront を使用して視聴者に配信するものです。現在、このアーキテクチャを使用する場合、お客様は CloudFront のオリジンアクセスアイデンティティ(OAI)を利用して、S3 オリジンへのアクセスを CloudFront のみに限定し保護することができます。

オリジンアクセスコントロール (OAC)

オリジンアクセスアイデンティティ (OAI) は CloudFront に S3 オリジンに対して安全にアクセスする方法を提供しますが、細かなポリシー設定や AWS Signature Version 4(SigV4) を必要とする AWS リージョンでの POST メソッドを使用した HTTP および HTTPS リクエスト、SSE-KMS との連携には対応していないなどの制約があります。セキュリティの強化と機能統合を深めるため、指定されたディストリビューションのみにアクセスを許可して S3 オリジンを保護する新機能「オリジンアクセスコントロール(OAC)」が提供されます。OAC は、IAM サービスプリンシパルを使用してS3 オリジンとの認証を行うという AWS のベストプラクティスに基づきます。OAI と比較して、OAC が提供する注目すべき強化点は以下の通りです。

  • セキュリティ – OAC は、短期間のクレデンシャル、頻繁なクレデンシャルのローテーション、およびリソースベースのポリシーのような強化されたセキュリティプラクティスで実装されています。これらは、ディストリビューションのセキュリティポスチャを強化し、混乱する代理のような攻撃に対してより良い保護を提供します。
  • 包括的な HTTP メソッドのサポート – OAC は GET、PUT、POST、PATCH、DELETE、OPTIONS、および HEAD をサポートしています。
  • SSE-KMS – OAC は、SSE-KMS で暗号化された S3 オブジェクトのダウンロードとアップロードをサポートしています。
  • すべての AWS リージョンでの S3 にアクセス – OAC は、既存のリージョンと将来のすべてのリージョンを含む、すべての AWS リージョンでの S3 へのアクセスをサポートしています。一方、OAI は既存の AWS リージョンと 2022 年 12 月までに開始されるリージョンでのみサポートされます。

OAC を使用する場合、典型的なリクエストとレスポンスのワークフローは次のようになります。1. クライアントが CloudFront に HTTP または HTTPS のリクエストを送信する。2. CloudFront のエッジロケーションはリクエストを受信します。リクエストされたオブジェクトがまだキャッシュされていない場合、CloudFront は OAC 署名プロトコル(現在 SigV4 がサポートされています)を使用してリクエストに署名します。OAC を設定する際、「リクエストに署名しない」「リクエストに署名する」「リクエストに署名するが認証ヘッダーを上書きしない」という 3 つの署名動作を選択することができます(図 1 )。次に、OAC に期待されるそれぞれの署名オプションの動作について説明します。

図 1. OAC 署名オプション

” 署名リクエスト ” オプション

“ 署名リクエスト ” オプションを設定すると、IAM CloudFront サービスプリンシパルは各リクエストに SigV4 で署名します。署名は、追加データと共に、S3 オリジンに送信される認証ヘッダーを形成するために含まれます。S3 オリジンがこのリクエストを受信すると、署名を計算するために同じ手順を実行し、その計算された署名を CloudFront がリクエストと共に送信した署名と比較します。署名が一致する場合、リクエストは処理されます。署名が一致しない場合、リクエストは拒否されます。

“ 署名リクエスト ” オプションでは、受信したリクエストがすでにクライアントアプリケーションによって署名された認証ヘッダーを持っている場合でも、CloudFront は常にクライアントから受信したリクエストに署名します。この場合、CloudFront はクライアントの認証ヘッダーを削除し、CloudFront のクレデンシャルでリクエストに再署名し、新しい認証ヘッダーを生成してS3オリジンに送信します。

CloudFront が常に着信リクエストに署名するので、アプリケーションが常に動作することを保証するため、ほとんどのお客様は “ 署名リクエスト ” オプションを使用することをお勧めします。さらに、CloudFront がリクエストに署名することで、クライアントと CloudFront 間のデータ転送が少なくなり、アプリケーションのパフォーマンスが向上します。

” 認証ヘッダーを上書きしない ” オプション

クライアントアプリケーションがリクエストに署名でき、ユースケースが異なるキャッシュ動作、ファイルディレクトリ、HTTP メソッド、エッジコンピュータ呼び出しなどの属性に基づいて、クライアント署名と CloudFront 署名の認証ヘッダーを切り替える場合、 ” 署名リクエスト ” を選択した後に ” 認証ヘッダーを上書きしない ” サブオプションを使用することが可能です。例えば、S3 アップロードの認可をクライアントアプリケーションに限定し、S3 ダウンロードの認可は CloudFront に割り当てたい場合、このオプションを有効にすることができます。この例では、S3 バケットポリシーを設定し、クライアントの認証のみがアップロードに使用されるようにする必要があります。

また、CloudFront はオリジンに転送するヘッダーを明示的に許可する必要があるため、クライアントの認証ヘッダーをオリジンに転送できるよう、キャッシュポリシーで認証ヘッダーを許可する必要があります。” 認証ヘッダーを上書きしない ” サブオプションが有効で、クライアントの認証ヘッダーが許可されない場合、CloudFront はクライアントの認証ヘッダーを削除し、CloudFront の信用情報でリクエストを再署名し、S3 オリジンに送信する認証ヘッダーを生成します。

” リクエストに署名しない ” オプション

” リクエストに署名しない “は、S3 オリジンから受け取ったリクエストに署名しないように CloudFront に指示します。クライアントアプリケーションが常にリクエストに署名する場合、または S3 バケットが公開されている場合、このオプションを選択することができます(ベストプラクティスではありません)。注意 : ” リクエストに署名しない ” オプションは、オリジンアクセス制御を使用しないことと同じことになります。このオプションは、多数の CloudFront ディストリビューションに対して OAC の署名オプションを変更したい場合に便利です。例えば、以前に OAC を ” 署名リクエスト ” で設定し、それが 100 オリジンと関連付けられている場合。クライアントがリクエストに署名するようにしたい場合、100 オリジンの OAC の関連付けを手動で変更する代わりに、この OAC の設定を「リクエストに署名しない」に変更します。そうすることで、CloudFront は 100 のオリジンに対するリクエストに署名しなくなります。

それでは、各オプションに対する OAC の署名動作がわかったところで、OAC の設定方法を見ていきましょう。また、OAC と連携する KMS ポリシーの設定方法についても見ていきます。

新規 CloudFront ディストリビューション作成時に OAC を設定する

    1. AWS マネジメントコンソールにサインインし、CloudFront コンソール を開きます。
      https://console.thinkwithwp.com/cloudfront/v3/home
    2. ” ディストリビューションを作成 ” を選択します。
    3. オリジンセクションで、オリジンドメインのドロップ・ダウンリストから S3 オリジンを選択します。
    4. オプションで、オリジンリクエストのオリジンドメイン名に付加するオリジンパスを設定することができます。
    5. オリジン構成を一意に識別するための名前を入力します。
    6. Origin access control settings 設定を選択します (図 2 )。

      図 2. ディストリビューション作成時にオリジンアクセスを設定する

    7. 既存のオリジンアクセスコントロールを選択するか、3 つの署名オプションのいずれかを使用して新しいコントロール設定を作成します (図 1 )。
    8. 残りの設定方法については、こちらの詳しい説明に従ってください。
    9. すべての構成設定を選択したら、ページ下部のディストリビューションの作成を選択します。
    10. ディストリビューションが正常に作成されたら、S3 バケットポリシーを更新する必要があります。ディストリビューションの詳細ページ(図 3)で提供されるポリシーステートメント を参照することができます。” ポリシーをコピー ” を選択することでポリシーをコピーできます。
    11. 提供されたポリシーは、S3 からオブジェクトを読み取る権限のみを含んでいることに注意してください。S3 へのオブジェクトのアップロードも行いたい場合は、”s3:PutObject ” に対する追加のアクセス許可でポリシーを更新する必要があります。

図 3. ディストリビューション詳細ページ

既存の CloudFront ディストリビューション更新時に OAC を設定する

    1. AWS マネジメントコンソールにサインインし、CloudFront コンソール を開きます。
      https://console.thinkwithwp.com/cloudfront/v3/home
    2. リストから 1 つのディストリビューションを選択します。
    3. オリジンタブを選択し、オリジンアクセスコントロール設定に関連付ける S3 オリジンを選択します。
    4. オリジンがどのアクセスメカニズムも使用していない場合、“ public “ と表示されます。オリジンがすでに OAI を使用している場合、” Legacy access identifies ” と表示されます。OAC を使用するには、“ Origin access control settings ” を選択し、既存のオリジンアクセスコントロールを選択するか、3 つの署名オプションのうちの 1 つで新しいコントロール設定を作成します(図 1 )。

      図 4 . 既存のディストリビューションの更新

    5. CloudFront IAM サービスプリンシパルとディストリビューションリソースが S3 バケットにアクセスできるように、S3 ポリシーを更新する必要があります。ディストリビューション作成時にオリジンアクセスを設定する場合、ディストリビューション作成後にポリシーを更新することができますが、ディストリビューションを更新する場合は、オリジン設定を保存する前にポリシーを更新してOAIとOACの両方へのアクセスを許可し、サービスのダウンタイムをゼロにすることができ、この方法が推奨されます。以下は、OAIとOACの両方へのアクセスを許可するポリシーの例です。{
      "Version": "2012-10-17",
      "Statement": [
      {
      "Sid": "AllowCloudFrontServicePrincipalReadOnly",
      "Effect": "Allow",
      "Principal": {
      "Service": "cloudfront.amazonaws.com"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/",
      "Condition": {
      "StringEquals": {
      "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID"
      }
      }
      },
      {
      "Sid": "AllowLegacyOAIReadOnly",
      "Effect": "Allow",
      "Principal": {
      "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EH1HDMB1FH2TC"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/"
      }
      ]
      }
    6. ディストリビューション作成時の OAC の設定と同様に、CloudFront が提供するポリシーには、S3 からオブジェクトを読み込む権限しかありません。S3 へのオブジェクトのアップロードも行いたい場合は、”s3:PutObject ” のパーミッションを追加したポリシーに更新する必要があります。
    7. ページの一番下にある “ 変更を保存 ” を選択します。

CloudFront OACのSSE-KMSを有効化する

AWS Well-Architected は、伝送中と保管中のデータを保護することを推奨しています。OAI を使用している場合、データは転送中にすでに保護されており、Amazon S3 が管理するキーによるサーバー側の暗号化 (SSE-S3) を使用したサーバーサイド暗号化を使って保管中のデータを保護することができます。一方、SSE-KMS 暗号化を使用して S3 バケットに保存されたコンテンツを暗号化することを要求する場合、SSE-KMS で暗号化された S3 オブジェクトにアクセスするために OAC を使用することができます。ただし、CloudFront の IAM サービスプリンシパルが KMS キーにアクセスできるように、KMS ポリシーを設定する必要があります。aws:SourceArn 条件キーを追加することで、特定の CloudFront ディストリビューションのみがこのキーポリシーを使用して SSE-KMS 暗号化オブジェクトにアクセスすることができます。
設定方法は以下の通りです。

    1. KMS コンソールを開きます。(必要に応じてリージョンは変更してください。)
      https://us-east-1.console.thinkwithwp.com/kms/home?region=us-east-1#/kms/keys
    2. S3 オリジンコンテンツを暗号化するために使用する任意のカスタマー管理型のキーを選択します。
    3. キーポリシータブを選択します。
    4. CloudFront サービスプリンシパルにアクセスできるよう、KMSキーポリシーを更新します。
      以下は追加するポリシーの例となります。

      {
        "Sid": "Allow use of the key",
        "Effect": "Allow",
        "Principal": {
          "Service": [
             "cloudfront.amazonaws.com"
             ]
         },
           "Action": [
               "kms:Decrypt",
               "kms:Encrypt",
               "kms:GenerateDataKey*"
           ],
           "Resource": "*",
           "Condition":{
               "StringEquals":{
                  "aws:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID"
               }
          }
      }

OAC への移行は必要ですか?

既に OAI で構成された CloudFront ディストリビューションがある場合、OAI から OAC への移行が必要かどうか疑問に思うかもしれません。最新のセキュリティベストプラクティスと追加機能のために OAC の使用を推奨しますが、CloudFront は新しい OAC とレガシー OAI の両方をサポートしています。OAI を使用するように設定されたディストリビューションをお持ちの場合、簡単な操作で OAC に移行することができます。OAI を使用しているディストリビューションは引き続き動作し、新しいディストリビューションでも引き続き OAI を使用することができます。今後のリージョンの制限については、CloudFront origin access migrationのドキュメントを参照してください。

今すぐご利用いただけます

CloudFront オリジンアクセスコントロールは、AWS 中国リージョンを除く全世界で利用可能になりました。CloudFront のコンソール、API 、SDK 、CLI から OAC の利用を開始することができます。OAC を使用するための追加料金はありません。OAC の設定方法については、CloudFront オリジンアクセスコントロール のドキュメントを参照してください。CloudFront を使い始めるには、 CloudFront の製品ページをご覧ください。

翻訳は Solutions Architect の長谷川 純也が担当しました。原文はこちらです