Cloud KMS 鍵によるデータの保護

BigQuery は、デフォルトでは、保存されている顧客コンテンツを暗号化します。BigQuery は、このデフォルトの暗号化をユーザーの代わりに処理および管理し、ユーザー側では追加のアクションは不要です。まず、BigQuery テーブルのデータは、データ暗号鍵を使用して暗号化されます。さらに、このデータ暗号鍵が鍵暗号鍵で暗号化されます。これはエンベロープ暗号化と呼ばれます。鍵暗号鍵ではデータは直接暗号化されませんが、データの暗号化に使用するデータ暗号鍵を暗号化するために使用されます。詳細については、鍵管理をご覧ください。

ユーザー自身で暗号化を制御する場合は、BigQuery の顧客管理の暗号鍵(CMEK)を使用できます。データを保護する鍵暗号鍵を Google が管理するのではなく、ユーザーが Cloud KMS で鍵暗号鍵を制御および管理します。このトピックでは、この手法について詳しく説明します。

Google Cloud Platform での暗号化オプションについては、こちらをご覧ください。

始める前に

  1. データセットテーブルクエリについて理解します。

  2. BigQuery と Cloud KMS を同じ GCP プロジェクトで実行するか、別々のプロジェクトで実行するかを決定します。以下の説明では次の表記方法を用います。

    • [PROJECT_ID] は BigQuery を実行するプロジェクトのプロジェクト ID です。
    • [PROJECT_NUMBER] は BigQuery を実行するプロジェクトのプロジェクト番号です。
    • [KMS_PROJECT_ID] は Cloud KMS を実行するプロジェクトのプロジェクト ID です(BigQuery を実行するプロジェクトと同じプロジェクトである可能性があります)。
    GCP プロジェクト ID とプロジェクト番号については、プロジェクトの識別をご覧ください。

  3. 新しいプロジェクトでは、BigQuery が自動的に有効になります。既存のプロジェクトを使用して BigQuery を実行する場合は、BigQuery API を有効化します。

  4. Cloud KMS を実行する GCP プロジェクトでは、以下の操作を行います。

    1. Cloud KMS API を有効化します。
    2. 鍵リングと鍵の作成の説明に従って、鍵リングと鍵を作成します。鍵リングは、BigQuery データセットのロケーションと一致するロケーションで作成します。
      • マルチリージョン データセットでは、一致するロケーションからのマルチリージョンの鍵リングを使用する必要があります。たとえば、リージョン US 内のデータセットはリージョン us の鍵リングで保護する必要があり、リージョン EU 内のデータセットはリージョン europe の鍵リングで保護する必要があります。
      • リージョン データセットでは、一致するリージョンの鍵を使用する必要があります。たとえば、リージョン asia-northeast1 内のデータセットはリージョン asia-northeast1 の鍵リングで保護する必要があります。
      • BigQuery では global リージョンの使用をサポートしていません。
      BigQuery と Cloud KMS がサポートされるロケーションの詳細については、Cloud のロケーションをご覧ください。

暗号化仕様

BigQuery でデータを保護するために使用される Cloud KMS 鍵は、AES-256 鍵です。これらの鍵は、BigQuery で鍵暗号鍵として使用され、データを暗号化するデータ暗号鍵を暗号化します。

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

Google Cloud Platform Console を使用して BigQuery サービス アカウント ID を特定し、サービス アカウントに、Cloud KMS を使用して暗号化および復号化する適切な役割を付与します。

サービス アカウント ID を特定する

ウェブ UI

  1. BigQuery ウェブ UI に移動します。

    BigQuery ウェブ UI に移動

  2. ナビゲーションのプロジェクト名の横にある下向き矢印アイコン 下矢印アイコン をクリックして、[Customer Managed Encryption] をクリックします。

  3. ユーザー ダイアログが開き、暗号化と復号の権限を必要とするサービス アカウントが表示されます。

    サービス アカウント ID

  4. [Copy] をクリックしてサービス アカウント ID をクリップボードにコピーしてから、[OK] をクリックしてユーザー ダイアログを閉じます。

