使用 Cloud KMS 金鑰保護資料

根據預設,BigQuery 會對客戶存放的靜態資料進行加密。BigQuery 會為您處理及管理這項預設加密作業,您不必進行任何其他操作。首先,系統會使用「資料加密金鑰」對 BigQuery 資料表中的資料進行加密,然後使用「金鑰加密金鑰」為資料加密金鑰進行加密,這個方法稱為信封式加密。金鑰加密金鑰不會直接加密您的資料,其用途是對 Google 用來加密您資料的資料加密金鑰進行加密。詳情請參閱金鑰管理一節。

如果您想自行控管加密作業,可以針對 BigQuery 使用客戶代管的加密金鑰 (CMEK)。這樣您就可以在 Cloud KMS 中控制及管理用來保護您資料的金鑰加密金鑰,而不要讓 Google 管理。本主題將提供有關這項技巧的詳細資訊。

進一步瞭解 Google Cloud Platform 的加密選項

事前準備

  1. 瞭解資料集資料表查詢

  2. 決定您會在相同還是不同的 GCP 專案中執行 BigQuery 和 Cloud KMS。為了方便說明,本文的範例將採用下列慣例:

    • 「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 地區的金鑰環來保護。
      • global 地區不支援使用 BigQuery。
      如要進一步瞭解支援 BigQuery 和 Cloud KMS 的地區,請參閱 Cloud 據點

加密規格

BigQuery 中用來保護您資料的 Cloud KMS 金鑰是 AES-256 金鑰。這類金鑰的用途是對加密您資料的資料加密金鑰進行加密,因此才會在 BigQuery 中當做金鑰加密金鑰使用。

授予加密和解密權限

請使用 Google Cloud Platform 主控台取得要授予權限的 BigQuery 服務帳戶 ID,並為該服務帳戶提供適當的角色,以便使用 Cloud KMS 進行加密及解密。

取得服務帳戶 ID

傳統版 UI

  1. 前往 BigQuery 網頁版 UI。

    前往 BigQuery 網頁版 UI

  2. 在導覽窗格中,按一下專案名稱旁的向下箭號圖示 向下箭號圖示,然後按一下 [Customer Managed Encryption]

  3. 使用者對話方塊隨即會開啟,並顯示需要加密和解密權限的服務帳戶:

    服務帳戶 ID

  4. 按一下 [Copy] (複製) 將服務帳戶 ID 複製到剪貼簿,然後點選 [OK] (確定) 來關閉使用者對話方塊。

CLI

您可以使用 bq show 指令搭配 --encryption_service_account 標記來取得服務帳戶 ID:

bq show --encryption_service_account

該指令會顯示服務帳戶 ID:

                       ServiceAccountID
     -------------------------------------------------------------
      bq-project_number@bigquery-encryption.iam.gserviceaccount.com

指派加密者/解密者角色

系統會將 Cloud KMS CryptoKey Encrypter/Decrypter 角色指派給您複製到剪貼簿的 BigQuery 系統服務帳戶。該帳戶的格式如下:

bq-project_number@bigquery-encryption.iam.gserviceaccount.com

主控台

  1. 在 GCP 主控台中開啟「Security」(安全性) 頁面。

    開啟安全性加密編譯金鑰頁面

  2. 選取您的專案並按一下 [繼續]

  3. 找出您要新增角色的加密金鑰。

    • 如果 bq-project_number@bigquery-encryption.iam.gserviceaccount.com 服務帳戶不在成員清單中,表示尚未獲派任何角色。請按一下 [Add member] (新增成員),並輸入服務帳戶的電子郵件地址:bq-project_number@bigquery-encryption.iam.gserviceaccount.com
    • 如果服務帳戶已在成員清單中,表示已獲指派角色。請按一下 bq-project_number@bigquery-encryption.iam.gserviceaccount.com 服務帳戶目前的角色下拉式清單。
  4. 依序點選 [Role] (角色) 下拉式清單 > [Cloud KMS] > [Cloud KMS CryptoKey Encrypter/Decrypter] (Cloud KMS 加密編譯金鑰加密者/解密者) 角色。

  5. 按一下 [Add] (新增) 或 [Save] (儲存),將角色套用至 bq-project_number@bigquery-encryption.iam.gserviceaccount.com 服務帳戶。

