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

このガイドでは、Dataform での CMEK の使用について説明し、Dataform リポジトリの CMEK 暗号化を有効にする方法について説明します。

デフォルトでは、Dataform はお客様のコンテンツを保存時に暗号化します。Dataform では、ユーザーが追加で操作を行わなくても、暗号化が行われます。このオプションは、Google のデフォルトの暗号化と呼ばれます。

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

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

リポジトリ データの CMEK 暗号化

CMEK 暗号化を Dataform リポジトリに適用すると、そのリポジトリ内の Dataform が管理するすべての顧客データが、リポジトリに設定された CMEK 保護キーを使用して保存時に暗号化されます。このデータには次のものが含まれます。

  • Dataform リポジトリとそのワークスペースの Git リポジトリ コンテンツ
  • コンパイルされた SQL クエリとコンパイル エラー
  • ワークフロー アクションの SQL クエリを保存する
  • 実行されたワークフロー アクションのエラーの詳細

Dataform は、次のシナリオで CMEK 保護キーを使用します。

  • 保存されている顧客データの復号化が必要なすべてのオペレーション時。このようなオペレーションとしては次のものがありますが、これに限定されるものではありません。
  • 顧客データを保存する必要のあるすべてのオペレーション時。このようなオペレーションとしては次のものがありますが、これに限定されるものではありません。

Dataform は、Dataform リソースにのみ関連付けられた顧客データの暗号化を管理します。Dataform では、Dataform ワークフローの実行によって BigQuery で作成された顧客データの暗号化が管理されることはありません。BigQuery で作成および保存されたデータを暗号化するには、BigQuery 用に CMEK を構成します。

サポートされているキー

Dataform は、次のタイプの CMEK 鍵をサポートしています。

鍵の可用性は、鍵の種類とリージョンによって異なります。CMEK 鍵の地理的な可用性の詳細については、Cloud KMS のロケーションをご覧ください。

制限事項

Dataform は、次の制限付きで CMEK をサポートしています。

  • CMEK で暗号化されたリポジトリの最大サイズは 512 MB です。
  • CMEK で暗号化されたリポジトリのワークスペースの最大サイズは 512 MB です。
  • リポジトリの作成後に CMEK 保護キーをリポジトリに適用することはできません。CMEK 暗号化は、リポジトリの作成時にのみ適用できます。
  • リポジトリから CMEK 保護鍵を削除することはできません。
  • リポジトリの CMEK 保護鍵を変更することはできません。
  • Google Cloud プロジェクトにデフォルトの Dataform CMEK 鍵を設定したら、 Google Cloud プロジェクトのロケーションに作成されるすべての新しいリポジトリを CMEK で暗号化する必要があります。 Google Cloud プロジェクトのロケーションに新しいリポジトリを作成する場合は、デフォルトの Dataform CMEK 鍵または別の CMEK 鍵を適用できますが、デフォルトの保存データの暗号化を適用することはできません。
  • デフォルトの Dataform CMEK 鍵の値を変更すると、既存のリポジトリには以前の値が適用され、変更後に作成されたリポジトリには更新された値が適用されます。
  • Google Cloud プロジェクト リポジトリのロケーションごとに設定できるデフォルトの Dataform CMEK 鍵は 1 つだけです。
  • CMEK の組織のポリシーは使用できません。
  • Cloud HSM 鍵と Cloud EKM 鍵の使用は、可用性の影響を受けます。ロケーション間の鍵の可用性の詳細については、Cloud KMS のロケーションをご覧ください。

Cloud KMS の割り当てと Dataform

Dataform では、Cloud HSM 鍵と Cloud EKM 鍵を使用できます。Dataform で CMEK を使用する場合は、プロジェクトで Cloud KMS 暗号リクエストの割り当てを消費できます。たとえば、CMEK で暗号化された Dataform リポジトリでは、リポジトリのコンテンツが変更されるたびに、これらの割り当てを消費できます。 CMEK 鍵を使用する暗号化と復号の処理は、ハードウェア(Cloud HSM)鍵または外部(Cloud EKM)鍵を使用する場合にのみ、Cloud KMS の割り当てに影響します。 詳細については、Cloud KMS の割り当てをご覧ください。

鍵を管理する

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

リポジトリの作成後、Dataform は Cloud KMS を呼び出して、暗号化されたリポジトリ データに対する各オペレーションで鍵が引き続き有効であることを確認します。

Cloud KMS 鍵が無効化または破棄されたことを Dataform が検出すると、対応するリポジトリに保存されているすべてのデータにアクセスできなくなります。