コマンドライン

サービス アカウント ID を特定するには、--encryption_service_account フラグを指定して bq show コマンドを使用します。

bq show --encryption_service_account

このコマンドを実行すると、サービス アカウント ID が表示されます。

                       ServiceAccountID
     -------------------------------------------------------------
      bq-[PROJECT_NUMBER]@bigquery-encryption.iam.gserviceaccount.com

暗号化 / 復号の役割を割り当てる

クリップボードにコピーした BigQuery システムのサービス アカウントに Cloud KMS CryptoKey Encrypter/Decrypter役割を割り当てます。このアカウントの形式は次のとおりです。

bq-[PROJECT_NUMBER]@bigquery-encryption.iam.gserviceaccount.com

ウェブ UI

  1. GCP Console で [セキュリティ] ページを開きます。

    Security Cryptographic Keys ページを開きます

  2. プロジェクトを選択し、[続行] をクリックします。

  3. 役割を追加する暗号鍵を特定します。

    • bq-[PROJECT_NUMBER]@bigquery-encryption.iam.gserviceaccount.com サービス アカウントがまだメンバーリストに含まれていない場合、このサービス アカウントには役割が何も割り当てられていません。[メンバーの追加] をクリックし、サービス アカウントのメールアドレス bq-[PROJECT_NUMBER]@bigquery-encryption.iam.gserviceaccount.com を入力します。
    • このサービス アカウントがすでにメンバーリストに含まれている場合、サービス アカウントには既存の役割があります。bq-[PROJECT_NUMBER]@bigquery-encryption.iam.gserviceaccount.com サービス アカウントの現在の役割のプルダウン リストをクリックします。
  4. [役割] プルダウン リストをクリックし、[Cloud KMS] をクリックして、[クラウド KMS 暗号鍵の暗号化 / 復号化] 役割をクリックします。

  5. [追加] または [保存] をクリックして、この役割を bq-[PROJECT_NUMBER]@bigquery-encryption.iam.gserviceaccount.com サービス アカウントに適用します。

コマンドライン

役割を割り当てるには、gcloud コマンドライン ツールを使用できます。

gcloud kms keys add-iam-policy-binding \
--project=[KMS_PROJECT_ID] \
--member serviceAccount:bq-[PROJECT_NUMBER]@bigquery-encryption.iam.gserviceaccount.com \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--location=[KMS_KEY_LOCATION] \
--keyring=[KMS_KEY_RING] \
[KMS_KEY]

[KMS_PROJECT_ID] を Cloud KMS を実行している GCP プロジェクトの ID に置き換え、[PROJECT_NUMBER] を BigQuery を実行している GCP プロジェクトのプロジェクト番号(プロジェクト ID ではない)に置き換えます。また、[KMS_KEY_LOCATION][KMS_KEY_RING][KMS_KEY_RING][KMS_KEY] は Cloud KMS 鍵のロケーション、鍵リング、鍵名にそれぞれ置き換えます。

Cloud KMS で保護されるテーブルを作成する

Cloud KMS で保護される空のテーブルを作成する

Cloud KMS で保護されるテーブルを作成するには:

ウェブ UI

  1. BigQuery ウェブユーザー インターフェースでデータセット名の横にある下矢印アイコン 下矢印アイコン をクリックし、[Create new table] をクリックします。

  2. [テーブルの作成] ページで、スキーマなしの空のテーブルの作成、またはスキーマ定義のある空のテーブルの作成のいずれかに必要な情報を入力します。[Create Table] をクリックする前に、暗号化の種類を設定し、テーブルで使用する Cloud KMS 鍵を指定します。

    1. [Encryption Type] プルダウン リストをクリックし、[Customer-Managed Encryption] を選択します。
    2. [Customer-Managed Encryption Key] に鍵のリソース ID を入力します。この鍵の形式は次のとおりです。
      projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY]
      
      鍵のリソース ID を取得する方法については、鍵のリソース ID をご覧ください。
  3. [Create Table] をクリックします。

