顧客管理の暗号鍵(CMEK)の概要

このページでは、Spanner の顧客管理の暗号鍵(CMEK)について説明します。CMEK の一般的な用途や使用する理由などの詳細については、Cloud KMS のドキュメントをご覧ください。

デフォルトでは、Spanner はお客様のコンテンツを保存時に暗号化します。暗号化は Spanner が行うため、ユーザー側での操作は必要ありません。このオプションは、Google のデフォルトの暗号化と呼ばれます。

暗号鍵を管理する場合は、Cloud KMS の顧客管理の暗号鍵(CMEK)を、Spanner などの CMEK 統合サービスで使用できます。Cloud KMS 鍵を使用すると、保護レベル、ロケーション、ローテーション スケジュール、使用とアクセスの権限、暗号境界を制御できます。Cloud KMS を使用すると、鍵の使用状況を追跡すること、監査ログを表示すること、鍵のライフサイクルを管理することが可能です。データを保護する対称鍵暗号鍵(KEK)は Google が所有して管理するのではなく、ユーザーが Cloud KMS でこれらの鍵を制御および管理します。

CMEK を使用してリソースを設定した後は、Spanner リソースへのアクセスは、Google のデフォルトの暗号化を使用する場合と同様です。暗号化オプションの詳細については、顧客管理の暗号鍵(CMEK)をご覧ください。

手動で作成した CMEK を使用して Spanner リソースを保護する方法については、CMEK でデータベースを保護するをご覧ください。

Cloud KMS Autokey による CMEK

CMEK は手動で作成して Spanner リソースを保護することも、Cloud KMS Autokey を使用することもできます。Autokey を使用すると、Spanner のリソース作成の一環として、キーリングと鍵がオンデマンドで生成されます。暗号化と復号のオペレーションに鍵を使用するサービス エージェントがまだ存在しない場合、そのエージェントが作成され、必要な Identity and Access Management(IAM)ロールが付与されます。詳細については、Autokey の概要をご覧ください。

Terraform または REST API を使用してリソースを作成する場合、Spanner と互換性があるのは Cloud KMS Autokey のみです。Cloud KMS Autokey を使用して、Spanner データベースに複数リージョン(単一リージョン)の Cloud KMS 鍵を作成することはできません。

Cloud KMS Autokey によって作成された CMEK を使用して Spanner リソースを保護する際は、Secret Manager リソースでの Autokey の使用で Secret Manager 用に示されている手順を例として使用します。

機能

  • データアクセス制御: 管理者は、Spanner に保存されたデータの保護に使用する鍵のローテーション、アクセスの管理、無効化や破棄を行うことができます。
  • 監査可能性: プロジェクトで Cloud KMS API の監査ロギングを有効にすると、Spanner により実行されたものを含む鍵に対するすべてのアクションは、Cloud Logging で記録され、表示されます。Cloud EKM 鍵では、Key Access Justification がサポートされています。これにより、すべての鍵リクエストに [Justification] フィールドが追加されます。一部の外部鍵管理パートナーでは、この理由に基づいて、これらのリクエストを自動的に承認または拒否できます。
  • パフォーマンス: CMEK を使用しても、Spanner のパフォーマンスサービスレベル契約に変更はありません。
  • 複数のリージョン鍵のサポート: 複数のリージョン(単一リージョン)Cloud KMS 鍵を作成して、Spanner のカスタム、デュアルリージョン、マルチリージョン インスタンス構成でデータベースを保護できます。

料金

Spanner では、他のデータベースと同様に CMEK 対応データベースに対して課金されます。CMEK を有効にしても、Spanner の追加料金は発生しません。詳細については、Spanner の料金をご覧ください。

Cloud KMS では(Spanner が鍵を暗号化/復号に使用するごとに)鍵の費用とその鍵に対する暗号化オペレーションの費用に対して、課金されます。これらの費用は、Spanner によって生成される暗号化オペレーションの想定数に基づいて最小限になることが期待されます。 詳細については、Cloud KMS の料金をご覧ください。

CMEK による保護対象

CMEK を有効化したデータベースの場合、Spanner は Cloud KMS 鍵を使用して保存データを保護します。これには、ディスクまたはフラッシュに保存されたデータベースのデータも含まれます。

以下の例外が適用されます。次のタイプのデータは、CMEK 鍵ではなく、保存時の Google のデフォルトの暗号化によって保護されます。

  • 範囲境界をマークする行キーのサブセット
  • コアダンプやオペレーション ログなどのデバッグデータ
  • 転送中のデータやメモリ内データ
  • データベースのメタデータ

Spanner には、3 つの暗号化レイヤがあります。保存データはサブファイル チャンクに分割されて保存されます。各チャンクは個別の暗号鍵を使用してストレージ レベルで暗号化されます。チャンクのデータを暗号化するための鍵は「データ暗号鍵(DEK)」と呼ばれています。Google で使用する鍵は膨大な数にのぼり、また低レイテンシと高可用性を実現する必要があるため、これらの鍵は暗号化対象のデータの近くに保存されます。DEK は「鍵暗号鍵(KEK)」を使用して暗号化(「ラップ」)されます。最後に、各 KEK は CMEK で暗号化されます。

