顧客管理の暗号鍵(CMEK)を使用する

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

すべての鍵管理タスクに Google Cloud Console を使用することをおすすめします。Google Cloud CLI を使用する場合は、Bigtable 向けの gcloud CLI をインストールします。

CMEK 鍵を準備する

CMEK で保護された Bigtable リソースを作成する前に、次の手順を行い、インスタンスのクラスタが存在する各リージョンに CMEK 鍵を作成する必要があります。

  1. Bigtable サービス エージェントを作成(または取得)する
  2. CMEK 鍵を作成する
  3. その鍵の IAM 設定を構成する

Bigtable サービス エージェントを作成する

CMEK 鍵を作成する前に、Bigtable サービス エージェントが必要です。このアカウントは、Bigtable が鍵へのアクセスに使用する Google マネージド サービス アカウントの一種です。

コンソール

Google Cloud コンソールでサービス エージェントを作成することはできません。ただし、Google Cloud コンソールで鍵を作成すると、Cloud KMS 暗号化 / 復号のロールを付与するように求められます。サービス エージェントが存在しない場合は、その時点で作成されます。

gcloud

  1. 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 で利用できる外部管理鍵を使用できます。

  1. 鍵を管理する Google Cloud プロジェクトで、次の操作を行います。

    1. Cloud KMS API を有効化します。

    2. 次のいずれかのオプションを使用してキーリングと鍵を作成します。

      Cloud KMS の鍵のロケーションは、使用する Bigtable クラスタと同じにする必要があります。たとえば、us-central1(アイオワ)でキーリングを作成した場合、us-central1-aus-central1-bus-central1-c のクラスタはそのキーリングの鍵で保護できます。

鍵の IAM 設定を構成する

コンソール

Cloud KMS のロールをサービス エージェントに付与するには、次の手順を行います。詳細レベルでの設定が必要な場合は、鍵レベルまたは鍵リングレベルで権限を付与することもできます。

  1. Google Cloud コンソールの [IAM] ページに移動します。

    [IAM] ページに移動

  2. [追加] をクリックします。

  3. Bigtable サービス エージェントのメール ID を入力します。

  4. [Cloud KMS 暗号鍵の暗号化 / 復号] ロールを選択します。

  5. [保存] をクリックします。

gcloud

  1. サービス エージェントに 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: アクセス権を付与するサービス エージェントのメール形式の ID
    • KMS_PROJECT: 鍵が含まれるプロジェクト

CMEK 対応インスタンスを作成する

CMEK 鍵の作成と構成が完了したら、CMEK で保護されたインスタンスを作成できます。Google のデフォルトの暗号化によって保護されている既存の Bigtable インスタンスは、CMEK を使用するように変換できません。暗号化の種類と鍵は、作成時にのみ選択できます。

インスタンスを作成するの手順に沿って、CMEK で保護されたインスタンスを作成します。

使用中の鍵を表示する

鍵バージョンに関する情報は、encryption_info フィールドから取得します。

テーブルの CMEK 鍵バージョンの情報を表示するには、次の手順を行います。

コンソール

  1. Google Cloud コンソールの Bigtable インスタンス ページに移動します。

    インスタンスのリストを開く

  2. テーブルを含むインスタンスの名前をクリックして、[インスタンスの詳細] ページを開き、インスタンス内にあるクラスタのリストを表示します。

  3. クラスタ 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 つまたは複数のクラスタの鍵のみを無効にするのではなく、インスタンスのすべての鍵を無効にします。

コンソール

これはおすすめの方法です。Google Cloud コンソールを使用すると、鍵のすべてのバージョンを一度に無効にできます。

鍵バージョンごとに行う場合は、こちらの手順を行ってください。

gcloud

Google Cloud コンソールで鍵を無効にすることをおすすめします。Google Cloud CLI を使用する場合は、次のコマンドを実行します。

  1. 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
    
  2. すべてのバージョンを無効にします。

    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 時間かかる場合があります。

  3. (省略可)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
    
  4. (省略可)インスタンスのクラスタが無効であることを確認するには、次のコマンドを実行します。

    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 日間使用できます。

コンソール

これはおすすめの方法です。Google Cloud コンソールを使用すると、鍵のすべてのバージョンを一度に有効にできます。

鍵バージョンごとに行う場合は、こちらの手順を行ってください。

gcloud

Google Cloud コンソールで鍵を有効にすることをおすすめします。Google Cloud CLI を使用する場合は、次のコマンドを実行します。

  1. バージョンの一覧を表示して、鍵のすべてのバージョンを確認します。

    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 コンソールで設定と操作ができます。

  1. プロジェクト内の Cloud KMS API でロギングが有効になっていることを確認します。

  2. Google Cloud コンソールで Cloud Logging に移動します。

    Cloud Logging に移動

  3. クエリビルダーに次の行を追加して、ログエントリを 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

鍵の使用状況の情報を表示するには、鍵の使用状況の情報を表示するをご覧ください。

テーブルの暗号化ステータスを表示する

コンソール

Google Cloud コンソールでテーブルの暗号化ステータスを表示することはできません。

gcloud

テーブルに CMEK の詳細を表示するには、viewENCRYPTION または 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 の鍵バージョンのローテーションでは、バックアップの復号に使用するバージョンをローテーションしません。

コンソール

  1. Google Cloud コンソールの Bigtable インスタンス ページに移動します。

    インスタンスのリストを開く

  2. インスタンス名をクリックして、[インスタンスの詳細] ページを開きます。

  3. 左側のナビゲーション パネルで [バックアップ] をクリックします。

各バックアップの鍵の名前とバージョンは [顧客管理の暗号鍵] の下に表示されます。

gcloud

次のコマンドを実行して、バックアップの暗号化情報を表示します。

    gcloud alpha bigtable backups describe BACKUP_ID \
        --instance INSTANCE_ID --cluster CLUSTER_ID \
        --project CBT_PROJECT

次のフィールドを入力します。

  • BACKUP_ID: バックアップに割り当てられた ID
  • CLUSTER_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'

次のステップ