コマンドライン

テーブルの作成には、--destination_kms_key フラグを指定した bq コマンドライン ツールを使用できます。--destination_kms_key フラグで、テーブルで使用する鍵のリソース ID を指定します。この鍵の形式は次のとおりです。

projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY]
鍵のリソース ID を取得する方法については、「鍵のリソース ID」(/kms/docs/object-hierarchy#key_resource_id)をご覧ください。スキーマ定義のある空のテーブルを作成するには、次のコマンドを実行します。
bq mk --schema name:string,value:integer -t \
--destination_kms_key projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY] \
mydataset.newtable

また、DDL ステートメントを使用することもできます。

bq query --use_legacy_sql=false "
  CREATE TABLE mydataset.newtable (name STRING, value INT64)
  OPTIONS(
    kms_key_name='projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY]'
  )
"

クエリからテーブルを作成するには、次のコマンドを実行します。

bq query --destination_table=mydataset.newtable \
--destination_kms_key projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY] \
"SELECT name,count FROM mydataset.babynames WHERE gender = 'M' ORDER BY count DESC LIMIT 6"

bq コマンドライン ツールの詳細については、bq コマンドライン ツールをご覧ください。

Go

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
tableRef := client.Dataset(datasetID).Table(tableID)
meta := &bigquery.TableMetadata{
	EncryptionConfig: &bigquery.EncryptionConfig{
		// TODO: Replace this key with a key you have created in Cloud KMS.
		KMSKeyName: "projects/cloud-samples-tests/locations/us-central1/keyRings/test/cryptoKeys/test",
	},
}
if err := tableRef.Create(ctx, meta); err != nil {
	return err
}

Python

新しいテーブルを顧客管理の暗号鍵で保護するには、Table.encryption_configuration プロパティを EncryptionConfiguration オブジェクトに設定してからテーブルを作成します。

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_id = 'my_dataset'

table_ref = client.dataset(dataset_id).table('my_table')
table = bigquery.Table(table_ref)

# Set the encryption key to use for the table.
# TODO: Replace this key with a key you have created in Cloud KMS.
kms_key_name = 'projects/{}/locations/{}/keyRings/{}/cryptoKeys/{}'.format(
    'cloud-samples-tests', 'us-central1', 'test', 'test')
table.encryption_configuration = bigquery.EncryptionConfiguration(
    kms_key_name=kms_key_name)

table = client.create_table(table)  # API request

assert table.encryption_configuration.kms_key_name == kms_key_name

Cloud KMS 鍵で保護されたテーブルのクエリ

Cloud KMS で保護されたテーブルをクエリするために、特別な方法は必要ありません。テーブルのコンテンツの暗号化に使用された鍵の名前が BigQuery に保存され、Cloud KMS で保護されたテーブルに対してクエリが実行されるとその鍵が使用されます。

そのテーブルのコンテンツの暗号化に使用された Cloud KMS 鍵に BigQuery がアクセスできれば、既存のすべてのツール、BigQuery コンソール、bq コマンドライン インターフェースは、デフォルトの暗号化されたテーブルの場合と同様に実行されます。

Cloud KMS 鍵を使用したクエリ結果の保護

ウェブ UI

  1. BigQuery ウェブ UI で [COMPOSE QUERY] ボタンをクリックします。

  2. [New Query] テキスト領域に有効な BigQuery SQL クエリを入力します。

  3. [Encryption Type] をクリックし、[Customer-Managed Encryption] を選択します。

  4. [Customer-Managed Encryption Key] に鍵のリソース ID を入力します。この鍵の形式は次のとおりです。

    projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY]
    
    鍵のリソース ID を取得する方法については、鍵のリソース ID をご覧ください。

  5. [RunQuery] をクリックします。

