Cloud Healthcare API データセットに対して顧客管理の暗号鍵(CMEK)を有効にする

Google Cloud のデフォルトでは、Google が管理する暗号鍵を使用して、保存されているデータを自動的に暗号化します。データを保護する鍵に関連する具体的なコンプライアンス要件や規制要件がある場合は、Cloud Healthcare API データセットに顧客管理の暗号鍵(CMEK)を使用できます。Cloud Healthcare API データセットは、データを保護する暗号鍵を Google が所有、管理する代わりに、Cloud Key Management Service(Cloud KMS)でお客様が制御、管理する鍵を使用して暗号化されます。

CMEK の一般的な用途や使用する理由などの詳細については、顧客管理の暗号鍵(CMEK)をご覧ください。

始める前に

Cloud Healthcare API データセットと Cloud KMS を同じ Google Cloud プロジェクトに配置するか、異なるプロジェクトに配置するかを決定します。詳細については、職掌分散をご覧ください。

文書化の目的で、次の表記方法を使用します。

  • PROJECT_ID: Cloud Healthcare API プロジェクト ID
  • KMS_PROJECT_ID: Cloud KMS が実行されるプロジェクト ID(PROJECT_ID と同じ場合があります)

Google Cloud プロジェクト ID とプロジェクト番号については、プロジェクトの識別をご覧ください。

制限事項

  • Cloud KMS 鍵は、Cloud Healthcare API データセットの作成時にのみ使用できます。既存の Cloud Healthcare API データセットでは、Cloud KMS 鍵を有効化、変更、無効化できません。
  • CMEK で暗号化されたデータセットでは、FHIR、DICOM、HL7v2 ストアのみがサポートされます。CMEK 保護は、データセットとそのリソース内の DICOM、FHIR、HL7v2 ストアに適用されます。
  • CMEK で暗号化されたリソースは匿名化できません。

CMEK の運用

Cloud KMS 鍵は、CMEK で暗号化されたリソースの作成、読み取り、更新、削除のほか、課金や鍵の可用性の確保などの運用タスクに使用されます。

外部の主な考慮事項

サポートされる外部鍵管理パートナー システム内で管理する鍵を使用して、Google Cloud 内のデータを保護する方法については、Cloud External Key Manager をご覧ください。

Google Cloud の外部で管理している鍵を紛失すると、Google はデータを復元できません。

鍵の使用不能とデータ損失

データセットが鍵で暗号化されていて、その鍵が使用できなくなり、そのまま使用不能になった場合、Cloud Healthcare API はデータセットを無効にし、最終的に削除します。鍵が無効化または破棄された場合や権限の取り消しによりアクセス不能になった場合は鍵が使用できなくなることがありますが、このような動作はなんらかの理由で鍵が使用できない場合に発生します。鍵の保護レベルや鍵が外部鍵であるかどうかは、この動作には影響しません。外部鍵は、予期せず使用できなくなることもあります。たとえば、Google Cloud リソースと EKM の間で接続の問題が発生する可能性があります。

次のプロセスでは、鍵の可用性の確認方法と、データセットの無効化や削除の方法について説明します。

  1. CMEK で暗号化された Cloud Healthcare API データセットが作成されると、Cloud Healthcare API によって、鍵が利用可能な状態であることを確認するために、5 分ごとに鍵のステータスがチェックされます。鍵が使用できない場合、Cloud Healthcare API は最大 1 時間、データセットに対するリクエストを引き続きサポートします。

  2. 1 時間経過しても Cloud Healthcare API が Cloud KMS に接続できない場合、保護対策として Cloud Healthcare API データセットは無効になります。Cloud Healthcare API データセットを再度有効にするには、サポート担当者にお問い合わせください。

    無効になった場合、Cloud Healthcare API データセットには datasets.get リクエストと datasets.delete リクエストのみを送信できます。他のリクエストは、400 FAILED_PRECONDITION エラーで失敗します。

  3. Cloud Healthcare API データセットが 30 日以上利用できない場合は、完全に削除されます。データセット内の DICOM、FHIR、HL7v2 ストアとそれらに関連するデータも削除されます。削除されたデータは復元できません。

鍵の作成

以降のセクションでは、Cloud KMS キーリングと鍵を作成する方法について説明します。Cloud KMS の対称暗号鍵のみがサポートされています。

サポートされているロケーション

Cloud KMS 鍵は Cloud Healthcare API のロケーションで使用できます。Cloud Healthcare API データセットのリージョンまたはマルチリージョンと一致するロケーションでキーリングを作成します。

  • マルチリージョンの Cloud Healthcare API データセットでは、一致するロケーションからのマルチリージョンのキーリングを使用する必要があります。たとえば、リージョン us 内の Cloud Healthcare API データセットはリージョン us のキーリングで保護する必要があり、リージョン eu 内の Cloud Healthcare API データセットはリージョン europe のキーリングで保護する必要があります。

  • リージョンの Cloud Healthcare API データセットでは、一致するリージョンの鍵を使用する必要があります。たとえば、リージョン asia-northeast1 の Cloud Healthcare API データセットはリージョン asia-northeast1 のキーリングで保護する必要があります。

  • Cloud Healthcare API データセットに CMEK を構成する場合、global リージョンは使用できません。