CLI

您可以使用 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」分別替換為 Cloud KMS 金鑰的位置、金鑰環和金鑰名稱。

金鑰資源 ID

使用 CMEK 時需要 Cloud KMS 金鑰的資源 ID,如這個主題的範例所示。這組金鑰的格式如下:

projects/project_id/locations/location/keyRings/key_ring/cryptoKeys/key

如要瞭解如何擷取金鑰資源 ID,請參閱金鑰資源 ID 一文。

建立受 Cloud KMS 保護的資料表

建立受 Cloud KMS 保護的空白資料表

如何建立受 Cloud KMS 保護的資料表:

傳統版 UI

  1. 在 BigQuery 網頁版使用者介面中,按一下資料集名稱旁的向下箭號圖示 向下箭號圖示,然後按一下 [Create new table]

  2. 在「Create table」頁面中填寫建立包含結構定義的空白資料表的必要資訊。在您點選 [Create Table] (建立資料表) 之前,請先設定加密類型,並指定要與資料表搭配使用的 Cloud KMS 金鑰:

    1. 按一下 [Encryption Type] (加密類型) 下拉式清單,並取消選取 [Customer-Managed Encryption] (客戶代管式加密)
    2. 在「Customer-Managed Encryption Key」部分中,輸入金鑰資源 ID
  3. 按一下 [Create Table] (建立資料表)

CLI

您可以使用 bq 指令列工具搭配 --destination_kms_key 標記來建立資料表。--destination_kms_key 標記指定的是與資料表搭配使用的金鑰資源 ID

如何建立包含結構定義的空白資料表:

bq mk --schema name:string,value:integer -t \
--destination_kms_key projects/project_id/locations/location/keyRings/key_ring/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/key_ring/cryptoKeys/key'
  )
"

如何從查詢建立資料表:

bq query --destination_table=mydataset.newtable \
--destination_kms_key projects/project_id/locations/location/keyRings/key_ring/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 保護的資料表時使用這個金鑰。