コマンドライン

Cloud KMS 鍵を使用して宛先テーブルやクエリ結果(一時テーブルを使用している場合)を保護するには、--destination_kms_key フラグを指定します。--destination_kms_key フラグで、宛先または結果テーブルで使用する鍵のリソース ID を指定します。この鍵の形式は次のとおりです。

projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY]
鍵のリソース ID を取得する方法については、「鍵のリソース ID」(/kms/docs/object-hierarchy#key_resource_id)をご覧ください。必要に応じて、--destination_table フラグを使用して、クエリ結果の宛先を指定します。--destination_table の指定がない場合、クエリ結果は一時テーブルに書き込まれます。テーブルをクエリするには、次のコマンドを実行します。
bq query \
--destination_table=mydataset.newtable \
--destination_kms_key projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY] \
"SELECT name,count FROM mydataset.babynames WHERE gender = 'M' ORDER BY count DESC LIMIT 6"

bq コマンドライン ツールの詳細については、bq コマンドライン ツールをご覧ください。

Go

q := client.Query("SELECT 17 as my_col")
q.Location = "US" // Location must match the dataset(s) referenced in query.
q.QueryConfig.Dst = client.Dataset(destDatasetID).Table(destTableID)
q.DestinationEncryptionConfig = &bigquery.EncryptionConfig{
	// TODO: Replace this key with a key you have created in Cloud KMS.
	KMSKeyName: "projects/cloud-samples-tests/locations/us-central1/keyRings/test/cryptoKeys/test",
}
return runAndRead(ctx, client, q)
job, err := q.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}
if err := status.Err(); err != nil {
	return err
}
it, err := job.Read(ctx)
for {
	var row []bigquery.Value
	err := it.Next(&row)
	if err == iterator.Done {
		break
	}
	if err != nil {
		return err
	}
	fmt.Println(row)
}

Python

クエリの抽出先テーブルを顧客管理の暗号鍵で保護するには、QueryJobConfig.destination_encryption_configuration プロパティを EncryptionConfiguration に設定してからクエリを実行します。

# from google.cloud import bigquery
# client = bigquery.Client()

job_config = bigquery.QueryJobConfig()

# Set the destination table. Here, dataset_id is a string, such as:
# dataset_id = 'your_dataset_id'
table_ref = client.dataset(dataset_id).table('your_table_id')
job_config.destination = table_ref

# Set the encryption key to use for the destination.
# TODO: Replace this key with a key you have created in KMS.
kms_key_name = 'projects/{}/locations/{}/keyRings/{}/cryptoKeys/{}'.format(
    'cloud-samples-tests', 'us-central1', 'test', 'test')
encryption_config = bigquery.EncryptionConfiguration(
    kms_key_name=kms_key_name)
job_config.destination_encryption_configuration = encryption_config

# Start the query, passing in the extra configuration.
query_job = client.query(
    'SELECT 17 AS my_col;',
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location='US',
    job_config=job_config)  # API request - starts the query
query_job.result()

# The destination table is written using the encryption configuration.
table = client.get_table(table_ref)
assert table.encryption_configuration.kms_key_name == kms_key_name

Cloud KMS で保護されているテーブルを読み込む

Cloud KMS で保護されているテーブルを読み込むには:

Go

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
gcsRef := bigquery.NewGCSReference("gs://cloud-samples-data/bigquery/us-states/us-states.json")
gcsRef.SourceFormat = bigquery.JSON
gcsRef.AutoDetect = true
loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(gcsRef)
loader.WriteDisposition = bigquery.WriteEmpty
loader.DestinationEncryptionConfig = &bigquery.EncryptionConfig{
	// TODO: Replace this key with a key you have created in KMS.
	KMSKeyName: "projects/cloud-samples-tests/locations/us-central1/keyRings/test/cryptoKeys/test",
}