CMEK 鍵をローテーションすると、Spanner は中間 KEK のみを最新のプライマリ バージョンの CMEK 鍵で再暗号化します。再暗号化が完了した後、以前のバージョンの CMEK 鍵を無効にしたり削除したりしても、データベースへのアクセスが無効になることはありません。データベースの保護に使用されている鍵バージョンを表示することもできます。

CMEK を使用する場合

顧客管理の暗号鍵による暗号化を示す図

CMEK を使用しない場合

Google 所有の Google 管理鍵による暗号化を示す図

CMEK を有効にする

Spanner データベースに CMEK を使用するには、新しいデータベースを作成し、データベース作成時に Cloud KMS 鍵を指定する必要があります。ユーザーが Google が管理する Spanner サービス アカウントに対し Cloud KMS CryptoKey Encrypter/Decrypterroles/cloudkms.cryptoKeyEncrypterDecrypter)ロールを付与すると、Spanner はユーザーに代わって鍵にアクセスできるようになります。詳細な手順については、CMEK を使用してデータベースを保護するをご覧ください。

セッションの管理やデータに対するトランザクションの実行などに使用される Spanner のデータアクセス API は、CMEK と Google が所有する鍵および Google が管理する鍵の両方でまったく同じです。アプリケーションでは、データの読み取りまたは書き込みの際に、鍵や暗号化構成を指定する必要はありません。すべての暗号化はサービスによって処理されます。

鍵を管理

鍵管理オペレーションは、Cloud KMS を使用して実行されます。Spanner は、Cloud KMS によって伝播されるまで、鍵の変更の検出や操作はできません。鍵の無効化や破棄などのオペレーションでは、その伝播に最大 3 時間かかることがあります。通常、権限の変更ははるかに速く反映されます。

データベースが作成されると、Spanner は約 5 分ごとに Cloud KMS を呼び出して、鍵が引き続き有効であることを確認します。

Cloud KMS 鍵が無効化または破棄されたことを Spanner が検出すると、データベースをアクセス不能にするオペレーションがすぐに開始されます。セッション、読み取り、書き込みを含むデータベースに対する後続の呼び出しには、FAILED_PRECONDITION エラー(KMS key required by the Spanner resource is not accessible.)が返されます。Spanner の Cloud KMS に対する呼び出しで、以前無効にされた鍵の再有効化が検出されると、Cloud KMS は自動的に Spanner データベースへのアクセスを復元します。

また、データベースが複数のリージョン鍵で保護されていて、すべての鍵が無効化または破棄されている場合、Spanner はデータベースにアクセスできなくする処理を直ちに開始します。Spanner は、データベースの鍵のサブセットのみが無効化または破棄されたことを検出すると、12 時間以内にデータベースを無効にします。CMEK 対応データベース内の鍵のサブセットのみを無効化または破棄することは強くおすすめしません。動作が不安定になる可能性があります。これを回避するには、Spanner CMEK 鍵の指標instance/replica/cmek/total_keys)を使用して、鍵のサブセットが無効化または破棄された場合にアラートをトリガーします。詳細については、CMEK のサブセットを無効にするアラートを作成するをご覧ください。

CMEK のサブセットを無効にするアラートを作成する

Spanner CMEK 鍵/instance/replica/cmek/total_keys)指標を使用すると、CMEK のサブセットが無効化または破棄された場合にアラートをトリガーできます。このアラート ポリシーを作成するには、次の手順と設定を展開します。

CMEK アラート ポリシーの設定。

[新しい条件]
フィールド

リソースと指標 [リソース] メニューで、[Spanner インスタンス] を選択します。
[指標カテゴリー] メニューで、[インスタンス] を選択します。
[指標] メニューで、[CMEK 鍵] を選択します。

(metric.type は spanner.googleapis.com/instance/replica/cmek/total_keys です)。
フィルタ instance_id = INSTANCE_ID
is_key_revoked = TRUE
時系列全体
時系列のグループ化の基準
database
時系列全体
時系列集計
sum
ローリング ウィンドウ 10 m
ローリング ウィンドウ関数 mean
アラート・トリガーの構成
フィールド

条件タイプ Threshold
アラート トリガー Any time series violates
しきい値の位置 Above threshold
しきい値 0
再テスト ウィンドウ 1 hr
[新しい条件]
フィールド

リソースと指標 [リソース] メニューで、[Spanner インスタンス] を選択します。
[指標カテゴリー] メニューで、[インスタンス] を選択します。
[指標] メニューで、[CMEK 鍵] を選択します。

(metric.type は spanner.googleapis.com/instance/replica/cmek/total_keys です)。
フィルタ instance_id = INSTANCE_ID
is_key_revoked = FALSE
時系列全体
時系列のグループ化の基準
database
時系列全体
時系列集計
sum
ローリング ウィンドウ 10 m
ローリング ウィンドウ関数 mean
アラート・トリガーの構成
フィールド