Dataform による Cloud KMS に対する呼び出しで、以前に無効にした鍵の再有効化が検出されると、Dataform は自動的にアクセスを復元します。

Cloud EKM で外部鍵を使用する

Cloud KMS に存在する鍵を使用する代わりに、サポートされている外部の鍵管理パートナーに存在する鍵を使用できます。これを行うには、Cloud External Key Manager(Cloud EKM)を使用して、 Google Cloudの外部にある鍵へのポインタである外部鍵を作成して管理します。詳細については、Cloud External Key Manager をご覧ください。

Cloud EKM で外部鍵を作成したら、新しい Dataform リポジトリに適用できます。リポジトリを作成する際にその鍵の ID を指定します。この手順は、新しいリポジトリに Cloud KMS 鍵を適用する場合と同じです。

Dataform のデフォルトの CMEK 鍵を使用する

同じ CMEK 鍵で複数の Dataform リポジトリを暗号化するには、 Google Cloud プロジェクトにデフォルトの Dataform CMEK 鍵を設定します。デフォルトの Dataform CMEK 鍵の Google Cloud プロジェクトのロケーションを指定する必要があります。 Google Cloud プロジェクトごとに設定できるデフォルトの CMEK 鍵は 1 つだけです。

デフォルトの Dataform CMEK 鍵を設定すると、Dataform はデフォルトで、 Google Cloud プロジェクトのロケーションに作成されたすべての新しいリポジトリに鍵を適用します。リポジトリを作成するときに、デフォルトの鍵を使用するか、別の CMEK 鍵を選択できます。

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

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

Dataform が Cloud KMS と通信不能となった時点で無効な鍵により Dataform リポジトリが保護されている場合、暗号化されたリポジトリ データにアクセスできなくなります。

暗号化されたリポジトリ データは、Dataform が Cloud KMS に再接続でき、鍵がアクティブであるという応答を Cloud KMS が返すまで、アクセス不能になります。

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

ロギング

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

始める前に

  • Dataform と Cloud KMS を別のプロジェクトで実行するか、同じプロジェクトで実行するかを決定します。権限をより詳細に制御するには、別々のプロジェクトを使用することをおすすめします。 Google Cloud プロジェクト ID とプロジェクト番号については、プロジェクトの識別をご覧ください。

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

    1. Cloud Key Management Service API を有効にします
    2. キーリングと鍵の作成の説明に沿って、キーリングと鍵を作成します。キーリングは、Dataform リポジトリのロケーションと一致するロケーションに作成します。
      • リポジトリでは、一致するリージョンの鍵を使用する必要があります。たとえば、リージョン asia-northeast3 のリポジトリは、asia-northeast3 にあるキーリングの鍵で保護する必要があります。
      • global リージョンは Dataform では使用できません。
      Dataform と Cloud KMS がサポートされるロケーションの詳細については、Cloud のロケーションをご覧ください。

CMEK を有効にする