job, err := loader.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}

if status.Err() != nil {
	return fmt.Errorf("Job completed with error: %v", status.Err())
}

Python

読み込みジョブの抽出先テーブルを顧客管理の暗号鍵で保護するには、LoadJobConfig.destination_encryption_configuration プロパティを EncryptionConfiguration に設定してからテーブルを読み込みます。

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_id = 'my_dataset'

dataset_ref = client.dataset(dataset_id)
job_config = bigquery.LoadJobConfig()
job_config.autodetect = True
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON

# Set the encryption key to use for the destination.
# TODO: Replace this key with a key you have created in KMS.
kms_key_name = 'projects/{}/locations/{}/keyRings/{}/cryptoKeys/{}'.format(
    'cloud-samples-tests', 'us-central1', 'test', 'test')
encryption_config = bigquery.EncryptionConfiguration(
    kms_key_name=kms_key_name)
job_config.destination_encryption_configuration = encryption_config
uri = 'gs://cloud-samples-data/bigquery/us-states/us-states.json'

load_job = client.load_table_from_uri(
    uri,
    dataset_ref.table('us_states'),
    location='US',  # Location must match that of the destination dataset.
    job_config=job_config)  # API request

assert load_job.job_type == 'load'

load_job.result()  # Waits for table load to complete.

assert load_job.state == 'DONE'
table = client.get_table(dataset_ref.table('us_states'))
assert table.encryption_configuration.kms_key_name == kms_key_name

Cloud KMS で保護されているテーブルにストリーミングする

追加のパラメータを指定しなくても、CMEK で保護されている BigQuery テーブルにデータをストリーミングすることができます。このデータは、最終ロケーションだけでなくバッファ内でも Cloud KMS 鍵を使用して暗号化されます。CMEK テーブルでストリーミングを使用する前に、鍵の使用可能性とアクセス可能性に関する要件を確認してください。

ストリーミングの詳細については、BigQuery へのデータのストリーミングをご覧ください。

テーブルをデフォルトの暗号化から Cloud KMS 保護に変更する

コマンドライン

デフォルトの暗号化で保護されているテーブルを、Cloud KMS で保護された新しいテーブルや、元のテーブルにコピーするには、--destination_kms_key フラグを指定した bq cp コマンドを使用できます。--destination_kms_key フラグによって、宛先テーブルで使用する鍵のリソース ID を指定します。この鍵の形式は次のとおりです。

projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY]

鍵のリソース ID を取得する方法については、鍵のリソース ID をご覧ください。

デフォルトの暗号化が使用されているテーブルを Cloud KMS で保護された新しいテーブルにコピーするには、次のコマンドを実行します。

bq cp \
--destination_kms_key projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY] \
sourceDataset.sourceTableId destinationDataset.destinationTableId

デフォルトの暗号化が使用されているテーブルを Cloud KMS で保護して同じテーブルにコピーする場合は、次のコマンドを実行します。

bq cp -f \
--destination_kms_key projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY] \
sourceDataset.sourceTableId sourceDataset.sourceTableId

テーブルを Cloud KMS 保護からデフォルトの暗号化に変更する場合は、--destination_kms_key フラグを使用せずに bq cp を実行して、ファイルをそれ自体にコピーします。

bq コマンドライン ツールの詳細については、bq コマンドライン ツールをご覧ください。

Go

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
srcTable := client.DatasetInProject("bigquery-public-data", "samples").Table("shakespeare")
copier := client.Dataset(datasetID).Table(tableID).CopierFrom(srcTable)
copier.DestinationEncryptionConfig = &bigquery.EncryptionConfig{
	// TODO: Replace this key with a key you have created in Cloud KMS.
	KMSKeyName: "projects/cloud-samples-tests/locations/us-central1/keyRings/test/cryptoKeys/test",
}
job, err := copier.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}
if err := status.Err(); err != nil {
	return err
}

