暗号化を利用したデータ保護には、大きく分けて二つあります。

 一つは、SSL/TLS、IPsec、無線LAN暗号化といった「通信の暗号化」。もう一つは、ファイル暗号化・暗号化ファイルシステム・データベース暗号化・ブロックデバイス暗号化といった「保管データの暗号化」です。

 本連載でこれまでに登場したAWSの主なサービスでは、ロードバランサーのELB、外付けディスクのAmazon EBS、オブジェクトストレージのAmazon S3、リレーショナルデータベースのAmazon RDSなどが、通信の暗号化または保管データの暗号化の機能を備えています。

 まず前提知識として、暗号化と暗号鍵管理の代表的な方法を説明します。

 一般にデータの暗号化方式には、大きく分けて「対称暗号化方式」と「非対称暗号化方式」の二つがあります。対称暗号化方式は、暗号化と復号に同一の秘密鍵を使用します。非対称暗号化方式では秘密鍵と公開鍵のペアを用意し、データを公開鍵で暗号化して秘密鍵によって復号したり、秘密鍵で暗号化して公開鍵で復号したりします。

 非対称暗号化方式の利点は、インターネットなどを通じて安全に暗号化したデータをやり取りできることです。例えば、公開鍵でデータを暗号化して送り、受け取った相手は秘密鍵で復号する、といった具合です。

 一方、対称暗号化方式の利点は、非対称暗号化方式より処理負荷が軽いことです。そのため、クローズドなネットワーク内での暗号化やシステム内部での暗号化には、対称暗号化方式が適しています。

 処理速度に優れる対称暗号化方式について、詳しく説明します。

 対称暗号化方式の暗号鍵(データキー)は、AES(Advanced Encryption Standard)などの暗号化アルゴリズムで使用されます。簡単に言うと、データキーによってファイルを暗号化し、暗号化ファイルを生成します。

 ここで、データキーの管理が問題になります。データキーによって暗号化だけでなく復号もできるので、誰でもアクセスできる場所に、暗号化ファイルと一緒に置いておくわけにはいきません。データキーを必要とする特定のリソース(暗号化ファイルを使用するリソース)だけに配布する必要があります。

 データキーを安全に管理する典型的な方法は「マスターキー」と呼ばれる別の暗号鍵で暗号化することです。さらにセキュリティを高めるため、マスターキーを別の暗号鍵で暗号化することもできますが、管理が複雑になるので得策ではありません。

暗号鍵を作成・管理する「AWS KMS」

 マスターキーでデータキーを暗号化して安全に管理するためのサービスが、「AWS KMS(Key Management Service)」です。KMSはAmazon EBS、S3、Redshift、RDSなどのサービスと統合されているほか、AWS SDKと合わせることで、アプリケーションにKMSとの連携機能を組み込むことができます。さらにCloudTrailと連携し、データキーの使用ログを生成します。

 KMSでは、データを暗号化/復号するためのデータキーと、データキーを暗号化/復号するためのカスタマーマスターキー(CMK、以降ではマスターキーと略す)を扱います(図1)。KMSはマスターキーに対して作成、更新、無効化、有効化を行い、データキーに対しては生成、暗号化/復号を行います。

図1 AWS KMSからのデータキーの発行
[画像のクリックで拡大表示]

 KMSとの連携機能を組み込んだアプリケーションを例に、KMSと連携してファイルを暗号化し、あとで復号する流れを説明します。

 準備として、アプリケーションからKMSのCreateKey APIを呼び出しマスターキーを作成しておきます。作成したマスターキーはKMS内に保管され、アプリケーションにはマスターキーのIDだけが返されます。

 ここで重要なのは、アプリケーションに返されるのがマスターキーのIDだけで、マスターキーではないことです。マスターキーがKMSを出ることはありません。

 アプリケーションはファイルを暗号化するたびに、マスターキーのIDを引数としてKMSのGenerateDataKey APIを呼び出します。すると、KMSからデータキーとマスターキーで暗号化されたデータキー(暗号化データキー)が返されます。

 アプリケーションは、KMSから受け取ったデータキーでファイルを暗号化します。暗号化したファイルは暗号化データキーと合わせて、EBSなどのストレージに保存します。データキーは暗号化処理が終了したら即座に、アプリケーション側で破棄します。

 アプリケーションがファイルを復号する場面に話を進めます。アプリケーションは、復号対象のファイルと一緒に保存した暗号化データキーを引数にして、KMSのDecrypt APIを呼び出します。このとき、暗号化データキーにはマスターキーの情報が含まれるので、マスターキーIDをKMSに渡す必要はありません。

 呼び出しを受けたKMSは、マスターキーによって暗号化データキーを復号し、元のデータキーを返します。アプリケーションはそれを受け取り、ファイルを復号します。

 データキーは暗号化対象ごとに固有なので、たとえデータキーが漏洩しても復号できる対象は一つだけです。そのため、リスクを限定できます。

 マスターキーは、一時的に無効にしたり、再び有効にしたりできます。ただしマスターキーを無効にすると、ファイルの暗号化/復号ができなくなります。上記のように、データを暗号化/復号するには、アプリケーションなどがその都度KMSにリクエストし、暗号化データキーを復号させてデータキーを取得する必要があるためです。

 マスターキーは、自動または手動で変更できます。自動変更では、デフォルトで1年に1回、マスターキーを変更します。

 マスターキーを変更すると、それ以降の全てのリクエストに対して新しいマスターキーを適用します。マスターキーを変更したあとでも、前のマスターキーを使った暗号化データキーの復号は行います。つまり変更前のマスターキーは、データキーの復号のためだけに使えるというわけです。

 このようにKMSでは、暗号化対象の数だけ存在するデータキーを管理する必要がありません。マスターキーだけを管理すれば済みます。これもKMSの利点の一つです。

この先は有料会員の登録が必要です。有料会員(月額プラン)は初月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら