このガイドでは、Dataform で CMEK を使用する方法と、Dataform リポジトリの CMEK 暗号化を有効にする方法について説明します。
デフォルトでは、Dataform はお客様のコンテンツを 保存時に暗号化します。Bigtable では、ユーザーが追加で操作を行わなくても、暗号化が行われます。このオプションは、Google のデフォルトの暗号化と呼ばれます。
暗号鍵を管理する場合は、Cloud KMS の顧客管理の暗号鍵 (CMEK)を、Cloud KMS などの CMEK 統合サービスで使用できます。Cloud KMS 鍵を使用すると、保護 レベル、ロケーション、ローテーション スケジュール、使用とアクセスの権限、暗号境界を制御できます。 Cloud KMS を使用すると、鍵の使用状況を追跡すること、監査ログを表示すること、鍵のライフサイクルを管理することが可能です。 データを保護する対称鍵暗号鍵(KEK)は Google が所有して管理するのではなく、ユーザーが Cloud KMS でこれらの鍵を制御および 管理します。
CMEK を使用してリソースを設定した後は、 Dataform リソースへのアクセスは、Google のデフォルトの暗号化を使用する場合と同様です。 暗号化オプションの詳細については、顧客管理の暗号鍵(CMEK)をご覧ください。
リポジトリ データの CMEK 暗号化
CMEK 暗号化を Dataform リポジトリに適用すると、そのリポジトリ内の Dataform が管理するすべての顧客データが、リポジトリに設定された CMEK 保護キーを使用して保存時に暗号化されます。このデータには次のものが含まれます。
- Dataform リポジトリとそのワークスペースの Git リポジトリの内容
- コンパイルされた SQL クエリとコンパイル エラー
- ワークフロー アクションの保存済み SQL クエリ
- 実行されたワークフロー アクションのエラーの詳細
Dataform は、次のシナリオで CMEK 保護キーを使用します。
- 保存されている顧客データの復号が必要なすべてのオペレーション時。このようなオペレーションとしては次のものがありますが、これに限定されるものではありません。
- ユーザー クエリへの応答(
compilationResults.queryなど)。 - 以前に作成した 暗号化されたリポジトリ データを必要とする Dataform リソースの作成(例: ワークフロー呼び出し)。
- リモート リポジトリを更新する Git オペレーション(Git コミットの push など)。
- ユーザー クエリへの応答(
- 顧客データを保存する必要のあるすべてのオペレーション時。このようなオペレーションとしては次のものがありますが、これに限定されるものではありません。
- ユーザー クエリへの応答(
compilationResults.createなど)。 - ワークスペースに対する Git オペレーション(Git コミットの pull など)。
- ユーザー クエリへの応答(
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 保護キーを変更することはできません。
- プロジェクトにデフォルトの Dataform CMEK 鍵を設定したら、 Google Cloud プロジェクトのロケーションに作成されるすべての新しいリポジトリを Google Cloud CMEK で暗号化する必要があります。 プロジェクトの Google Cloud ロケーションに新しいリポジトリを作成する場合は、デフォルトの Dataform CMEK 鍵または別の CMEK 鍵を適用できますが、 デフォルトの保存データの暗号化を適用することはできません。
- デフォルトの Dataform CMEK 鍵の値を変更すると、変更前の値は既存のリポジトリに適用され、更新された値は変更後に作成されたリポジトリに適用されます。
- プロジェクト リポジトリの ロケーションごとに設定できるデフォルトの Dataform CMEK 鍵は 1 つだけです。 Google Cloud
- 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 を呼び出して、暗号化されたリポジトリ データに対するオペレーション中に鍵が引き続き有効であることを確認します。
Dataform が Cloud KMS 鍵が無効または破棄されたことを検出すると、対応するリポジトリに保存されているすべてのデータにアクセスできなくなります。
Dataform による Cloud KMS に対する呼び出しで、以前に無効にした鍵の再有効化が検出されると、Dataform は自動的にアクセスを復元します。
Cloud EKM で外部鍵を使用する
Cloud KMS に存在する鍵を使用する代わりに、 サポートされている外部の鍵管理パートナーに存在する 鍵を使用できます。 これを行うには、Cloud External Key Manager(Cloud EKM)を使用して、 の外部にある鍵へのポインタである外部鍵を作成して管理します。 Google Cloud詳細については、Cloud External Key Manager をご覧ください。
Cloud EKM で外部鍵を作成したら、リポジトリの作成時にその鍵の ID を指定して、新しい Dataform リポジトリに適用できます。この手順は、新しいリポジトリに Cloud KMS 鍵を適用する場合と同じです。
Dataform のデフォルトの CMEK 鍵を使用する
同じ CMEK 鍵で複数の Dataform リポジトリを暗号化するには、 プロジェクトにデフォルトの Dataform CMEK 鍵を設定します。 Google Cloud デフォルトの Dataform CMEK 鍵には、 Google Cloud プロジェクトのロケーションを指定する必要があります。プロジェクトごとに設定できるデフォルトの CMEK 鍵は 1 つだけです。 Google Cloud
デフォルトの Dataform CMEK 鍵を設定すると、Dataform は、 プロジェクトのロケーションに作成された新しいすべての リポジトリにデフォルトで鍵を適用します。 Google Cloud リポジトリを 作成するときに、 デフォルトの鍵を使用するか、別の CMEK 鍵を選択できます。
Google Cloud使用できない鍵のステータスの処理方法
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 を別のプロジェクトで実行するか、同じプロジェクトで実行するかを決定します。 権限をより細かく制御するには、別のプロジェクトを使用することをおすすめします。 プロジェクト ID とプロジェクト番号については、 プロジェクト名、番号、ID を確認するをご覧ください。 Google Cloud
Cloud KMS を実行する Google Cloud プロジェクトでは、次の操作を行います。
- Cloud Key Management Service API を有効にします。
- キーリングと鍵の作成の説明に沿って、キーリングと鍵を作成します。キーリングは、Dataform リポジトリのロケーションと一致するロケーションに作成します。
-
リポジトリでは、一致するリージョンの鍵を使用する必要があります。たとえば、リージョン
asia-northeast3のリポジトリは、asia-northeast3にあるキーリングの鍵で保護する必要があります。 -
globalリージョンは Dataform では使用できません。
-
リポジトリでは、一致するリージョンの鍵を使用する必要があります。たとえば、リージョン
CMEK を有効にする
Cloud KMS 暗号鍵の暗号化/復号(roles/cloudkms.cryptoKeyEncrypterDecrypter)ロールをデフォルトの
Dataform サービス エージェントに付与すると、Dataform がユーザーに代わって鍵にアクセスできます。
デフォルトの Dataform サービス エージェント ID の形式は次のとおりです。
service-YOUR_PROJECT_NUMBER@gcp-sa-dataform.iam.gserviceaccount.com
CryptoKey の暗号化/復号のロールをデフォルトの Dataform サービス エージェントに付与する手順は次のとおりです。
コンソール
[Key Management] ページを Google Cloud コンソールで開きます。
鍵を含むキーリングの名前をクリックします。
ロールを追加する暗号鍵のチェックボックスをクリックします。[権限] タブが開きます。
[メンバーを追加] をクリックします。
サービス エージェントのメールアドレスを入力します。
- このサービス エージェントがすでにメンバーリストに含まれている場合、サービス エージェントには既存のロールがあります。サービス エージェントの現在のロールのプルダウン リストをクリックします。
[ロールを選択] プルダウン リストをクリックし、[Cloud KMS] をクリックして、 次に [Cloud KMS 暗号鍵の暗号化/復号] ロールをクリックします。
[保存] をクリックして、サービス アカウントにロールを適用します。
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 プロジェクトの IDSERVICE_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 鍵が適用されていない既存のリポジトリは引き続き存在し、問題なくアクセスできます。
コンソール
Google Cloud コンソールで、[組織のポリシー] ページに移動します。
[フィルタ] を使用して、次の制約を検索します。
constraints/gcp.restrictNonCmekServices[名前] 列で、[CMEK を使用せずにリソースを作成できるサービスを制限する] をクリックします。
[**ポリシーを管理**] をクリックします。
[ポリシーの編集] ページの [ポリシーのソース] で、 [親のポリシーをオーバーライドする] を選択します。
[ルール] で [ルールを追加] をクリックします。
[ポリシーの値] リストで、[カスタム] を選択します。
[ポリシータイプ] リストで、[拒否] を選択します。
[カスタム値] フィールドに次のように入力します。
is:dataform.googleapis.com[**完了**] をクリックし、[**ポリシーを設定**] をクリックします。
gcloud
ポリシーを保存する一時ファイル
/tmp/policy.yamlを作成します。name: projects/PROJECT_ID/policies/gcp.restrictNonCmekServices spec: rules: - values: deniedValues: - is:dataform.googleapis.com
PROJECT_IDは、この制約を適用するプロジェクトの ID に置き換えます。org-policies set-policyコマンドを実行します。gcloud org-policies set-policy /tmp/policy.yaml
ポリシーが正常に適用されていることを確認するために、プロジェクトに Dataform リポジトリを作成してみることができます。Cloud KMS 鍵を指定しない限り、プロセスは失敗します。
Dataform プロジェクトの Cloud KMS 鍵を制限する
constraints/gcp.restrictCmekCryptoKeyProjects 制約を使用すると、Dataform プロジェクトでリポジトリの保護に使用できる Cloud KMS 鍵を制限できます。
たとえば、「projects/my-company-data-project 内のすべての Dataform リポジトリに対して、このプロジェクトで使用される Cloud KMS 鍵は projects/my-company-central-keys または projects/team-specific-keys からのものでなければならない」というルールを指定できます。
コンソール
Google Cloud コンソールで、[組織のポリシー] ページに移動します。
[フィルタ] を使用して、次の制約を検索します。
constraints/gcp.restrictCmekCryptoKeyProjects[名前] 列で、[CMEK 用の KMS CryptoKey を提供するプロジェクトを制限する] をクリックします。
[**ポリシーを管理**] をクリックします。
[ポリシーの編集] ページの [ポリシーのソース] で、 [親のポリシーをオーバーライドする] を選択します。
[ルール] で [ルールを追加] をクリックします。
[ポリシーの値] リストで、[カスタム] を選択します。
[ポリシータイプ] リストで、[許可] を選択します。
[カスタム値] フィールドに次のように入力します。
under:projects/KMS_PROJECT_IDKMS_PROJECT_IDは、使用する Cloud KMS 鍵が配置されているプロジェクトの ID に置き換えます。例:
under:projects/my-kms-project[**完了**] をクリックし、[**ポリシーを設定**] をクリックします。
gcloud
ポリシーを保存する一時ファイル
/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。
org-policies set-policyコマンドを実行します。gcloud org-policies set-policy /tmp/policy.yaml
ポリシーが正常に適用されていることを確認するには、別のプロジェクトの Cloud KMS 鍵を使用して Dataform リポジトリを作成してみることができます。このプロセスは失敗します。
デフォルトの Dataform CMEK 鍵を設定する
プロジェクトにデフォルトの Dataform CMEK 鍵を設定すると、同じ CMEK 鍵で複数のリポジトリ を暗号化できます。 Google Cloud 詳細については、 Dataform リポジトリにデフォルトの鍵を使用するをご覧ください。
Google Cloudデフォルトの 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 鍵を削除する
プロジェクトからデフォルトの Dataform CMEK 鍵を削除するには、次のリクエストで Dataform API を呼び出します。 Google Cloud
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 鍵が設定されているかどうかを確認するには、次のリクエストで Dataform API を呼び出します。 Google Cloud
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 保護を適用できます。
Dataform リポジトリに CMEK 暗号化を適用するには、リポジトリの作成時にデフォルトの Dataform CMEK 鍵で暗号化するか、一意の Cloud KMS 鍵を指定します。 手順については、リポジトリを作成するをご覧ください。
リポジトリの作成後に、Dataform リポジトリの暗号化メカニズムを変更することはできません。
詳細については、制限事項をご覧ください。
次のステップ
- CMEK の詳細については、CMEK の概要をご覧ください。
- Cloud KMS の割り当ての詳細については、Cloud KMS の割り当てをご覧ください。
- Cloud KMS の料金の詳細については、Cloud KMS の料金をご覧ください。
- Dataform リポジトリの詳細については、リポジトリを作成するをご覧ください。