顧客管理の暗号鍵(CMEK)を使用する
このページでは、Bigtable の顧客管理の暗号鍵(CMEK)に関連するタスクの実行方法について説明します。CMEK の一般的な用途や使用する理由などの詳細については、Cloud KMS のドキュメントをご覧ください。
すべての鍵管理タスクに Google Cloud Console を使用することをおすすめします。Google Cloud CLI を使用する場合は、Bigtable 向けの gcloud CLI をインストールします。
CMEK 鍵を準備する
CMEK で保護された Bigtable リソースを作成する前に、次の手順を行い、インスタンスのクラスタが存在する各リージョンに CMEK 鍵を作成する必要があります。
Bigtable サービス エージェントを作成する
CMEK 鍵を作成する前に、Bigtable サービス エージェントが必要です。Bigtable は、このサービス エージェントを使用して鍵にアクセスします。
コンソール
Google Cloud コンソールでサービス エージェントを作成することはできません。ただし、Google Cloud コンソールで鍵を作成すると、Cloud KMS 暗号化 / 復号のロールを付与するように求められます。サービス エージェントが存在しない場合は、その時点で作成されます。
gcloud
gcloud services identity create コマンドを実行して、ユーザーに代わって Bigtable が CMEK 鍵にアクセスする際のサービス エージェントを表示します。サービス アカウントが存在しない場合、このコマンドはサービス アカウントを作成して表示します。
gcloud beta services identity create \ --service=bigtableadmin.googleapis.com \ --project CBT_PROJECT
CBT_PROJECT
は、Bigtable リソースを含むプロジェクトに置き換えます。このコマンドは、メールアドレスに似た形式のサービス エージェント ID を表示します。後のステップで使用するため、出力メール文字列を記録します。
Service identity created: service-xxx@gcp-sa-bigtable.iam.gserviceaccount.com
キーを作成
Cloud KMS で直接作成された鍵または Cloud External Key Manager で利用できる外部管理鍵を使用できます。
鍵を管理する Google Cloud プロジェクトで、次の操作を行います。
次のいずれかのオプションを使用してキーリングと鍵を作成します。
- Cloud KMS でキーリングと鍵を直接作成する。
- 外部管理の鍵を使用する。外部鍵を作成してから Cloud EKM 鍵を作成し、その鍵を Cloud KMS で使用できるようにします。
Cloud KMS の鍵のロケーションは、使用する Bigtable クラスタと同じにする必要があります。たとえば、
us-central1
(アイオワ)でキーリングを作成した場合、us-central1-a
、us-central1-b
、us-central1-c
のクラスタはそのキーリングの鍵で保護できます。
鍵の IAM 設定を構成する
Console
Cloud KMS のロールをサービス エージェントに付与するには、次の手順を行います。詳細レベルでの設定が必要な場合は、鍵レベルまたは鍵リングレベルで権限を付与することもできます。
Google Cloud コンソールの [IAM] ページに移動します。
[追加] をクリックします。
Bigtable サービス エージェントのメール ID を入力します。
[Cloud KMS 暗号鍵の暗号化 / 復号] ロールを選択します。
[保存] をクリックします。
gcloud
サービス エージェントに
cloudkms.cryptoKeyEncrypterDecrypter
ロールを付与します。gcloud kms keys add-iam-policy-binding KMS_KEY \ --keyring KMS_KEYRING\ --location KMS_LOCATION \ --member serviceAccount:SERVICE_ACCOUNT_EMAIL \ --role roles/cloudkms.cryptoKeyEncrypterDecrypter \ --project KMS_PROJECT
次のフィールドを入力します。
KMS_KEY
: 鍵に割り当てた名前KMS_KEYRING
: 鍵が含まれる KMS キーリングKMS_LOCATION
: キーリングが含まれるリージョンSERVICE_ACCOUNT_EMAIL
: アクセス権を付与するサービス エージェントのメール形式の IDKMS_PROJECT
: 鍵が含まれるプロジェクト
CMEK 対応インスタンスを作成する
CMEK 鍵の作成と構成が完了したら、CMEK で保護されたインスタンスを作成できます。Google のデフォルトの暗号化によって保護されている既存の Bigtable インスタンスは、CMEK を使用するように変換できません。暗号化の種類と鍵は、作成時にのみ選択できます。
インスタンスを作成するの手順に沿って、CMEK で保護されたインスタンスを作成します。
使用中の鍵を表示する
鍵バージョンに関する情報は、encryption_info
フィールドから取得します。
テーブルの CMEK 鍵バージョンの情報を表示するには、次の手順を行います。
Console
Google Cloud コンソールの Bigtable インスタンス ページに移動します。
テーブルを含むインスタンスの名前をクリックして、[インスタンスの詳細] ページを開き、インスタンス内にあるクラスタのリストを表示します。
クラスタ ID の横にある [暗号鍵] の下の鍵名をクリックして、クラスタの鍵の [バージョン] ページを表示します。
gcloud
クラスタごとに CMEK の構成を確認できます。
gcloud bigtable clusters describe CLUSTER_ID \
--instance INSTANCE_ID --project CBT_PROJECT
次のフィールドを入力します。
CLUSTER_ID
: クラスタの永続的な識別子INSTANCE_ID
: インスタンスの永続的な識別子CBT_PROJECT
: Bigtable リソースが含まれるプロジェクト
コマンドによって次のような出力が表示されます。
defaultStorageType: SSD
encryptionConfig:
kmsKeyName: projects/cloud-kms-project/locations/us-central1/keyRings/cloud-bigtable-keys/cryptoKeys/my-cmek-key
location: projects/cloud-bigtable-project/locations/us-central1-a
name: projects/cloud-bigtable-project/instances/cmek-test-instance/clusters/my-cluster
serveNodes: 1
state: READY
鍵を無効にする
CMEK 鍵バージョンを無効にすると、その鍵バージョンで保護されているすべてのデータにアクセスできなくなります。鍵バージョンの破棄は、この操作を永続的(24 時間後)に行うことを意味します。 1 つまたは複数のクラスタの鍵のみを無効にするのではなく、インスタンスのすべての鍵を無効にします。
Console
これはおすすめの方法です。Google Cloud コンソールを使用すると、鍵のすべてのバージョンを一度に無効にできます。
鍵バージョンごとに行う場合は、こちらの手順を行ってください。
gcloud
Google Cloud コンソールで鍵を無効にすることをおすすめします。Google Cloud CLI を使用する場合は、次のコマンドを実行します。
CMEK 鍵のすべてのバージョンを一覧表示します。
gcloud kms keys versions list --key KMS_KEY \ --keyring KMS_KEYRING --location KMS_LOCATION \ --project KMS_PROJECT
次のフィールドを入力します。
KMS_KEY
: CMEK 鍵の名前KMS_KEYRING
: 鍵が含まれる KMS キーリングKMS_LOCATION
: キーリングが含まれるリージョンKMS_PROJECT
: 鍵が含まれるプロジェクト
出力は次のようになります。
NAME STATE KMS_KEY_NAME/cryptoKeyVersions/1 ENABLED KMS_KEY_NAME/cryptoKeyVersions/2 ENABLED KMS_KEY_NAME/cryptoKeyVersions/3 ENABLED KMS_KEY_NAME/cryptoKeyVersions/4 ENABLED
すべてのバージョンを無効にします。
for $KV in 1 2 3 4; do gcloud kms keys versions disable KV --key KMS_KEY \ --keyring KMS_KEYRING --location KMS_LOCATION \ --project KMS_PROJECT; done
次のフィールドを入力します。
1 2 3 4
: 無効にするバージョンKMS_KEY
: CMEK 鍵の名前KMS_KEYRING
: 鍵が含まれる KMS キーリングKMS_LOCATION
: キーリングが含まれるリージョンKMS_PROJECT
: 鍵が含まれるプロジェクト
すべての鍵バージョンを再度表示すると、その状態が
DISABLED
に変わっています。ただし、Bigtable がこの状態の変化に対応するまでに最大 4 時間かかる場合があります。(省略可)4 時間経過した後に、無効になった CMEK のステータスを確認するには、次のコマンドを実行します。
gcloud bigtable instances tables describe TABLE_ID \ --instance INSTANCE_ID --view ENCRYPTION \ --project CBT_PROJECT
次のフィールドを入力します。
TABLE_ID
: テーブルの永続的な識別子INSTANCE_ID
: インスタンスの永続的な識別子CBT_PROJECT
: Bigtable リソースが含まれるプロジェクト
コマンドによって次のような出力が表示されます。
clusterStates: CLUSTER: encryptionInfo: - encryptionStatus: code: 9 details: - '@type': type.googleapis.com/google.rpc.PreconditionFailure violations: - subject: KMS_KEY_NAME/cryptoKeyVersions/<int> type: KEY_DISABLED message: KMS_KEY_NAME is not enabled, current state is: DISABLED. encryptionType: CUSTOMER_MANAGED_ENCRYPTION kmsKeyVersion: KMS_KEY_NAME/cryptoKeyVersions/<int> name: projects/CBT_PROJECT/instances/INSTANCE/tables/TABLE
(省略可)インスタンスのクラスタが無効であることを確認するには、次のコマンドを実行します。
gcloud bigtable clusters list --instances INSTANCE_ID --project CBT_PROJECT
次のフィールドを入力します。
INSTANCE_ID
: インスタンスの永続的な識別子CBT_PROJECT
: Bigtable リソースが含まれるプロジェクト
コマンドによって次のような出力が表示されます。
NAME ZONE NODES STORAGE STATE my-cluster us-central1-a 1 SSD DISABLED my-other-cluster us-central1-b 1 SSD DISABLED
鍵を有効にする
鍵バージョンが無効になっている場合、Bigtable リソースにアクセスするために再度有効にできます。このオプションは、鍵バージョンが無効になってから 30 日間使用できます。
Console
これはおすすめの方法です。Google Cloud コンソールを使用すると、鍵のすべてのバージョンを一度に有効にできます。
鍵バージョンごとに行う場合は、こちらの手順を行ってください。
gcloud
Google Cloud コンソールで鍵を有効にすることをおすすめします。Google Cloud CLI を使用する場合は、次のコマンドを実行します。
バージョンの一覧を表示して、鍵のすべてのバージョンを確認します。
gcloud kms keys versions list --key KMS_KEY \ --keyring KMS_KEYRING --location KMS_LOCATION \ --project KMS_PROJECT
次のフィールドを入力します。
KMS_KEY
: CMEK 鍵の名前KMS_KEYRING
: 鍵が含まれる KMS キーリングKMS_LOCATION
: キーリングが含まれるリージョンKMS_PROJECT
: 鍵が含まれるプロジェクト
コマンドによって次のような出力が表示されます。
NAME STATE KMS_KEY_NAME/cryptoKeyVersions/1 DISABLED KMS_KEY_NAME/cryptoKeyVersions/2 DISABLED KMS_KEY_NAME/cryptoKeyVersions/3 DISABLED KMS_KEY_NAME/cryptoKeyVersions/4 DISABLED
一覧表示されているすべてのバージョンを指定して、
kms keys versions enable
コマンドを実行します。出力例を使用すると、コマンドは次のようになります。for $KV in 1 2 3 4; do gcloud kms keys versions enable KV --key KMS_KEY \ --keyring KMS_KEYRING --location KMS_LOCATION \ --project KMS_PROJECT; done
次のフィールドを入力します。
1 2 3 4
: 無効にするバージョンKMS_KEY
: CMEK 鍵の名前KMS_KEYRING
: 鍵が含まれる KMS キーリングKMS_LOCATION
: キーリングが含まれるリージョンKMS_PROJECT
: 鍵が含まれるプロジェクト
鍵バージョンのリストで、状態が
ENABLED
に変わっています。
Cloud KMS 鍵の監査ログを表示する
Cloud KMS データアクセス監査ログを有効にする前に、Cloud Audit Logs について理解しておく必要があります。
Cloud KMS データアクセス監査ログでは、Bigtable または CMEK 鍵を使用するように構成されている他のプロダクトが Cloud KMS に暗号化 / 復号呼び出しを行った日時を確認できます。Bigtable は、すべてのデータ リクエストに対して暗号化 / 復号呼び出しを実行するのではなく、鍵を定期的に確認するポーラーを維持します。ポーリングの結果は監査ログに表示されます。
監査ログは Google Cloud コンソールで設定と操作ができます。
プロジェクト内の Cloud KMS API でロギングが有効になっていることを確認します。
Google Cloud コンソールで Cloud Logging に移動します。
クエリビルダーに次の行を追加して、ログエントリを Cloud KMS 鍵に限定します。
resource.type="cloudkms_cryptokey" resource.labels.key_ring_id = KMS_KEYRING resource.labels.crypto_key_id = KMS_KEY
次のフィールドを入力します。
KMS_KEY
: CMEK 鍵の名前KMS_KEYRING
: 鍵が含まれる KMS キーリング
このログには、各クラスタのテーブルごとに約 5 分間隔でログエントリが記録されます。ログエントリは次のようになります。
Info 2021-03-20 08:02:24.869 EDT Cloudkms.googleapis.com Decrypt projects/cloud-kms-project/locations/us-central1/keyRings/cloud-bigtable-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-bigtable.iam.gserviceaccount.com audit_log, method: "Decrypt", principal_email: "service-1234567891011@gcp-sa-bigtable.iam.gserviceaccount.com" Info 2021-03-20 08:02:24.913 EDT Cloudkms.googleapis.com Encrypt projects/cloud-kms-project/locations/us-central1/keyRings/cloud-bigtable-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-bigtable.iam.gserviceaccount.com audit_log, method: "Encrypt", principal_email: "service-123456789123@gcp-sa-bigtable.iam.gserviceaccount.com"
監査ログの解釈方法については、監査ログについてをご覧ください。
鍵の使用状況を表示する
Cloud KMS を使用すると、鍵で保護されている Bigtable リソースについて次の情報を確認できます。
- 鍵の使用状況の概要: 鍵を使用する保護されたリソースとプロジェクトの数に関する情報が含まれます。
- 鍵の使用状況の詳細: 鍵が保護しているリソースと、鍵に依存するリソースを識別します。
サポートされている Bigtable リソースは次のとおりです。
bigtableadmin.googleapis.com/Backup
bigtableadmin.googleapis.com/Cluster
bigtableadmin.googleapis.com/Table
鍵の使用状況の情報を表示するには、鍵の使用状況の情報を表示するをご覧ください。
テーブルの暗号化ステータスを表示する
Console
Google Cloud コンソールでテーブルの暗号化ステータスを表示することはできません。
gcloud
テーブルに CMEK の詳細を表示するには、view
を ENCRYPTION
または FULL
に設定します。レスポンスには、使用中の鍵バージョンと、Bigtable から見たステータスが含まれます。
gcloud alpha bigtable instances tables describe TABLE_ID \
--instance INSTANCE_ID --view ENCRYPTION \
--project CBT_PROJECT
次のフィールドを入力します。
TABLE_ID
: クラスタの永続的な識別子INSTANCE_ID
: バックアップを含むインスタンスの永続的な識別子CBT_PROJECT
: Bigtable リソースが含まれるプロジェクト
コマンドによって次のような出力が表示されます。
clusterStates:
my-cluster:
encryptionInfo:
- encryptionStatus: {}
encryptionType: CUSTOMER_MANAGED_ENCRYPTION
kmsKeyVersion: KMS_KEY_NAME/cryptoKeyVersions/4
my-other-cluster:
encryptionInfo:
- encryptionStatus: {}
encryptionType: CUSTOMER_MANAGED_ENCRYPTION
kmsKeyVersion: KMS_KEY_NAME/cryptoKeyVersions/4
name: projects/cloud-bigtable-project/instances/cmek-test-instance/tables/my-table
バックアップの暗号化の詳細を表示する
バックアップは元の鍵バージョンに固定されたままです。Cloud KMS の鍵バージョンのローテーションでは、バックアップの復号に使用するバージョンをローテーションしません。
Console
Google Cloud コンソールの Bigtable インスタンス ページに移動します。
インスタンス名をクリックして、[インスタンスの詳細] ページを開きます。
左側のナビゲーション パネルで [バックアップ] をクリックします。
各バックアップの鍵の名前とバージョンは [顧客管理の暗号鍵] の下に表示されます。
gcloud
次のコマンドを実行して、バックアップの暗号化情報を表示します。
gcloud alpha bigtable backups describe BACKUP_ID \
--instance INSTANCE_ID --cluster CLUSTER_ID \
--project CBT_PROJECT
次のフィールドを入力します。
BACKUP_ID
: バックアップに割り当てられた IDCLUSTER_ID
: クラスタの永続的な識別子INSTANCE_ID
: バックアップを含むインスタンスの永続的な識別子CBT_PROJECT
: Bigtable リソースが含まれるプロジェクト
次のような出力が返されます。kmsKeyVersion
は、バックアップが固定されている CMEK 鍵のバージョンです。鍵バージョンのステータスは報告されません。
encryptionInfo:
encryptionStatus:
code: 2
message: Status of the associated key version is not tracked.
encryptionType: CUSTOMER_MANAGED_ENCRYPTION
kmsKeyVersion: KMS_KEY_NAME/cryptoKeyVersions/3
endTime: '2020-09-01T00:03:26.568600Z'
expireTime: '2020-09-02T00:03:25.436473Z'
name: projects/cloud-bigtable-project/instances/cmek-test-instance/clusters/my-cluster/backups/my-backup
sizeBytes: '3780'