Python

テーブルのコピー先を顧客管理の暗号鍵で保護するには、QueryJobConfig.destination_encryption_configuration プロパティの値を EncryptionConfiguration に設定してからテーブルをコピーします。

# from google.cloud import bigquery
# client = bigquery.Client()

source_dataset = bigquery.DatasetReference(
    'bigquery-public-data', 'samples')
source_table_ref = source_dataset.table('shakespeare')

# dataset_id = 'my_dataset'
dest_dataset_ref = client.dataset(dataset_id)
dest_table_ref = dest_dataset_ref.table('destination_table')

# Set the encryption key to use for the destination.
# TODO: Replace this key with a key you have created in KMS.
kms_key_name = 'projects/{}/locations/{}/keyRings/{}/cryptoKeys/{}'.format(
    'cloud-samples-tests', 'us-central1', 'test', 'test')
encryption_config = bigquery.EncryptionConfiguration(
    kms_key_name=kms_key_name)
job_config = bigquery.CopyJobConfig()
job_config.destination_encryption_configuration = encryption_config

job = client.copy_table(
    source_table_ref,
    dest_table_ref,
    # Location must match that of the source and destination tables.
    location='US',
    job_config=job_config)  # API request
job.result()  # Waits for job to complete.

assert job.state == 'DONE'
dest_table = client.get_table(dest_table_ref)
assert dest_table.encryption_configuration.kms_key_name == kms_key_name

テーブルが Cloud KMS によって保護されているかどうかを判別する

  1. BigQuery ウェブ UI で、データセットの左側にある青い矢印をクリックして展開するか、データセット名をダブルクリックします。これにより、データセット内のテーブルとビューが表示されます。

  2. テーブル名をクリックします。

  3. [Details] をクリックします。[Table Details] ページに、テーブルの説明とテーブル情報が表示されます。

  4. テーブルが Cloud KMS によって保護されている場合は、[Customer-Managed Encryption Key] フィールドに鍵のリソース ID が表示されます。

    保護されたテーブル

BigQuery テーブルの Cloud KMS 鍵を変更する

CMEK で保護された既存テーブルの Cloud KMS 鍵を変更するには、ALTER TABLE クエリを実行するか、API または bq コマンドライン ツールを使用できます。API とコマンドライン ツールを使用して Cloud KMS 鍵を変更する場合は、updatecp の 2 とおりの方法のうちのいずれかを使用できます。update を使用すると、KMS で保護されているテーブルで使用されている Cloud KMS 鍵を変更できます。cp を使用する場合は、CMEK で保護されているテーブルで使用されている Cloud KMS 鍵を変更できます。また、テーブルで、デフォルトの暗号化を CMEK 保護に変更したり、CMEK 保護をデフォルトの暗号化に戻したりすることもできます。update のメリットは、cp より高速であること、およびテーブル デコレータの使用が可能であることです。

従来の UI

は、

この鍵の形式は次のとおりです。

projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY]

鍵のリソース ID を取得する方法については、鍵のリソース ID をご覧ください。

  1. BigQuery ウェブ UI に移動します。

    BigQuery ウェブ UI に移動

  2. [Compose query] をクリックします。

  3. [New Query] テキスト領域に DDL ステートメントを入力します。

     #standardSQL
     ALTER TABLE mydataset.mytable
     SET OPTIONS (
       kms_key_name="projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY]"
     )
     

コマンドライン

Cloud KMS で保護されているテーブルの鍵を変更するには、--destination_kms_key フラグを指定して bq cp コマンドを使用します。--destination_kms_key フラグで、テーブルで使用する鍵のリソース ID を指定します。この鍵の形式は次のとおりです。

projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY]

鍵のリソース ID を取得する方法については、鍵のリソース ID をご覧ください。

bq update \
--destination_kms_key projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY] \
-t [DATASET_ID].[TABLE_ID]

