このガイドでは、Dataform で CMEK を使用する方法と、Dataform リポジトリの CMEK 暗号化を有効にする方法について説明します。
デフォルトでは、Dataform はお客様のコンテンツを保存時に暗号化します。暗号化は Dataform が行うため、ユーザーが操作する必要はありません。このオプションは、Google のデフォルトの暗号化と呼ばれます。
暗号鍵を管理する場合は、Cloud KMS の顧客管理の暗号鍵(CMEK)を、Dataform などの 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 commit の 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 保護鍵は変更できません。
- 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 で外部鍵を作成したら、リポジトリの作成時にその鍵の ID を指定して、新しい Dataform リポジトリに適用できます。この手順は、新しいリポジトリに Cloud KMS 鍵を適用する場合と同じです。
Dataform のデフォルトの CMEK 鍵を使用する
複数の Dataform リポジトリを同じ CMEK 鍵で暗号化するには、Google Cloud プロジェクトにデフォルトの Dataform CMEK 鍵を設定します。デフォルトの Dataform CMEK 鍵の Google Cloud プロジェクトのロケーションを指定する必要があります。デフォルトの CMEK キーは、Google Cloud プロジェクトごとに 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_ACCOUNT \ --role roles/cloudkms.cryptoKeyEncrypterDecrypter \ --location=KMS_KEY_LOCATION \ --keyring=KMS_KEY_RING \ KMS_KEY
以下を置き換えます。
KMS_PROJECT_ID
: Cloud KMS を実行している Google Cloud プロジェクトの IDSERVICE_ACCOUNT
: デフォルトの Dataform サービス アカウントのメールアドレスKMS_KEY_LOCATION
: Cloud KMS 鍵のロケーション名KMS_KEY_RING
: Cloud KMS 鍵のキーリング名KMS_KEY
: Cloud KMS 鍵の名前。
デフォルトの 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 鍵が設定されているかどうかを確認する
Google Cloud プロジェクトにデフォルトの Dataform CMEK 鍵が設定されているかどうかを確認するには、次のリクエストで 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 を適用する
CMEK 保護は、リポジトリの作成時に Dataform リポジトリに適用できます。
Dataform リポジトリに CMEK 暗号化を適用するには、デフォルトの Dataform CMEK 鍵による暗号化を選択するか、リポジトリを作成するときに一意の Cloud KMS 鍵を指定します。手順については、リポジトリを作成するをご覧ください。
リポジトリの作成後に Dataform リポジトリの暗号化メカニズムを変更することはできません。
詳細については、制限事項をご覧ください。
次のステップ
- CMEK の詳細については、CMEK の概要をご覧ください。
- Cloud KMS の割り当ての詳細については、Cloud KMS の割り当てをご覧ください。
- Cloud KMS の料金の詳細については、Cloud KMS の料金をご覧ください。
- Dataform リポジトリの詳細については、リポジトリの概要をご覧ください。