条件タイプ Threshold
アラート トリガー Any time series violates
しきい値の位置 Above threshold
しきい値 0
再テスト ウィンドウ 1 hr
アラート・トリガーの構成
フィールド

複数条件のトリガー All conditions are met

アラートを作成した後、CMEK のサブセットが無効になっていることが Spanner によって検出されると、アラートの [ポリシーの詳細] ページの [インシデント] テーブルの下にインシデントのサマリー アイテムが表示されます。オプションの通知チャンネルを設定することもできます。詳細については、通知チャンネルを作成して管理するをご覧ください。

使用できない鍵のステータスの処理方法

Cloud KMS が使用できない場合のようなまれなケースで、Spanner が Cloud KMS から鍵のステータスを取得できないことがあります。

Spanner が最初に Cloud KMS と通信不能になった時点で有効な鍵により Spanner データベースが保護されている場合、Spanner は、完全なデータベース オペレーションを最長 1 時間、最善の方法でサポートし続けます。これにより、ワークロードに対するこのようなインシデントの影響を最小限に抑えます。1 時間経過しても Spanner が Cloud KMS に接続できない場合、Spanner は保護対策としてデータベースをオフラインにする操作を開始します。データベースが Cloud KMS に再接続し、鍵がアクティブであると Cloud KMS が応答するまで、Spanner データベースのデータはアクセス不能となります。

逆に、Spanner が最初に Cloud KMS と通信不能となった時点で無効な鍵により Spanner データベースが保護されている場合、データベースが Cloud KMS に再接続可能になり鍵を再有効化するまで、データベースはアクセス不能になります。

複数のリージョン鍵を使用して Spanner データベースを保護している場合、使用できないリージョン Cloud KMS にある鍵で保護されているレプリカのみが、使用不可の影響を受けます。

外部の主な考慮事項

Cloud EKM 鍵を使用する場合、Google は外部の鍵管理パートナー システム内の外部管理鍵の可用性をコントロールできません。

外部で管理されている鍵が使用できない場合、Spanner は、鍵のキャッシュに保存されたバージョンを使用した完全なデータベース オペレーションを最大 1 時間サポートし続けます。1 時間経過しても Spanner が Cloud KMS に接続できない場合、Spanner は保護対策としてデータベースをオフラインにする操作を開始します。データベースの呼び出しは、FAILED_PRECONDITION エラー(External key error: Could not find a key resource at the key URI.)で失敗します。

複数の Cloud EKM 鍵を使用して Spanner データベースを保護している場合、使用できない鍵で保護されているレプリカのみが、使用不可の影響を受けます。

外部鍵を使用する際のその他の考慮事項については、Cloud External Key Manager のドキュメントをご覧ください。

バックアップと復元

CMEK または Google が所有し、Google が管理する鍵を使用して、Spanner のバックアップを保護できます。バックアップには、デフォルトでデータベースと同じ暗号化構成が使用されますが、バックアップの作成時に別の暗号化構成を指定することで、この動作をオーバーライドできます。バックアップが CMEK 対応の場合は、バックアップの作成時に KMS 鍵のプライマリ バージョンを使用して暗号化されます。バックアップを作成すると、KMS 鍵がローテーションされても、その鍵と鍵バージョンを変更できません。詳細については、データベースのバックアップをご覧ください。

デフォルトでは、バックアップからデータベースをrestoreする場合、復元されるデータベースではバックアップと同じ暗号化構成が使用されます。この動作は、データベースの復元時に別の暗号化構成を指定することでオーバーライドできます。CMEK を有効化したバックアップを復元するには、バックアップの暗号化に使用した鍵と鍵バージョンの両方が使用できる必要があります。詳細については、バックアップからの復元をご覧ください。

複数のリージョン鍵で暗号化されたデータベースに対して、作成、コピー、復元などのバックアップ オペレーションを実行できます。

バックアップ スケジュールによって作成されたすべてのバックアップは、CMEK または Google が所有し、Google が管理する鍵で保護できます。ただし、増分バックアップ スケジュールは、Google が所有し、Google が管理する鍵でのみ暗号化できます。

ロギング

プロジェクトで Cloud KMS API の監査ロギングを有効にしている場合は、Cloud Logging で Spanner が Cloud KMS に送信するリクエストを監査できます。Cloud Logging にこれらの Cloud KMS ログエントリが表示されます。

組織内で CMEK を必須に設定する、または制限する

Spanner を含むさまざまな Google Cloud プロダクトでの CMEK 保護の使用に関する組織全体のポリシーを設定できます。これらのポリシーにより、以下を規定できます。

  • 組織で作成された新しい Spanner データベースで、CMEK 保護を使用する必要がある。

  • 組織の Cloud KMS 鍵のうち、CMEK による保護に使用できる鍵を制限する。

詳しくは、CMEK の組織のポリシーをご覧ください。

次のステップ