Go

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
tableRef := client.Dataset(datasetID).Table(tableID)
meta, err := tableRef.Metadata(ctx)
if err != nil {
	return err
}
update := bigquery.TableMetadataToUpdate{
	EncryptionConfig: &bigquery.EncryptionConfig{
		// TODO: Replace this key with a key you have created in Cloud KMS.
		KMSKeyName: "projects/cloud-samples-tests/locations/us-central1/keyRings/test/cryptoKeys/otherkey",
	},
}
if _, err := tableRef.Update(ctx, update, meta.ETag); err != nil {
	return err
}

Python

テーブルの顧客管理の暗号鍵を変更するには、Table.encryption_configuration プロパティを新しい EncryptionConfiguration オブジェクトに変更してからテーブルを更新します。

# from google.cloud import bigquery
# client = bigquery.Client()

assert table.encryption_configuration.kms_key_name == original_kms_key_name

# Set a new encryption key to use for the destination.
# TODO: Replace this key with a key you have created in KMS.
updated_kms_key_name = (
    'projects/cloud-samples-tests/locations/us-central1/'
    'keyRings/test/cryptoKeys/otherkey')
table.encryption_configuration = bigquery.EncryptionConfiguration(
    kms_key_name=updated_kms_key_name)

table = client.update_table(
    table, ['encryption_configuration'])  # API request

assert table.encryption_configuration.kms_key_name == updated_kms_key_name
assert original_kms_key_name != updated_kms_key_name

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

Cloud KMS 鍵への BigQuery のアクセス権は、その鍵に対する IAM 権限を取り消すことによって、いつでも削除できます。

BigQuery が Cloud KMS 鍵へのアクセスを失うと、ユーザー エクスペリエンスが大幅に低下し、データが失われる可能性があります。

  • その CMEK で保護されているテーブルのデータにアクセスできなくなるため、querycpextract、および tabledata.list はすべて失敗します。

  • その CMEK で保護されているテーブルに新しいデータを追加できません。

  • アクセス権を付与し直しても、数日間は、そのテーブルへのクエリのパフォーマンスが低下する可能性があります。

Cloud KMS 鍵のローテーションによる影響

テーブルに関連付けられている Cloud KMS 鍵のローテーションが行われても、BigQuery が自動的にそのテーブルの暗号鍵のローテーションを行うことはありません。既存のテーブルでは引き続き、作成時に使用された鍵バージョンが使用されます。新しいテーブルでは現在の鍵バージョンが使用されます。

制限事項

Cloud KMS 鍵への BigQuery のアクセス

Cloud KMS 鍵は、次の場合に BigQuery から使用でき、アクセス可能とみなされます。

  • その鍵が有効になっている
  • BigQuery サービス アカウントに、その鍵に対する暗号化および復号化の権限がある

以下のセクションでは、鍵にアクセスできない場合のストリーミング挿入と長期間アクセスできないデータへの影響について説明します。

ストリーミング挿入への影響

Cloud KMS 鍵は、ストリーミング挿入リクエスト後の 48 時間で 24 時間以上連続して利用可能かつアクセス可能である必要があります。鍵が利用不能またはアクセス不能である場合、ストリーミング データは完全には保持されず、失われる可能性があります。ストリーミング挿入の詳細については、BigQuery へのデータのストリーミングをご覧ください。

長期間アクセスできないデータへの影響

BigQuery はマネージド ストレージを提供するため、長期間アクセスできないデータは BigQuery のアーキテクチャと互換性がありません。特定の BigQuery テーブルの Cloud KMS 鍵が 60 日間連続して利用不能またはアクセス不能である場合、BigQuery はそのテーブルと関連データを削除することを選択する場合があります。データが削除される 7 日前までに、BigQuery は請求先アカウントに関連付けられているメールアドレスにメールを送信します。

テーブル デコレータの使用

