エンベロープ暗号化

はじめに

Google の規模でデータを保管および暗号化するには、暗号化データに対して複数レイヤの鍵を使用する一元的な暗号鍵管理サービスが必要です。複数レイヤの鍵の例として、鍵を別の鍵で暗号化するエンベロープ暗号化があります。

データは、ユーザーにデータを表示するアプリケーション レイヤとデータの物理ストレージを提供するストレージ レイヤの両方で暗号化できます。

デフォルトでは、ストレージ レイヤで、Google Cloud が、エンベロープ暗号化を使用して、保存されている顧客コンテンツを暗号化します。中心的な鍵ストアは Google の内部鍵管理サービスとなります。ご自身でデータを保管および暗号化する場合は、アプリケーション レイヤの中心的な鍵ストアとして、このトピックの焦点である Cloud Key Management Service を使用できます。

鍵は、使いやすさを考えて設計された鍵階層に Cloud KMS が保管します。鍵階層内のリソースへのアクセスは、Identity and Access Management によって管理されます。Cloud KMS 鍵階層の主なレベルを次に示します。

リソース

鍵階層の詳細については、オブジェクト階層をご覧ください。

データ暗号鍵

データ自体を暗号化するために使用する鍵は、データ暗号鍵(DEK)と呼ばれます。

DEK を管理するためのベスト プラクティスは次のとおりです。

  • DEK をローカルに生成します。
  • 保管時には、常に DEK を暗号化するようにします。
  • 簡単にアクセスできるように、DEK は暗号化するデータの近くに保管します。
  • データを書き込むたびに新しい DEK を生成します。つまり、DEK のローテーションを行う必要はありません。
  • 同じ DEK を使用して 2 人の異なるユーザーのデータを暗号化しないでください。
  • Galois Counter Mode(GCM)で 256 ビットの Advanced Encryption Standard(AES)などの強力なアルゴリズムを使用します。

鍵暗号鍵

DEK は鍵暗号鍵(KEK)によって暗号化(ラップとも呼ばれる)されます。別の鍵で鍵を暗号化するプロセスは、エンベロープ暗号化と呼ばれます。

KEK を管理するためのベスト プラクティスは次のとおりです。

  • KEK を一元的に保管します。

  • ユースケースに基づいて、暗号化する DEK の粒度を設定します。例として、あるワークロードで、そのデータチャンクを暗号化するために複数の DEK が必要になるとします。単一の KEK を使用して、そのワークロードの暗号化を行うすべての DEK をラップすることができます。

  • 定期的に、および疑わしいインシデントの後に、鍵のローテーションを行います。詳細については、鍵のローテーションをご覧ください。

DEK と KEK のバランス調整

KEK の数を DEK よりも少なくし、一元的な鍵管理サービスを使用することで、大規模化するデータの保管と暗号化の管理が容易になります。一元的な鍵サービスは、データアクセスの監査と制限を簡易化するための単一のポイントにもなります。

状況と、暗号化するデータの量に応じて、類似したモデルを使用することもできます。単一の KEK を使用して、多数の DEK を保護できます。このモデルでは、一元的な鍵管理サービスで保管する鍵の量を大幅に増やすことなく、個々のデータ オブジェクトでそれぞれ独自の DEK を持つことができます。

Cloud Key Management Service は KEK を管理するように設計されているため、Encrypt 関数と Decrypt 関数の最大データ入力サイズは 64 KiB になっています。ただし、その上限に近づかないことがわかっているデータについては、Cloud KMS を使用して、直接データを暗号化および復号することができます。

エンベロープ暗号化を使用してデータを暗号化する方法

データを暗号化するプロセスでは、DEK をローカルに生成してその DEK でデータを暗号化し、KEK を使用して DEK をラップしてから、暗号化されたデータとラップされた DEK を保管します。KEK が Cloud KMS の外部に出ることはありません。

暗号化フロー

エンベロープ暗号化を使用してデータを暗号化する手順は次のとおりです。

  1. DEK をローカルに生成します。これは、OpenSSL のようなオープンソース ライブラリを使い、鍵を生成するための暗号タイプとパスワードを指定して行うことができます。必要に応じて、使用するソルトとダイジェストを指定することもできます。

  2. この DEK をローカルで使用して、データを暗号化します。

    たとえば、メッセージの暗号化の例に示されているように、OpenSSL を使用することができます。ベスト プラクティスとして、Galois Counter Mode(GCM)で 256 ビットの Advanced Encryption Standard(AES-256)暗号を使用してください。

  3. Cloud KMS で KEK として動作する鍵を新規に生成するか、既存の鍵を使用します。この鍵を使用して DEK を暗号化(ラップ)します。

  4. 暗号化されたデータとラップされた DEK を保管します。

エンベロープ暗号化を使用してデータを復号する方法

データを復号するプロセスでは、暗号化されたデータとラップされた DEK を特定し、DEK をラップした KEK を取得してから、KEK を使用して DEK をラップ解除し、ラップ解除された DEK を使用してデータを復号します。KEK が Cloud KMS の外部に出ることはありません。

復号フロー

エンベロープ暗号化を使用してデータを復号する手順は次のとおりです。

  1. 暗号化されたデータとラップされた DEK を取得します。

  2. Cloud KMS に保管されている鍵を使用して、暗号化された DEK をラップ解除します。

  3. プレーン テキスト DEK を使用して、暗号化されたデータを復号します。前述と同様に OpenSSL を使用する場合は、メッセージの復号の例をご覧ください。

エンベロープ暗号化による暗号化と復号の方法に関するサンプルコードについては、Tink と Cloud KMS を使用したクライアントサイド暗号化をご覧ください。

Google Cloud サービスとの統合

いくつかの Google Cloud プロダクトは、Cloud KMS と統合されること鍵で顧客管理の暗号(CMEK)機能をサポートしています。CMEK に Cloud KMS で対応することでデータの保護レイヤが増え、暗号鍵の管理が可能になり、Cloud KMS の鍵管理のメリットを活用できます。CMEK をサポートするプロダクトの全一覧については、他のサービスで Cloud KMS を使用するをご覧ください。

他の Google Cloud サービスのオプション

CMEK に対応していない Google Cloud プロダクトに保存されているデータについては、独自のアプリケーション レイヤ暗号化を実装できます。それには、暗号化されたデータを Google Cloud にローカルに保管できるように、前述に従って独自のエンベロープ暗号化を実装する必要があります。これは、Cloud KMS を使用して他のクラウド サービス プロバイダに、またはオンプレミスで保管するデータを暗号化する方法でもあります。

以下のプロダクトは、CMEK のサポートに加えて、顧客指定の暗号鍵(CSEK)機能をサポートしています。

プロダクト CSEK トピック
Cloud Storage 顧客指定の暗号鍵
Compute Engine 顧客指定の暗号鍵でディスクを暗号化する

CSEK で、KEK として機能する独自の AES-256 鍵を指定し、データを保護する DEK を保護します。CSEK 鍵は、Cloud KMS 鍵を使用して保護の追加レイヤで保護されます。

以上で、鍵を Cloud KMS にインポートできるようになりました。CSEK に依存せず、鍵をインポートして CMEK 対応サービスで使用できます。