このページでは、Spanner で手動で作成した顧客管理の暗号鍵(CMEK)を使用する方法について説明します。
CMEK の詳細については、顧客管理の暗号鍵(CMEK)の概要をご覧ください。
CMEK 有効化データベースを作成する
Cloud Key Management Service(Cloud KMS)で鍵を作成します。Spanner は、次の Cloud KMS タイプの作成をサポートしています。
鍵は Spanner インスタンスと同じロケーションにあることが必要です。たとえば、Spanner インスタンス構成が
us-west1
にある場合、Cloud KMS キーリングのロケーションもus-west1
である必要があります。すべての Spanner マルチリージョン インスタンス構成で、対応する Cloud KMS キーリング ロケーションが存在するわけではありません。カスタム、デュアルリージョン、マルチリージョンの各インスタンス構成の Spanner データベースでは、複数リージョン(単一リージョン)の Cloud KMS 鍵を使用してデータベースを保護できます。次に例を示します。
- Spanner データベースがマルチリージョン インスタンス構成
nam14
にある場合は、us-east4
、northamerica-northeast1
、us-east1
の Cloud KMS 鍵を作成できます。 - データベースが、
nam3
をベース インスタンス構成として使用し、us-central2
にもう一つの読み取り専用レプリカを持つカスタム インスタンス構成にある場合は、us-east4
、us-east1
、us-central1
、us-central2
の Cloud KMS 鍵を作成できます。
省略可: Spanner インスタンス構成のレプリカのロケーションを一覧表示するには、
gcloud spanner instances get-locations
コマンドを使用します。gcloud spanner instances get-locations <var>INSTANCE_ID</var>
詳しくは、次のリソースをご覧ください。
- Spanner データベースがマルチリージョン インスタンス構成
Spanner に鍵へのアクセス権を付与します。
Cloud Shell で、サービス エージェントを作成して表示するか、アカウントがすでに存在する場合はそれを表示します。
gcloud beta services identity create --service=spanner.googleapis.com \ --project=PROJECT_ID
gcloud ベータ版コマンド コンポーネントのインストールを求められたら、「
Y
」と入力します。インストール後、コマンドが自動的に再開されます。gcloud services identity
コマンドは、ユーザーに代わって Spanner が Cloud KMS 鍵にアクセスする際に使用するサービス エージェントを作成または取得します。サービス アカウント ID は、メールアドレスに類似した形式です。
Service identity created: service-xxx@gcp-sa-spanner.iam.gserviceaccount.com
Spanner インスタンス構成の各リージョン(
--location
)のサービス アカウントに Cloud KMS CryptoKey 暗号化/復号(cloudkms.cryptoKeyEncrypterDecrypter
)ロールを付与します。それには、gcloud kms keys add-iam-policybinding
コマンドを実行します。gcloud kms keys add-iam-policy-binding KMS_KEY \ --location KMS_KEY_LOCATION \ --keyring KMS_KEY_RING \ --project=PROJECT_ID \ --member serviceAccount:service-xxx@gcp-sa-spanner.iam.gserviceaccount.com \ --role roles/cloudkms.cryptoKeyEncrypterDecrypter
出力例を次に示します。
Updated IAM policy for key [KMS_KEY]
複数の Cloud KMS 鍵を使用してデータベースを保護している場合は、すべての鍵に対して
gcloud kms keys add-iam-policybinding
コマンドを実行します。このロールにより、サービス アカウントには Cloud KMS 鍵による暗号化と復号の両方が許可されます。詳細については、Cloud KMS の権限とロールをご覧ください。
データベースを作成し、Cloud KMS 鍵を指定します。
Console
コンソールを使用して、リージョン インスタンス構成でデータベースを作成します。
Google Cloud コンソールで、[インスタンス] ページに移動します。
データベースを作成するインスタンスをクリックします。
[データベースを作成] をクリックし、必須のフィールドを入力します。
[暗号化オプションを表示する] をクリックします。
[Cloud KMS 鍵] を選択します。
プルダウン リストから鍵を選択します。
鍵のリストは、現在の Google Cloud プロジェクトに限定されます。 別の Google Cloud プロジェクトの鍵を使用するには、Google Cloud コンソールではなく gcloud CLI を使用してデータベースを作成します。
データベースが作成されたら、[Database overview] ページを表示すると、データベースが CMEK 対応であることを確認できます。
gcloud
リージョン、カスタム、マルチリージョンの各インスタンス構成で CMEK 対応データベースを作成するには、gcloud spanner databases create
コマンドを実行します。
gcloud spanner databases create DATABASE \
--project=SPANNER_PROJECT_ID \
--instance=INSTANCE_ID \
--ddl="CREATE TABLE Users (Id INT64 NOT NULL, FirstName STRING(100) NOT NULL, LastName STRING(100) NOT NULL,) PRIMARY KEY (Id)" \
--kms-project=KMS_PROJECT_ID \
--kms-location=KMS_KEY_LOCATION \
--kms-keyring=KMS_KEYRING \
--kms-keys=KMS_KEY_1[, KMS_KEY_2 ... ]
データベースが CMEK 対応であることを確認するには、gcloud spanner databases describe
コマンドを実行します。
gcloud spanner databases describe DATABASE \
--project=SPANNER_PROJECT_ID \
--instance=INSTANCE_ID
CMEK 対応データベースには、次の出力例に示すように encryptionConfig
のフィールドが含まれます。
encryptionConfig:
kmsKeyNames:projects/my-kms-project/locations/eur5/keyRings/my-kms-key-ring/cryptoKeys/my-kms-key
name: projects/my-spanner-project/instances/my-instance/databases/my-db
state: READY
クライアント ライブラリ
C#
リージョン インスタンス構成で CMEK 対応データベースを作成するには:
C++
リージョン インスタンス構成で CMEK 対応データベースを作成するには:
Go
リージョン インスタンス構成で CMEK 対応データベースを作成するには:
Java
リージョン インスタンス構成で CMEK 対応データベースを作成するには:
Node.js
リージョン インスタンス構成で CMEK 対応データベースを作成するには:
マルチリージョン インスタンス構成で CMEK 対応データベースを作成するには:
PHP
リージョン インスタンス構成で CMEK 対応データベースを作成するには:
マルチリージョン インスタンス構成で CMEK 対応データベースを作成するには:
Python
リージョン インスタンス構成で CMEK 対応データベースを作成するには:
Ruby
リージョン インスタンス構成で CMEK 対応データベースを作成するには:
マルチリージョン インスタンス構成で CMEK 対応データベースを作成するには:
使用中の鍵バージョンを表示する
データベースの [encryption_info
] フィールドには、鍵バージョンに関する情報が表示されます。
データベースの鍵バージョンが変更されても、変更は直ちには encryption_info
に伝播されません。変更がこのフィールドに反映されるまでに時間がかかる場合があります。
Console
Google Cloud コンソールで、[インスタンス] ページに移動します。
表示するデータベースを含むインスタンスをクリックします。
データベースをクリックします。
暗号化の情報は、[データベースの詳細] ページに表示されます。
gcloud
データベースの encryption_info
を取得するには、gcloud spanner databases describe
コマンドまたは gcloud spanner databases list
コマンドを実行します。次に例を示します。
gcloud spanner databases describe DATABASE \
--project=SPANNER_PROJECT_ID \
--instance=INSTANCE_ID
出力例を次に示します。
name: projects/my-project/instances/test-instance/databases/example-db
encryptionInfo:
- encryptionType: CUSTOMER_MANAGED_ENCRYPTION
kmsKeyVersion: projects/my-kms-project/locations/my-kms-key1-location/keyRings/my-kms-key-ring1/cryptoKeys/my-kms-key1/cryptoKeyVersions/1
- encryptionType: CUSTOMER_MANAGED_ENCRYPTION
kmsKeyVersion: projects/my-kms-project/locations/my-kms-key2-location/keyRings/my-kms-key-ring2/cryptoKeys/my-kms-key2/cryptoKeyVersions/1
鍵を無効にする
使用中の鍵バージョンは、こちらの手順に沿って無効にしてください。
変更が有効になるまで待ちます。鍵の無効化が伝播されるまでに最長 3 時間を要する場合があります。
データベースにアクセスできなくなったことを確認するには、CMEK が無効になっているデータベースでクエリを実行します。
gcloud spanner databases execute-sql DATABASE \ --project=SPANNER_PROJECT_ID \ --instance=INSTANCE_ID \ --sql='SELECT * FROM Users'
次のエラー メッセージが表示されます。
KMS key required by the Spanner resource is not accessible.
鍵を有効にする
鍵バージョンごとにこちらの手順に沿って、データベースで使用される鍵バージョンを有効にします。
変更が有効になるまで待ちます。鍵の有効化が伝播されるまでには、最長で 3 時間を要する場合があります。
データベースにアクセスできなくなったことを確認するには、CMEK 対応データベースでクエリを実行します。
gcloud spanner databases execute-sql DATABASE \ --project=SPANNER_PROJECT_ID \ --instance=INSTANCE_ID \ --sql='SELECT * FROM Users'
変更が有効になっていると、コマンドは正常に実行されます。
データベースのバックアップ
Spanner バックアップを使用して、データベースのバックアップを作成できます。デフォルトでは、データベースから作成された Spanner バックアップは、データベース自体と同じ暗号化構成を使用します。必要に応じて、別の暗号化構成をバックアップに指定することもできます。
Console
コンソールを使用して、リージョン インスタンス構成でバックアップを作成します。
Google Cloud コンソールで、[インスタンス] ページに移動します。
バックアップするデータベースを含むインスタンス名をクリックします。
データベースをクリックします。
ナビゲーション パネルで [バックアップ / 復元] をクリックします。
[バックアップ] タブで、[バックアップを作成] をクリックします。
バックアップの名前を入力し、有効期限を選択します。
省略可: [暗号化オプションを表示する] をクリックします。
a. バックアップに別の暗号化構成を使用する場合は、[既存の暗号化を使用する] の横にあるスライダーをクリックします。
a. [Cloud KMS 鍵] を選択します。
a. プルダウン リストから鍵を選択します。
鍵のリストは、現在の Google Cloud プロジェクトに限定されます。別の Google Cloud プロジェクトの鍵を使用するには、Google Cloud コンソールではなく gcloud CLI を使用してデータベースを作成します。
[作成] をクリックします。
[バックアップ] テーブルには、各バックアップの暗号化情報が表示されます。
gcloud
リージョン、カスタム、マルチリージョンの各インスタンス構成で CMEK 対応のバックアップを作成するには、gcloud spanner backups create
コマンドを実行します。
gcloud spanner backups create BACKUP \
--project=SPANNER_PROJECT_ID \
--instance=INSTANCE_ID \
--database=DATABASE \
--retention-period=RETENTION_PERIOD \
--encryption-type=customer_managed_encryption \
--kms-project=KMS_PROJECT_ID \
--kms-location=KMS_KEY_LOCATION \
--kms-keyring=KMS_KEY_RING \
--kms-keys=KMS_KEY_1[, KMS_KEY_2 ... ]
--async
作成されたバックアップが CMEK で暗号化されていることを確認するには:
gcloud spanner backups describe BACKUP \
--project=SPANNER_PROJECT_ID \
--instance=INSTANCE_ID
クライアント ライブラリ
C#
リージョン インスタンス構成で CMEK 対応のバックアップを作成するには:
C++
リージョン インスタンス構成で CMEK 対応のバックアップを作成するには:
Go
リージョン インスタンス構成で CMEK 対応のバックアップを作成するには:
Java
リージョン インスタンス構成で CMEK 対応のバックアップを作成するには:
Node.js
リージョン インスタンス構成で CMEK 対応のバックアップを作成するには:
マルチリージョン インスタンス構成で CMEK 対応のバックアップを作成するには:
PHP
リージョン インスタンス構成で CMEK 対応のバックアップを作成するには:
マルチリージョン インスタンス構成で CMEK 対応のバックアップを作成するには:
Python
リージョン インスタンス構成で CMEK 対応のバックアップを作成するには:
Ruby
リージョン インスタンス構成で CMEK 対応のバックアップを作成するには:
マルチリージョン インスタンス構成で CMEK 対応のバックアップを作成するには:
バックアップをコピーする
あるインスタンスから別のリージョンまたはプロジェクトの別のインスタンスに、Spanner データベースのバックアップをコピーできます。デフォルトでは、コピーされたバックアップは、ソース バックアップ暗号化と同じ暗号化構成(Google 管理または顧客管理)を使用します。この動作は、バックアップのコピー時に別の暗号化構成を指定することでオーバーライドできます。リージョン間でコピーするときに、コピーしたバックアップが CMEK で暗号化されるようにするには、宛先のリージョンに対応する Cloud KMS 鍵を指定します。
Console
コンソールを使用して、リージョン インスタンス構成のバックアップをコピーします。
Google Cloud コンソールで、[インスタンス] ページに移動します。
バックアップするデータベースを含むインスタンス名をクリックします。
データベースをクリックします。
ナビゲーション パネルで [バックアップ / 復元] をクリックします。
[バックアップ] テーブルで、バックアップの [アクション] を選択し、[コピー] をクリックします。
宛先インスタンスを選択、名前を指定し、バックアップ コピーの有効期限を選択して、フォームに入力します。
省略可: バックアップに別の暗号化構成を使用する場合は、[暗号化オプションを表示] をクリックします。
a. [Cloud KMS 鍵] を選択します。
a. プルダウン リストから鍵を選択します。
鍵のリストは、現在の Google Cloud プロジェクトに限定されます。別の Google Cloud プロジェクトの鍵を使用するには、Google Cloud コンソールではなく gcloud CLI を使用してデータベースを作成します。
[コピー] をクリックします。
gcloud
新しい暗号化構成でバックアップを同じプロジェクト内の別のインスタンスにコピーするには、次の gcloud spanner backups copy
コマンドを実行します。
gcloud spanner backups copy --async \
--source-instance=INSTANCE_ID \
--source-backup=SOURCE_BACKUP_NAME \
--destination-instance=DESTINATION_INSTANCE_ID \
--destination-backup=DESTINATION_BACKUP_NAME \
--expiration-date=EXPIRATION_DATE \
--encryption-type=CUSTOMER_MANAGED_ENCRYPTION \
--kms-keys=KMS_KEY_1[, KMS_KEY_2 ... ]
新しい暗号化構成でバックアップを別のプロジェクトの別のインスタンスにコピーするには、次の gcloud spanner backups copy
コマンドを実行します。
gcloud spanner backups copy --async \
--source-backup=SOURCE_BACKUP_NAME \
--destination-backup=DESTINATION_BACKUP_NAME \
--encryption-type=CUSTOMER_MANAGED_ENCRYPTION \
--kms-keys=KMS_KEY_1[, KMS_KEY_2 ... ]
コピーされたバックアップが CMEK で暗号化されていることを確認するには:
gcloud spanner backups describe BACKUP \
--project=SPANNER_PROJECT_ID \
--instance=INSTANCE_ID
クライアント ライブラリ
Node.js
マルチリージョン インスタンス構成で CMEK 対応バックアップをコピーするには:
PHP
マルチリージョン インスタンス構成で CMEK 対応バックアップをコピーするには:
Ruby
マルチリージョン インスタンス構成で CMEK 対応バックアップをコピーするには:
バックアップから復元する
新しいデータベースに Spanner データベースのバックアップを復元できます。デフォルトでは、バックアップから復元されたデータベースはバックアップ自体と同じ暗号化構成を使用しますが、復元されるデータベースに別の暗号化構成を指定してこの動作をオーバーライドすることもできます。バックアップが CMEK によって保護されている場合、復号できるようにバックアップの作成に使用した鍵バージョンが利用可能な状態にする必要があります。
Console
コンソールを使用して、リージョン インスタンス構成でバックアップを復元します。
Google Cloud コンソールで、[インスタンス] ページに移動します。
復元するデータベースを含むインスタンスをクリックします。
データベースをクリックします。
ナビゲーション パネルで [バックアップ / 復元] をクリックします。
[バックアップ] テーブルで、バックアップの [アクション] を選択し、[復元] をクリックします。
復元するインスタンスを選択し、復元するデータベースに名前を付けます。
省略可: 復元したデータベースで別の暗号化構成を使用する場合は、[既存の暗号化を使用する] の横にあるスライダーをクリックします。
a. [Cloud KMS 鍵] を選択します。
a. プルダウン リストから鍵を選択します。
鍵のリストは、現在の Google Cloud プロジェクトに限定されます。別の Google Cloud プロジェクトの鍵を使用するには、Google Cloud コンソールではなく gcloud CLI を使用してデータベースを作成します。
[復元] をクリックします。
gcloud
新しい暗号化構成でバックアップを復元するには、次の gcloud spanner databases restore
コマンドを実行します。
gcloud spanner databases restore --async \
--project=SPANNER_PROJECT_ID \
--destination-instance=DESTINATION_INSTANCE_ID \
--destination-database=DESTINATION_DATABASE_ID \
--source-instance=SOURCE_INSTANCE_ID \
--source-backup=SOURCE_BACKUP_NAME
復元されたデータベースが CMEK で暗号化されていることを確認するには:
gcloud spanner databases describe DATABASE \
--project=SPANNER_PROJECT_ID \
--instance=INSTANCE_ID
詳細については、バックアップからの復元をご覧ください。
クライアント ライブラリ
C#
リージョン インスタンス構成で CMEK 対応バックアップを復元するには:
C++
リージョン インスタンス構成で CMEK 対応バックアップを復元するには:
Go
リージョン インスタンス構成で CMEK 対応バックアップを復元するには:
Java
リージョン インスタンス構成で CMEK 対応バックアップを復元するには:
Node.js
リージョン インスタンス構成で CMEK 対応バックアップを復元するには:
マルチリージョン インスタンス構成で CMEK 対応バックアップを復元するには:
PHP
リージョン インスタンス構成で CMEK 対応バックアップを復元するには:
マルチリージョン インスタンス構成で CMEK 対応バックアップを復元するには:
Python
リージョン インスタンス構成で CMEK 対応バックアップを復元するには:
Ruby
リージョン インスタンス構成で CMEK 対応バックアップを復元するには:
マルチリージョン インスタンス構成で CMEK 対応バックアップを復元するには:
Cloud KMS 鍵の監査ログを表示する
プロジェクト内の Cloud KMS API でロギングが有効になっていることを確認します。
Google Cloud コンソールで、[ログ エクスプローラ] に移動します。
クエリビルダーに次の行を追加して、ログエントリを Cloud KMS 鍵に限定します。
resource.type="cloudkms_cryptokey" resource.labels.location="KMS_KEY_LOCATION" resource.labels.key_ring_id="KMS_KEY_RING_ID" resource.labels.crypto_key_id="KMS_KEY_ID"
通常のオペレーションでは、暗号化アクションと復号アクションは
INFO
重大度でログに記録されます。これらのエントリは、Spanner インスタンスのゾーンとしてログに記録され、約 5 分ごとに Cloud KMS 鍵をポーリングします。Spanner が鍵へのアクセスに失敗すると、そのオペレーションは
ERROR
としてログに記録されます。