CloudFront の フィールドレベル暗号化
背景
AWS の CDN サービスの CloudFront について勉強していたら、「フィールドレベル暗号化」というとても便利な機能があることに驚きました。
ドキュメントを何回か読み概要を理解したので、わかりやすくまとめてみました。
これから CloudFront のフィールドレベル暗号化機能について勉強しようとしていた方の助けになれば幸いです。
CloudFront とは ?
AWS(Amazon Web Services)が提供するCDN(コンテンツ配信ネットワーク)サービスです。わかりやすく言うと、ウェブサイトやアプリの画像・動画・HTML・CSS・JavaScriptなどのデータを、世界中のユーザーに素早く届けるための仕組みです。
たとえば、東京にあるサーバーに画像が保存されていて、それをアメリカの人が見ようとした場合、距離があるため表示に時間がかかることがあります。
CloudFrontを使うと、その画像を世界各地にある「エッジロケーション(キャッシュ用の拠点)」にキャッシュしておいて、ユーザーに一番近い場所から配信するので、読み込みが速くなるというメリットがあります。
CloudFront の主な機能は以下の通りです。
-
高速配信:世界中のエッジロケーションから近くのユーザーへデータを配信することができる
-
キャッシュ:一度アクセスされたコンテンツをエッジに保存し、次回以降の配信を高速化
-
セキュリティ:HTTPS対応、WAF(Web Application Firewall)と連携可能
-
オリジン指定:元データ(S3、EC2、ALB、外部のHTTPサーバーなど)を指定できる
なので、例えるなら、CloudFrontは、人気商品を全国のコンビニに事前に送っておいて、どの街でもすぐ手に入れられるようにする物流ネットワークのようなものだと思います。
フィールドレベル暗号化 とは ?
CloudFrontのフィールドレベル暗号化は、特定の機密データ(例えばクレジットカード番号など)だけを選んで暗号化し、限られたシステムだけがそれを読めるようにする機能です。
通常のHTTPS通信でもデータは暗号化されますが、アプリケーション内ではそのデータが「復号された状態」で流れることがあります。
機密性の高い情報(クレジットカード番号など)は、誰でも見られるようにすべきではありません。
そこで「フィールドレベル暗号化」を使うと、特定のフィールドだけを選んで暗号化し、復号できるのは、特別な鍵(プライベートキー)を持っている特定のアプリケーションだけに限定できます。
この機能のメリットは、下記の通りです。
-
セキュリティが強化される:暗号化されたフィールドは途中のサーバーやシステムが読めない
-
データ漏洩リスクが低減:誤ってログに出たり、他の処理で見られてしまうリスクを減らせる
-
目的のシステムだけが読める:例えば決済システムだけがクレジットカード番号を復号できる
ただ、使用上の注意点もあります。その注意点が以下の2つです。
-
一度に暗号化できるのは最大10個のフィールドまで
-
リクエスト全体を丸ごと暗号化することはできない(あくまで個別のフィールド単位)
一度に暗号化できるフィールドが、最大10個までなので、多くの機密情報を暗号化することはできないということになります。
また、暗号化もリクエスト全体の暗号化ではなく、各フィールドによるので、暗号化するフィールドはよく吟味しなければいけませんし、この機能自体の使い方も検討する必要がありそうです。
次に、この機能の仕組みを簡単に説明します。説明は下記の通りです。
-
CloudFrontのディストリビューション設定で、暗号化したいフィールド(例:credit_card_number)を指定する。
また、そのフィールドを暗号化するためのパブリックキー(公開鍵)を指定する。 -
ユーザーがフォームで情報を送信すると、CloudFrontのエッジロケーション(ユーザーに近い場所)で指定されたフィールドが暗号化される。
オリジンサーバーにリクエストが届いても、そのフィールドは暗号化されたままになる。 -
データにアクセスする必要があるシステムだけが、対応するプライベートキー(秘密鍵)を使って復号できる。

上記のように フィールドレベル暗号化 を行うために、CloudFront では、公開鍵(パブリックキー)で暗号化し、秘密鍵(プライベートキー)で復号する「非対称暗号化(パブリックキー暗号化とも呼ばれる) 」を使っています。
また、CloudFrontに渡したパブリックキーでは復号はできません。復号できるのは、秘密鍵(プライベートキー)を持っている限られたアプリケーションだけです。
なので、途中で誰かがデータを見ても、「暗号化されているから意味がわからない」状態なため、データが保護され、セキュリティ的に安全というかたちになります。
フィールドレベル暗号化の設定手順
最後に、フィールドレベル暗号化の設定手順について簡単に説明します。設定手順は以下の通りです。
-
パブリックキーとプライベートキーのペアを準備する
パブリックキー(公開鍵)は CloudFront に渡し、プライベートキー(秘密鍵)は、自分たちのアプリケーションへ -
フィールドレベル暗号化プロファイルを作成する
これは「どのフィールドを暗号化するか」を定義する設定のことで、例えば、credit_card_number(クレジットカード番号)、ssn(社会保障番号)などのことを指します。
また、暗号化するフィールドは「POST リクエスト」などに含まれる個別の項目のことです。 -
フィールドレベル暗号化の設定を作成する
作成したプロファイルを使って、どんな条件でどのプロファイルを使うかを定義します。
例えば、リクエストのContent-Typeが特定の値のときや、クエリパラメータで特定のプロファイル名が来たときなど。
また、プロファイル名が間違っていたらどうするかや、特定のリクエストパターンだけ暗号化対象にするかなどの「細かい動作」も指定できます。 -
ディストリビューションのキャッシュ動作にリンクする
ディストリビューションとは、「配信設定の単位」のことです。
例えるなら、CDNを使って配信するためのルールや設定をまとめた箱のようなものです。
なので、ここではCloudFront がいつ暗号化処理を行うかを設定します。
これは CloudFront の「キャッシュ動作(Cache Behavior)」の中で、このパスに来たリクエストには暗号化設定を適用するや、このオリジンには暗号化不要 というように割り当てる作業となります。
これにより、指定した条件のリクエストだけが自動で暗号化されます。
まとめ
今回、CloudFront の フィールドレベル暗号化機能の概要について簡単に説明してみました。
個人的には概ね理解できたので、今後は、実務で使用できたら良いなと思いました。
参考
Discussion