このガイドでは、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 保護キーを使用します。
- 保存されている顧客データの復号化が必要なすべてのオペレーション時。このようなオペレーションとしては次のものがありますが、これに限定されるものではありません。
- ユーザーのクエリに対する回答(例:
compilationResults.query
)。 - 以前に作成された暗号化されたリポジトリ データが必要な Dataform リソースの作成(ワークフロー呼び出しなど)。
- リモート リポジトリを更新する Git オペレーション(Git commit の push など)。
- ユーザーのクエリに対する回答(例:
- 顧客データを保存する必要のあるすべてのオペレーション時。このようなオペレーションとしては次のものがありますが、これに限定されるものではありません。
- ユーザーのクエリに対する回答(例:
compilationResults.create
)。 - ワークスペースに対する Git オペレーション(Git commit の 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 保護鍵を変更することはできません。
- 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 プロジェクトで、次の操作を行います。
- 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
デフォルトの Dataform サービス エージェントに CryptoKey の暗号化/復号ロールを付与する手順は次のとおりです。
コンソール
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 鍵を制限する
Dataform プロジェクトでは、constraints/gcp.restrictCmekCryptoKeyProjects
制約を使用して、リポジトリの保護に使用できる 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_ID
KMS_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 鍵を設定する
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 リポジトリの暗号化メカニズムを変更することはできません。
詳細については、制限事項をご覧ください。
次のステップ
- CMEK の詳細については、CMEK の概要をご覧ください。
- Cloud KMS の割り当ての詳細については、Cloud KMS の割り当てをご覧ください。
- Cloud KMS の料金の詳細については、Cloud KMS の料金をご覧ください。
- Dataform リポジトリの詳細については、リポジトリを作成するをご覧ください。