詳細については、Cloud Healthcare API のロケーションCloud KMS のロケーションをご覧ください。

キーリングと鍵を作成する

Cloud KMS を実行する Google Cloud プロジェクトで次の操作を行います。

  1. キーリングを作成します
  2. 鍵を作成する

暗号化と復号の権限を付与する

Cloud KMS 鍵を使用して Cloud Healthcare API データを保護するには、Cloud Healthcare サービス エージェントのサービス アカウント暗号鍵の暗号 / 復号ツール(roles/cloudkms.cryptoKeyEncrypterDecrypterのロールをそのキーに対して付与します。手順については、データセット CMEK の権限をご覧ください。

サービス アカウントにロールが付与されると、Cloud Healthcare API は CMEK で暗号化されたリソースの暗号化と復号ができるようになります。アプリケーションでは、データの読み取りと書き込み時にキーを指定する必要はありません。Cloud Healthcare API が暗号化を処理します。

リクエスト元が Cloud KMS 鍵で暗号化されたオブジェクトの読み取りまたは書き込みを行う場合、通常どおりオブジェクトにアクセスします。リクエストの処理中に、次の条件が両方とも満たされると、リクエストされたオブジェクトがサービス エージェントによって自動的に暗号化または復号されます。

  • サービス エージェントには引き続き必要な権限が与えられている。
  • 鍵が利用可能で、有効になっている。

CMEK で暗号化された Cloud Healthcare API データセットを作成する

次のサンプルは、CMEK で暗号化されたデータセットを作成する方法を示しています。

データセットの作成時に Cloud KMS 鍵のリソース ID を指定する必要があります。この鍵は次の形式で、大文字と小文字は区別されます。

projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME

Cloud KMS 鍵のリソース ID を表示するには、Cloud KMS リソース ID の取得をご覧ください。

Console

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

    [ブラウザ] に移動

  2. [データセットを作成] をクリックします。[データセットを作成] ページが表示されます。

  3. [名前] フィールドに、データセットで使用できる文字とサイズの要件に従って、データセットの ID を入力します。

  4. 次のいずれかのロケーション タイプを選択します。

    • Region を使用します。リージョン: データセットは、1 つの Google Cloud リージョン内に永続的に存在します。このオプションを選択したら、[リージョン] フィールドにロケーションを入力するか選択します。

    • マルチリージョンデータセットは、複数の Google Cloud リージョンにまたがるロケーションに永続的に存在します。このオプションを選択したら、[マルチリージョン] フィールドにマルチリージョン ロケーションを入力または選択します。

  5. [暗号化] セクションで、次のいずれかの暗号化タイプを選択します。

    • Google が管理する暗号鍵: デフォルトの暗号化方式。この方法は、この Cloud Healthcare API データセット内のデータを保護する暗号鍵を Google に管理させる場合に使用します。

    • Cloud KMS 鍵: 顧客管理の暗号鍵(CMEK)を使用します。

  6. [作成] をクリックします。[ブラウザ] ページが表示されます。新しいデータセットがデータセットのリストに表示されます。

gcloud

gcloud healthcare datasets create コマンドを使用してデータセットを作成します。

後述のコマンドデータを使用する前に、次のように置き換えます。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud healthcare datasets create DATASET_ID \
  --location=LOCATION \
  --encryption-key=KEY_RESOURCE_ID

Windows(PowerShell)

gcloud healthcare datasets create DATASET_ID `
  --location=LOCATION `
  --encryption-key=KEY_RESOURCE_ID

Windows(cmd.exe)

gcloud healthcare datasets create DATASET_ID ^
  --location=LOCATION ^
  --encryption-key=KEY_RESOURCE_ID

次のようなレスポンスが返されます。

Create request issued for: [DATASET_ID]
Waiting for operation [projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID] to complete...
Created dataset [DATASET_ID].

REST

  1. datasets.create メソッドを使用してデータセットを作成します。

    リクエストのデータを使用する前に、次のように置き換えます。

    リクエストの本文(JSON):

    {
      "encryptionSpec": {
        "kmsKeyName": "KEY_RESOURCE_ID"
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを選択します。

    curl

    リクエスト本文を request.json という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。

    cat > request.json << 'EOF'
    {
      "encryptionSpec": {
        "kmsKeyName": "KEY_RESOURCE_ID"
      }
    }
    EOF

    その後、次のコマンドを実行して REST リクエストを送信します。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets?datasetId=DATASET_ID"

    PowerShell

    リクエスト本文を request.json という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。

    @'
    {
      "encryptionSpec": {
        "kmsKeyName": "KEY_RESOURCE_ID"
      }
    }
    '@  | Out-File -FilePath request.json -Encoding utf8

    その後、次のコマンドを実行して REST リクエストを送信します。

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets?datasetId=DATASET_ID" | Select-Object -Expand Content

    API Explorer

    リクエスト本文をコピーして、メソッドのリファレンス ページを開きます。ページの右側に [API Explorer] パネルが開きます。このツールを操作してリクエストを送信できます。このツールにリクエスト本文を貼り付け、その他の必須フィールドに入力して、[Execute] をクリックします。

    次のとおり出力されます。レスポンスには、長時間実行オペレーション(LRO)の識別子が含まれます。長時間実行オペレーションは、メソッドの呼び出しが完了するまでに時間がかかる場合に返されます。OPERATION_IDの値をメモします。この値は次の手順で必要になります。

  2. projects.locations.datasets.operations.get メソッドを使用して、長時間実行オペレーションのステータスを取得します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクトの ID
    • LOCATION: データセットの場所
    • DATASET_ID: データセット ID
    • OPERATION_ID: 長時間実行オペレーションから返された ID。

    リクエストを送信するには、次のいずれかのオプションを選択します。

    curl

    次のコマンドを実行します。

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

    PowerShell

    次のコマンドを実行します。

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content

    API Explorer

    メソッド リファレンス ページを開きます。ページの右側に [API Explorer] パネルが開きます。このツールを操作してリクエストを送信できます。必須フィールドを入力して、[Execute] をクリックします。

    次のとおり出力されます。レスポンスに "done": true が含まれている場合、長時間実行オペレーションは終了しています。

データセットが Cloud KMS によって保護されているかどうかを確かめる

作成した鍵または Cloud Healthcare API データセットを保護するそれぞれの鍵の使用状況を追跡することで、その鍵が保護するリソースを確認できます。詳細については、鍵の使用状況を表示するをご覧ください。

鍵のローテーション

Cloud KMS は、新しいバージョンに対して自動と手動どちらの鍵のローテーションもサポートしています。

鍵をローテーションすると、次のようになります。

  • ローテーション後に作成された Cloud Healthcare API データセットは、暗号化とすべてのオペレーションに新しい鍵バージョンを使用します。
  • その鍵を使用して暗号化された既存のデータセット内のリソースは、新しい主キーのバージョンで自動的に再暗号化されません。

暗号化を機能させるには、すべての鍵バージョンが利用可能である必要があります。それ以外の場合、Cloud Healthcare API データセットは無効になり、データセットに対するすべてのリクエストは失敗します。詳細については、外部鍵に関する考慮事項無効化されたデータセットと永続データセットの削除をご覧ください。

Cloud KMS 鍵への Cloud Healthcare API へのアクセス権を削除する

Cloud Healthcare API が CMEK で暗号化されたデータにアクセスできないようにするため、お客様は鍵を制御し、鍵の無効化、破棄、取り消しを行えます。Cloud Healthcare API データセットに関連付けられている鍵または鍵バージョンを破棄すると、その鍵または鍵バージョンで暗号化されたすべてのデータが完全に失われます。

鍵または鍵バージョンを無効にしてから使用できなくなるまでしばらくかかります。また、鍵に対する Cloud Healthcare サービス エージェントのサービス アカウントの権限を取り消してからアクセスできなくなるまで、しばらくかかります。詳細については、Cloud KMS リソースの整合性をご覧ください。

CMEK 対応インスタンスへのデータのエクスポートとインポート

顧客管理の暗号鍵を使用して暗号化した状態でデータをエクスポートするために、エクスポートの開始前に、宛先に CMEK を設定する必要があります。CMEK で暗号化されたストレージからインポートする際に、CMEK で暗号化されたデータセットにデータをインポートするための特別な要件や制限はありません。

制限事項

料金

データセットは、CMEK で暗号化されているかどうかにかかわらず、同じように課金されます。詳細については、Cloud Healthcare API の料金をご覧ください。

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

Cloud KMS の割り当てと Cloud Healthcare API

Cloud Healthcare API で CMEK を使用する場合は、プロジェクトで Cloud KMS 暗号化リクエストの割り当てを消費できます。CMEK で暗号化された Cloud Healthcare API データセットと、それらの DICOM、FHIR、HL7v2 ストアは、datasets.get を除くすべてのオペレーションでこれらの割り当てを消費します。CMEK 鍵を使用する暗号化と復号の処理は、ハードウェア(Cloud HSM)鍵または外部(Cloud EKM)鍵を使用する場合にのみ、Cloud KMS の割り当てに影響します。詳細については、Cloud KMS の割り当てをご覧ください。

次のステップ