只要 BigQuery 具備加密資料表內容使用的 Cloud KMS 金鑰存取權,所有現有工具 (包括 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

  5. 按一下 [Run Query] (執行查詢)。

CLI

指定 --destination_kms_key 標記,以透過 Cloud KMS 金鑰來保護目標資料表或查詢結果 (如果使用臨時資料表)。--destination_kms_key 標記會指定與目的地資料表或結果資料表搭配使用的金鑰資源 ID

您可以選擇使用 --destination_table 標記來指定查詢結果的目標資料表。如果不使用 --destination_table,則查詢結果會寫入臨時資料表。

如何查詢資料表:

bq query \
--destination_table=mydataset.newtable \
--destination_kms_key projects/project_id/locations/location/keyRings/key_ring/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 保護的資料表中載入資料檔案:

主控台

指定載入資料表時要使用的金鑰,以透過客戶代管的加密金鑰來保護載入工作目的地資料表。

  1. 在 GCP 主控台中開啟 BigQuery 網頁版 UI。
    前往 BigQuery 網頁版 UI
  2. 在導覽面板的「Resources」(資源) 區段,展開您的專案並選取資料集。
  3. 在視窗右側的詳細資料面板中,按一下 [Create table] (建立資料表)
  4. 輸入載入資料表時要使用的選項,但請先按一下 [Advanced options] (進階選項),再點選 [Create table] (建立資料表)
  5. 在「Encryption」(加密) 底下,選取 [Customer-managed key] (客戶代管的金鑰)。
  6. 按一下 [Select a customer-managed key] (選取客戶代管的金鑰) 下拉式選單,然後選取要使用的金鑰。如果找不到任何可用的金鑰,請輸入金鑰資源 ID

    進階選項

  7. 按一下 [Create table] (建立資料表)

CLI

設定 --destination_kms_key 標記,以透過客戶代管的加密金鑰來保護載入工作目的地資料表。

bq --location=location load \
--autodetect \
--source_format=format \
--destination_kms_key projects/project_id/locations/location/keyRings/key_ring/cryptoKeys/key \
dataset.table \
path_to_source
例如:
bq load \
--autodetect \
--source_format=NEWLINE_DELIMITED_JSON \
--destination_kms_key projects/project_id/locations/location/keyRings/key_ring/cryptoKeys/key \
test2.table4 \
gs://cloud-samples-data/bigquery/us-states/us-states.json

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 防護

CLI

您可以使用 bq cp 指令搭配 --destination_kms_key 標記,將受預設加密機制保護的資料表複製到受 Cloud KMS 保護的新資料表或原始資料表中。--destination_kms_key 標記指定的是與目的地資料表搭配使用的金鑰資源 ID

如何將採預設加密機制的資料表複製到受 Cloud KMS 保護的新資料表:

bq cp \
--destination_kms_key projects/project_id/locations/location/keyRings/key_ring/cryptoKeys/key \
sourceDataset.sourceTableId destinationDataset.destinationTableId

如何將採預設加密機制的資料表複製到受 Cloud KMS 保護的相同資料表:

bq cp -f \
--destination_kms_key projects/project_id/locations/location/keyRings/key_ring/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。如果使用 update,您可以針對受 KMS 保護的資料表變更 Cloud KMS 金鑰。如果使用 cp,則可針對受 CMEK 保護的資料表變更 Cloud KMS 金鑰、將資料表的保護機制從預設加密變更為 CMEK 防護,以及將資料表的保護機制從 CMEK 防護變更為預設加密。update 的好處是比 cp 還要快,且支援使用資料表修飾符

傳統版 UI

  1. 前往 BigQuery 網路 UI。

    前往 BigQuery 網頁版 UI

  2. 按一下 [Compose query] (撰寫查詢)

  3. 將您的 DDL 陳述式輸入到「New Query」(新查詢) 文字區域中。針對 kms_key_name 的值,指定要用來保護資料表的金鑰資源 ID

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

CLI

您可以使用 bq cp 指令搭配 --destination_kms_key 標記,針對受 Cloud KMS 保護的資料表變更金鑰。--destination_kms_key 標記指定的是與資料表搭配使用的金鑰資源 ID

bq update \
--destination_kms_key projects/project_id/locations/location/keyRings/key_ring/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 金鑰,且該金鑰會套用至資料集中所有新建立的資料表,除非您在建立資料表時指定其他 Cloud KMS 金鑰。不過預設金鑰不適用於現有的資料表。變更預設金鑰並不會修改任何現有資料表,只會套用至在變更後建立的新資料表。

您可以透過下列操作套用、變更或移除資料集預設金鑰:

移除 BigQuery 對 Cloud KMS 金鑰的存取權

您隨時可移除 BigQuery 對 Cloud KMS 金鑰的存取權,只要撤銷對該金鑰的身分與存取權管理權限即可。

如果 BigQuery 無法存取 Cloud KMS 金鑰,使用者體驗可能會受到嚴重影響,且資料可能會遺失:

  • 您將無法再存取這些受 CMEK 保護的資料表中的資料:querycpextracttabledata.list 全都會發生錯誤。

  • 您將無法在這些受 CMEK 保護的資料表中新增任何資料。

  • 即使重新授予存取權,查詢效能也可能會在一開始的幾天受到影響。

Cloud KMS 金鑰輪替的影響

與資料表關聯的 Cloud KMS 金鑰輪替時,BigQuery 不會自動輪替資料表加密金鑰。現有資料表會繼續使用資料表建立時既有的金鑰版本。新資料表則會使用目前的金鑰版本。

限制

BigQuery 對 Cloud KMS 金鑰的存取權

在符合以下條件的情況下,BigQuery 會將 Cloud KMS 金鑰判定為可供使用及存取:

  • 金鑰已啟用
  • BigQuery 服務帳戶具備該金鑰的加密和解密權限

以下各節將說明如果不能存取金鑰,將會對串流資料插入和長期無法存取的資料造成什麼影響。

對串流資料插入造成的影響

在提交串流資料插入要求後的 48 小時內,Cloud KMS 金鑰必須可供使用及至少連續 24 個小時。如果不能使用及存取金鑰,串流資料可能會無法完整留存且可能會遺失。如要進一步瞭解串流資料插入,請參閱以串流方式將資料傳入 BigQuery 一文。

對長期無法存取的資料造成的影響

由於 BigQuery 提供受管理的儲存空間,因此長期無法存取的資料與 BigQuery 的架構並不相容。如果連續 60 天無法使用及存取特定 BigQuery 資料表的 Cloud KMS 金鑰,BigQuery 可能會選擇刪除資料表及相關聯的資料。在刪除資料前,BigQuery 會提前至少 7 天的時間傳送電子郵件至與帳單帳戶相關聯的電子郵件地址。

使用資料表裝飾器

如果透過 loadcpquery 作業的寫入配置 WRITE_TRUNCATE 取代受 Cloud KMS 保護的資料表資料,則查詢將無法透過資料表修飾符存取資料表,實際情況視快照修飾符時間而定。

請參閱下列表格,瞭解您是否可針對 snapshot_time 進行查詢,其中我們假設資料表遭取代的時間是 T,且快照裝飾器 snapshot_time 的時間小於 T

T 之前的加密類型 T 之後的加密類型 snapshot_time
Cloud KMS 加密 Cloud KMS 加密 無法查詢
預設加密 Cloud KMS 加密 可以查詢
Cloud KMS 加密 預設加密 無法查詢

請注意,使用範圍修飾符時,類似的邏輯也適用於 <time2>

常見問題

誰需要 Cloud KMS 金鑰的存取權?

使用客戶管理的加密金鑰時,您不需要重複指定權限。只要 BigQuery 服務帳戶有權使用 Cloud KMS 金鑰來進行加密和解密,那麼任何擁有 BigQuery 資料表權限的人都可存取資料 (即使無法直接存取 Cloud KMS 金鑰也沒問題)。

要使用哪個服務帳戶?

與資料表的 GCP 專案相關聯的 BigQuery 服務帳戶會用來解密該資料表的資料。每個專案的 BigQuery 服務帳戶都不相同。如果工作是在受 Cloud KMS 保護的匿名資料表中寫入資料,系統就會使用該工作所屬專案的服務帳戶。

舉例來說,假設有三個受 CMEK 保護的資料表:table1table2table3。如要透過目的地資料表 {project3.table3} 查詢 {project1.table1, project2.table2} 中的資料,請按照下列指示操作:

  • 針對 project1.table1 使用 project1 服務帳戶
  • 針對 project2.table2 使用 project2 服務帳戶
  • 針對 project3.table3 使用 project3 服務帳戶

BigQuery 可透過哪些方式使用我的 Cloud KMS 金鑰?

BigQuery 將在回應使用者查詢 (例如 tabledata.listjobs.insert) 時使用 Cloud KMS 金鑰來解密資料。

BigQuery 還可將該金鑰用於資料維護和儲存空間最佳化作業,例如將資料轉換成最適合讀取的格式。

使用何種密碼編譯程式庫?

BigQuery 依賴 Cloud KMS 執行 CMEK 功能。Cloud KMS 使用 Tink 進行加密。

如何取得其他協助?

如果您有其他疑問,但在本文中找不到答案,請聯絡 cmek-feedback@google.com,以及查看 BigQuery 支援Cloud KMS 支援說明。

排解相關錯誤

以下說明常見問題和建議的解決方法。

錯誤 建議
請授予 Cloud KMS 加密編譯金鑰加密者/解密者角色 與專案相關聯的 BigQuery 服務帳戶的 Cloud IAM 權限不足,無法對指定 Cloud KMS 金鑰執行操作。請按照錯誤訊息或這份說明文件中的指示操作,授予適當的 Cloud IAM 權限。
現有資料表加密設定與要求中指定的加密設定不一致 如果目的地資料表的加密設定與您要求中的加密設定不一致,就可能會出現這類錯誤。如要解決這類問題,請使用寫入配置 TRUNCATE 取代資料表,或指定其他目的地資料表。
不支援這個區域 Cloud KMS 金鑰的區域與目的地資料表的 BigQuery 資料集區域不一致。如要解決這類問題,請在與資料集相同的區域選取金鑰,或載入與金鑰區域相符的資料集。
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