エンベロープ暗号化

はじめに

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

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

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

鍵は、使いやすさを考えて設計された鍵階層に Cloud KMS が保管します。鍵階層内のリソースへのアクセスは、Cloud IAM によって管理されます。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 のバランス調整

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

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

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

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

データを暗号化するプロセスでは、DEK をローカルに生成してその DEK でデータを暗号化し、KEK を使用して DEK をラップしてから、暗号化されたデータとラップされた DEK を保管します。

暗号化フロー

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

  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 を使用してデータを復号します。

復号フロー

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

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

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

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

Google Cloud サービスとの統合

いくつかの GCP プロダクトは、Cloud KMS と統合されることで Customer-Managed Encryption Key (CMEK)機能をサポートしています。CMEK に Cloud KMS で対応することでデータの保護レイヤが増え、暗号鍵の管理が可能になり、Cloud KMS の鍵管理のメリットを活用できます。

以下の GCP プロダクトは、Cloud KMS を使用した CMEK に対応しています。

プロダクト CMEK トピック
BigQuery Cloud KMS 鍵によるデータの保護
Cloud Build 暗号化されたリソースの使用
Cloud Dataproc 顧客管理の暗号鍵
Cloud Storage 顧客管理の暗号鍵の使用
Compute Engine Cloud KMS 鍵によるリソースの保護

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

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

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

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

CSEK を使用すると、前述のエンベロープ暗号化モデルで、データを暗号化する DEK を保護するために使用される KEK を置き換える AES-256 鍵を提供できます。現在、Cloud KMS から鍵をインポートまたはエクスポートすることはできないため、Cloud KMS の鍵を顧客指定の暗号鍵として使用するのではなく、Cloud KMS の鍵でその鍵を保護します(もう 1 つのレイヤになります)。前述のように、CSEK 用に使用するローカル DEK を生成し、その DEK を Cloud KMS の KEK でラップできます。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud KMS ドキュメント