Cloud KMS によって保護されているテーブルのデータが、loadcp、または query のオペレーションの書き込み処理 WRITE_TRUNCATE によって置き換えられると、スナップショット デコレータの時刻によっては、テーブル デコレータを使用したクエリからテーブルにアクセスできなくなります。

テーブルが時刻 T に置き換えられて、スナップショット デコレータ snapshot_timeT より早い時刻であるとした場合に、snapshot_time をクエリできるかどうかを以下の表に示します。

T 前の暗号化タイプ T 後の暗号化タイプ snapshot_time
Cloud KMS 暗号化 Cloud KMS 暗号化 クエリ不可
デフォルトの暗号化 Cloud KMS 暗号化 クエリ可能
Cloud KMS 暗号化 デフォルトの暗号化 クエリ不可

範囲デコレータの使用時も、同様のロジックが <time2> に適用されるため、注意が必要です。

よくある質問

Cloud KMS 鍵への権限が必要なのは誰ですか?

顧客管理の暗号鍵を使用している場合、権限を繰り返し指定する必要はありません。Cloud KMS 鍵を使用して暗号化と復号化を行う権限が BigQuery サービス アカウントにある限り、BigQuery テーブルへのアクセス権限を持つユーザーは、Cloud KMS 鍵への直接アクセス権がないユーザーであっても、データにアクセスできます。

どのサービス アカウントが使用されますか?

テーブルの GCP プロジェクトに関連付けられている BigQuery サービス アカウントは、そのテーブルのデータを復号化するために使用されます。BigQuery サービス アカウントはプロジェクトごとに一意です。Cloud KMS で保護されている匿名テーブルにデータを書き込むジョブでは、そのジョブのプロジェクトのサービス アカウントが使用されます。

たとえば、CMEK で保護されている table1table2table3 という 3 つのテーブルについて考えてみます。宛先テーブルを {project3.table3} として {project1.table1, project2.table2} からデータをクエリする場合は、次のようになります。

  • project1.table1 に対しては project1 のサービス アカウントが使用される
  • project2.table2 に対しては project2 のサービス アカウントが使用される
  • project3.table3 に対しては project3 のサービス アカウントが使用される

BigQuery では、どのように Cloud KMS 鍵を使用できますか?

BigQuery は Cloud KMS 鍵を使用して、ユーザークエリ(Tabledata.listjobs.insert など)に応じてデータを復号します。

BigQuery では、データを読み取りに最適化された形式に変換するなど、データのメンテナンスやストレージ最適化タスクにもこの鍵を使用できます。

追加のサポートを得る方法

ご不明点の回答がここに記載されていない場合は、cmek-feedback@google.com にお問い合わせいただくか、BigQuery サポートまたは Cloud KMS サポートをご覧ください。

エラーのトラブルシューティング

よくあるエラーと推奨される軽減策について以下に説明します。

エラー 推奨
Please grant Cloud KMS CryptoKey Encrypter/Decrypter role プロジェクトに関連付けられている BigQuery サービス アカウントに、指定した Cloud KMS 鍵を操作するための十分な Cloud IAM 権限がありません。エラー メッセージ内またはこのドキュメントの手順に従って、適切な Cloud IAM 権限を付与してください。
Existing table encryption settings do not match encryption settings specified in the request このエラーは、宛先テーブルの暗号化設定がリクエストの暗号化設定と一致しない場合に発生することがあります。軽減策として、書き込み処理 TRUNCATE を使用してテーブルを置き換えるか、別の宛先テーブルを指定します。
This region is not supported Cloud KMS 鍵のリージョンが、宛先テーブルの BigQuery データセットのリージョンと一致していません。軽減策として、データセットに一致するリージョンにある鍵を選択するか、鍵リージョンに一致するデータセットに読み込みます。

既知の問題

  • BigQuery クライアント ライブラリでは、顧客管理の暗号鍵を構成するコマンドはまだサポートされていません。
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。