Cloud KMS 暗号鍵の暗号化/復号(roles/cloudkms.cryptoKeyEncrypterDecrypterロールをデフォルトの Dataform サービス エージェントに付与すると、Dataform がユーザーに代わって鍵にアクセスできます。

デフォルトの Dataform サービス エージェント ID の形式は次のとおりです。

service-YOUR_PROJECT_NUMBER@gcp-sa-dataform.iam.gserviceaccount.com

デフォルトの Dataform サービス エージェントに CryptoKey の暗号化/復号ロールを付与する手順は次のとおりです。

コンソール

  1. Google Cloud コンソールで [鍵管理] ページを開きます。

    [鍵管理] ページを開く

  2. 鍵を含むキーリングの名前をクリックします。

  3. ロールを追加する暗号鍵のチェックボックスをクリックします。[権限] タブが開きます。

  4. [メンバーを追加] をクリックします。

  5. サービス エージェントのメールアドレスを入力します。

    • サービス エージェントがすでにメンバーリストに含まれている場合、サービス エージェントには既存のロールがあります。サービス エージェントの現在のロールのプルダウン リストをクリックします。
  6. [ロールを選択] プルダウン リストをクリックし、[Cloud KMS] をクリックして、[Cloud KMS 暗号鍵の暗号化 / 復号] ロールをクリックします。

  7. [保存] をクリックして、サービス アカウントにロールを適用します。

gcloud

ロールの割り当てには、Google Cloud CLI を使用できます。

gcloud kms keys add-iam-policy-binding \
    --project=KMS_PROJECT_ID \
    --member serviceAccount:SERVICE_AGENT \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
    --location=KMS_KEY_LOCATION \
    --keyring=KMS_KEY_RING \
    KMS_KEY

次のように置き換えます。

  • KMS_PROJECT_ID: Cloud KMS を実行している Google Cloudプロジェクトの ID
  • SERVICE_AGENT: デフォルトの Dataform サービス エージェントのメールアドレス
  • KMS_KEY_LOCATION: Cloud KMS 鍵のロケーション名
  • KMS_KEY_RING: Cloud KMS 鍵のキーリング名
  • KMS_KEY: Cloud KMS 鍵の名前。

CMEK の組織のポリシーの適用

Dataform は、組織全体で CMEK が使用されるように、2 つの組織のポリシー制約と統合されています。

  • constraints/gcp.restrictNonCmekServices は、CMEK 保護を要求するために使用されます。
  • constraints/gcp.restrictCmekCryptoKeyProjects は、CMEK の保護に使用される Cloud KMS 鍵を制限するために使用されます。

この統合により、組織内の Dataform リポジトリに対して次の暗号化コンプライアンス要件を指定できます。

組織のポリシーを適用する際の考慮事項

CMEK の組織ポリシーを適用する前に、次の点に注意してください。

伝播遅延に備える

組織のポリシーを設定または更新してから、新しいポリシーが有効になるまで最大 15 分かかることがあります。

既存のリソースを考慮する

既存のリソースは、新しく作成された組織のポリシーの対象になりません。たとえば、組織のポリシーは既存のリポジトリに遡及的に適用されません。これらのリソースには CMEK なしでアクセスでき、該当する場合は既存の鍵で暗号化されます。

組織のポリシーを設定するために必要な権限を確認する

組織のポリシーを、テスト目的で設定または更新する権限の取得は難しい場合があります。組織ポリシー管理者ロールが付与されている必要があります。このロールは、プロジェクト レベルやフォルダレベルではなく、組織レベルでのみ付与できます。

そのロールは組織レベルで付与する必要がありますが、特定のプロジェクトやフォルダにのみ適用されるポリシーを指定することもできます。

すべての新しい Dataform リポジトリで CMEK を必須にする

constraints/gcp.restrictNonCmekServices 制約を使用すると、組織内のすべての新しい Dataform リポジトリを保護するために CMEK を使用することを要求できます。

この組織のポリシーを設定すると、指定された Cloud KMS 鍵を持たないすべてのリソース作成リクエストは失敗します。

このポリシーを設定すると、それはプロジェクト内の新しいリポジトリにのみ適用されます。Cloud KMS 鍵が適用されていない既存のリポジトリは引き続き存在し、問題なくアクセスできます。

コンソール

  1. Google Cloud コンソールで、[組織のポリシー] ページに移動します。

    [組織のポリシー] に移動

  2. [フィルタ] を使用して、次の制約を検索します。

    constraints/gcp.restrictNonCmekServices
    
  3. [名前] 列で、[CMEK を使用せずにリソースを作成できるサービスを制限する] をクリックします。

  4. [ ポリシーを管理] をクリックします。

  5. [ポリシーの編集] ページの [ポリシーのソース] で、[親のポリシーをオーバーライドする] を選択します。

  6. [ルール] で [ルールを追加] をクリックします。

  7. [ポリシーの値] リストで、[カスタム] を選択します。

  8. [ポリシータイプ] リストで、[拒否] を選択します。

  9. [カスタム値] フィールドに次のように入力します。

    is:dataform.googleapis.com
    
  10. [完了]、[ポリシーを設定] の順にクリックします。

gcloud

  1. ポリシーを保存する一時ファイル /tmp/policy.yaml を作成します。

      name: projects/PROJECT_ID/policies/gcp.restrictNonCmekServices
      spec:
        rules:
        - values:
            deniedValues:
            - is:dataform.googleapis.com

    PROJECT_ID は、この制約を適用するプロジェクトの ID に置き換えます。

  2. org-policies set-policy コマンドを実行します。

    gcloud org-policies set-policy /tmp/policy.yaml

ポリシーが正常に適用されていることを確認するために、プロジェクトに Dataform リポジトリを作成してみることができます。Cloud KMS 鍵を指定しない限り、プロセスは失敗します。

Dataform プロジェクトの Cloud KMS 鍵を制限する

Dataform プロジェクトでは、constraints/gcp.restrictCmekCryptoKeyProjects 制約を使用して、リポジトリの保護に使用できる Cloud KMS 鍵を制限できます。

たとえば、「projects/my-company-data-project のすべての Dataform リポジトリに対して、このプロジェクトで使用される Cloud KMS 鍵は projects/my-company-central-keys または projects/team-specific-keys からのものでなければならない」というルールを指定できます。

コンソール

  1. Google Cloud コンソールで、[組織のポリシー] ページに移動します。

    [組織のポリシー] に移動

  2. [フィルタ] を使用して、次の制約を検索します。

    constraints/gcp.restrictCmekCryptoKeyProjects
    
  3. [名前] 列で、[CMEK 用の KMS CryptoKey を提供するプロジェクトを制限する] をクリックします。

  4. [ ポリシーを管理] をクリックします。

  5. [ポリシーの編集] ページの [ポリシーのソース] で、[親のポリシーをオーバーライドする] を選択します。

  6. [ルール] で [ルールを追加] をクリックします。

  7. [ポリシーの値] リストで、[カスタム] を選択します。

  8. [ポリシーの種類] リストで、[許可] を選択します。

  9. [カスタム値] フィールドに次のように入力します。

    under:projects/KMS_PROJECT_ID
    

    KMS_PROJECT_ID は、使用する Cloud KMS 鍵が配置されているプロジェクトの ID に置き換えます。

    例: under:projects/my-kms-project

  10. [完了]、[ポリシーを設定] の順にクリックします。

gcloud

  1. ポリシーを保存する一時ファイル /tmp/policy.yaml を作成します。

      name: projects/PROJECT_ID/policies/gcp.restrictCmekCryptoKeyProjects
      spec:
        rules:
        - values:
            allowedValues:
            - under:projects/KMS_PROJECT_ID

    次のように置き換えます

    • PROJECT_ID: この制約を適用するプロジェクトの ID。
    • KMS_PROJECT_ID: 使用する Cloud KMS 鍵が配置されているプロジェクトの ID。
  2. org-policies set-policy コマンドを実行します。

    gcloud org-policies set-policy /tmp/policy.yaml

ポリシーが正常に適用されていることを確認するには、別のプロジェクトの Cloud KMS 鍵を使用して Dataform リポジトリを作成してみることができます。このプロセスは失敗します。

デフォルトの Dataform CMEK 鍵を設定する

Google Cloud プロジェクトにデフォルトの Dataform CMEK 鍵を設定すると、同じ CMEK 鍵で複数のリポジトリを暗号化できます。詳細については、Dataform リポジトリにデフォルトの鍵を使用するをご覧ください。

デフォルトの CMEK 鍵を設定または編集するには、次のリクエストで Dataform API を呼び出します。

curl -X PATCH \
-H "Content-Type: application/json" \
-d '{"defaultKmsKeyName":"projects/PROJECT_ID/locations/PROJECT_LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KMS_KEY"}' \
https://dataform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/PROJECT_LOCATION/config

以下を置き換えます。

  • KMS_KEY_RING: Cloud KMS 鍵のキーリング名
  • KMS_KEY: Cloud KMS 鍵の名前。
  • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
  • PROJECT_LOCATION: Google Cloud プロジェクトのロケーション名。

デフォルトの Dataform CMEK 鍵を削除する

Google Cloud プロジェクトからデフォルトの Dataform CMEK 鍵を削除するには、次のリクエストで Dataform API を呼び出します。

curl -X PATCH \
-H "Content-Type: application/json" \
-d '{"defaultKmsKeyName":""}' \
https://dataform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/PROJECT_LOCATION/config

次のように置き換えます。

  • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
  • PROJECT_LOCATION: デフォルトの CMEK を設定解除する Google Cloud プロジェクトのロケーション名。

デフォルトの Dataform CMEK 鍵が設定されているかどうかを確認する

デフォルトの Dataform CMEK 鍵が Google Cloud プロジェクトに設定されているかどうかを確認するには、次のリクエストで Dataform API を呼び出します。

curl -X GET \
-H "Content-Type: application/json" \
https://dataform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/PROJECT_LOCATION/config

次のように置き換えます。

  • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
  • PROJECT_LOCATION: Google Cloud プロジェクトのロケーション名。

リポジトリに CMEK を適用する

リポジトリの作成時に、Dataform リポジトリに CMEK 保護を適用できます。

CMEK 暗号化を Dataform リポジトリに適用するには、リポジトリの作成時にデフォルトの Dataform CMEK 鍵で暗号化を選択するか、一意の Cloud KMS 鍵を指定します。手順については、リポジトリを作成するをご覧ください。

リポジトリの作成後に Dataform リポジトリの暗号化メカニズムを変更することはできません。

詳細については、制限事項をご覧ください。

次のステップ