Stay organized with collectionsSave and categorize content based on your preferences.
Customer-managed Cloud KMS keys
By default, BigQueryencrypts your content stored at rest.
BigQuery handles and manages this default encryption for you
without any additional actions on your part. First, data in a
BigQuery table is encrypted using adata encryption key. Then,
those data encryption keys are encrypted withkey encryption keys, which is
known asenvelope encryption. Key encryption
keys don't directly encrypt your data but are used to encrypt the data
encryption keys that Google uses to encrypt your data.
If you want to control encryption yourself, you can use customer-managed
encryption keys (CMEK) for BigQuery. Instead of Google owning and
managing the key encryption keys that protect your data, you control and manage
key encryption keys inCloud KMS. This document provides
details about manually creating Cloud KMS keys for
BigQuery.
All data assets residing in BigQuery managed storage support
CMEK. However, if you are also querying data stored in anexternal data sourcesuch as Cloud Storage that has CMEK-encrypted
data, then the data encryption is managed byCloud Storage.
For example, BigLake tables support data encrypted with CMEK in
Cloud Storage.
BigQuery andBigLake tablesdon't support Customer-Supplied Encryption Keys (CSEK).
Decide whether you are going to run BigQuery and
Cloud KMS in the same Google Cloud project, or in different
projects. For documentation example purposes, the following convention is used:
PROJECT_ID: the project ID of the project running
BigQuery
PROJECT_NUMBER: the project number of the project
running BigQuery
KMS_PROJECT_ID: the project ID of the project
running Cloud KMS (even if this is the same project running
BigQuery)
A decryption call is performed using Cloud KMS once per query to a
CMEK-encrypted table. For more information, seeCloud KMS pricing.
Encryption specification
Cloud KMS keys used to protect your data in BigQuery are
AES-256 keys. These keys are used as key encryption keys in
BigQuery, in that they encrypt the data encryption keys that
encrypt your data.
Manual or automated key creation
You can either create your CMEK keys manually or use Cloud KMS Autokey.
Autokey simplifies creating and
managing your CMEK keys by automating provisioning and assignment. With
Autokey, you don't need to provision key rings, keys, and service
accounts ahead of time. Instead, they are generated on demand as part of
BigQuery resource creation. For more information, see theAutokey overview.
Manually create key ring and key
For the Google Cloud project that runs Cloud KMS, create a key ring
and a key as described inCreating key rings and keys. Create the key ring in a
location that matches the location of your BigQuery dataset:
Any multi-regional dataset should use a multi-regional key ring from a
matching location. For example, a dataset in regionUSshould be
protected with a key ring from regionus, and a dataset in regionEUshould be protected with a key ring from regioneurope.
Regional datasets should use matching regional keys. For example,
a dataset in regionasia-northeast1should be protected with a key
ring from regionasia-northeast1.
You can't use theglobalregion when configuring CMEK for
BigQuery in the Google Cloud console. However, you can
use theglobalregion when configuring CMEK for
BigQuery by using the bq command-line tool or GoogleSQL.
For more information about the supported locations for BigQuery
and Cloud KMS, seeCloud locations.
Grant encryption and decryption permission
To protect your BigQuery data with a CMEK key, grant the
BigQuery service account permission to encrypt and decrypt using
that key. TheCloud KMS CryptoKey Encrypter/Decrypterrole grants this permission.
Make sure your service account has been created, and then use the
Google Cloud console
to determine the BigQuery service
account ID. Next, provide the service account with the appropriate role to
encrypt
and decrypt using Cloud KMS.
Trigger creation of your service account
Your BigQuery service account is not initially created when you
create a project. To trigger the creation of your service
account, enter a command that uses it, such as thebq show --encryption_service_accountcommand, or call theprojects.getServiceAccountAPI method. For example:
bq show --encryption_service_account --project_id=PROJECT_ID
Assign the Cloud KMS CryptoKey Encrypter/Decrypterroleto the
BigQuery system service account that you copied to your
clipboard. This account is of the form:
No special arrangements are required to query a table protected by
Cloud KMS. BigQuery stores the name of the key used to
encrypt the table content and uses that key when a table protected by
Cloud KMS is queried.
All existing tools, the BigQuery console, and the bq command-line tool run
the same way as with default-encrypted tables, as long as
BigQuery has access to the Cloud KMS key used to encrypt
the table content.
Protect query results with a Cloud KMS key
By default, query results are stored in a temporary table encrypted with a
Google-owned and Google-managed encryption key. If the project already has adefault key,
the key is applied to the temporary (default) query results table. To use a
Cloud KMS key to encrypt your query results instead, select one of the
following options:
You can stream data into your CMEK-protected BigQuery table
without specifying any additional parameters. Note that this data is encrypted
using your Cloud KMS key in the buffer as well as in the final
location. Before using streaming with a CMEK table, review the requirements onkey availability and accessibility.
In the Google Cloud console, click the blue arrow to
the left of your dataset to expand it, or double-click the dataset name. This
displays the tables and views in the dataset.
Click the table name.
ClickDetails. TheTable Detailspage displays the table's
description and table information.
If the table is protected by Cloud KMS, theCustomer-Managed
Encryption Keyfield displays the key resource ID.
For each of the keys you've created or that protect your tables, you can see
what resources that key protects with key usage tracking. For more information,
seeView key usage.
Change the Cloud KMS key for a BigQuery table
To change the Cloud KMS key of an existing CMEK-protected table, you
can run anALTER TABLEquery, use the API, or use the bq command-line tool.
There are two ways to modify the Cloud KMS key using the API and the
bq command-line tool:updateorcp.
If you useupdate, you can change the Cloud KMS key used for a
CMEK-protected table.
If you usecp, you can change the Cloud KMS key used for a
CMEK-protected table, change a table from default encryption to CMEK-protection,
or change a table from CMEK-protection to default encryption.
An advantage ofupdateis it is faster thancpand it lets you usetable decorators.
You can set a dataset-wide default Cloud KMS key that applies to all
newly created tables within the dataset, unless a different Cloud KMS
key is specified when you create the table. The default key does not apply to
existing tables. Changing the default key does not modify any existing tables
and applies only to new tables created after the change.
To apply, change, or remove a dataset default key, select one of the following
options:
You can set project-default Cloud KMS keys that apply to all
query results and newly created tables in the project for that location, unless
you specify a different Cloud KMS key. The default key also applies to
newly created cached results tables that are stored inanonymous datasets.
The default key does not apply to existing tables. Changing the default key does
not modify any existing tables and applies only to new tables created after the
change.
BigQuery ML supports CMEK. Along with the default encryption provided
by BigQuery, you can use your own Cloud Key Management Service keys for encrypting
machine learning models, including imported TensorFlow models.
Create an encrypted model with a Cloud KMS key
To create an encrypted model, use theCREATE MODELstatementand specifyKMS_KEY_NAMEin the training options:
Change a model from default encryption to Cloud KMS protection
You can use thebq cpcommandwith the--destination_kms_keyflag to copy a model protected by default
encryption into a new model that is protected by Cloud KMS.
Alternatively, you can use thebq cpcommand with the-fflag to overwrite a
model protected by default encryption and update it to use Cloud KMS
protection instead. The--destination_kms_keyflag specifies theresource IDof the key to use with the destination model.
To copy a model that has default encryption to a new model that has
Cloud KMS protection:
Use thebq showcommandto see if a model is protected by Cloud KMS key. The
encryption key is in thekmsKeyNamefield.
bq show -m my_dataset.my_model
You can also use the Google Cloud console to find the Cloud KMS
key for an encrypted model. CMEK information is in theCustomer-managed keyfield in theModel Detailssection of the model'sDetailspane.
Change the Cloud KMS key for an encrypted model
Use thebq updatecommandwith
the--destination_kms_keyflag to change the key for a model protected by
Cloud KMS:
If you have a default Cloud KMS key set at the project or dataset level,
BigQuery ML automatically uses this key when creating models.
Use theCREATE MODELstatement to specify a different key to encrypt the model
if you don't want to use the default key.
Use BigQuery ML functions with encrypted models
You can use all BigQuery ML functions with an encrypted model
without specifying an encryption key.
Use CMEK to protect BigQuery Connection API
For Cloud SQL connections, you can protect your BigQuery Connection API credentials using CMEK.
To use CMEK to protect your BigQuery Studio code assets,
you must set a default Dataform CMEK key for the Google Cloud project
that contains your code assets. Code assets include the following:
After you set a default
Dataform CMEK key, Dataform applies the key to
all new resources created in the Google Cloud project by default,
including any hidden resources created for storing your code assets.
The default Dataform CMEK key isn't applied to existing
resources. If you already have code assets in that project, they won't be
encrypted by the default Dataform CMEK key. To use CMEK with a
code asset that was created before you set your project's default
Dataform CMEK key, you can save the asset as a new
BigQuery Studio code asset.
Setting Dataform default CMEK configuration for
BigQuery code assets through Terraform isn't supported.
Instead, use the Dataform API. This configuration must be applied
on a per-project basis, not at the organization level. For instructions, seeSet a default Dataform CMEK key.
Remove BigQuery's access to the Cloud KMS key
You can remove BigQuery's access to the Cloud KMS key at
any time, by revoking the Identity and Access Management (IAM) permission for that key.
If BigQuery loses access to the Cloud KMS key, the user
experience can suffer significantly and data loss can occur:
Data in these CMEK-protected tables can no longer be accessed:query,cp,extract, andtabledata.listwill all fail.
No new data can be added to these CMEK-protected tables.
After access is granted back, the performance of queries to these tables
can be degraded for multiple days.
Control CMEK use with organization policy
BigQuery integrates with CMEKorganization policy constraintsto let you specify encryption compliance requirements for
BigQuery resources in your organization.
This integration lets you do the following:
Require CMEKs for all BigQuery resources in a project.
Restrict which Cloud KMS keys can be used to protect resources in a
project.
Require CMEKs for all resources
A common policy is to require CMEKs to be used to protect all resources in a
specific set of projects. You can use theconstraints/gcp.restrictNonCmekServicesconstraint to enforce this policy in
BigQuery.
If set, this organization policy causes all resource creation requests without a
specified Cloud KMS key to fail.
After you set this policy, it applies only to new resources in the project. Any
existing resources without Cloud KMS keys set continue to exist and are
accessible without issue.
To verify that the policy is successfully applied, you can try to create a table
in the project. The process fails unless you specify a Cloud KMS
key.
This policy also applies to query results tables in the project. You can specify
aproject default keyso users don't have to manually
specify a key each time they execute a query in the project.
Restrict Cloud KMS keys for a BigQuery project
You can use theconstraints/gcp.restrictCmekCryptoKeyProjectsconstraint to
restrict the Cloud KMS keys that you can use to protect a resource in a
BigQuery project.
You might specify a rule - for example, "For all BigQuery
resources in projects/my-company-data-project, Cloud KMS keys used in
this project must come from projects/my-company-central-keys OR
projects/team-specific-keys."
To verify that the policy is successfully applied, you can try to create a table
using a Cloud KMS key from a different project. The process will fail.
Limitations of organization policies
There are limitations associated with setting an organization policy.
Propagation delay
After you set or update an organization policy, it can take up to 15 minutes
for the new policy to take effect. BigQuery caches policies in
order to not negatively affect query and table creation latency.
Required permissions to set an organization policy
The permission to set or update the organization policy might be difficult to
acquire for testing purposes. You must be granted theOrganization Policy Administrator role,
which can only be granted at the organization level (rather than the project or
folder level).
Although the role must be granted at the organization level, it is still
possible to specify a policy that only applies to a specific project
or folder.
Impact of Cloud KMS key rotation
BigQuery doesn't automatically rotate a table encryption key when
the Cloud KMS key associated with the table is rotated. All data in the
existing tables continue to be protected by the key version with which they were
created.
To update a table to use the most recent key version, update the table with the
same Cloud KMS key. This update won't check any organization policy.
Only updating the key will check the organization policy.
If there is a default key on the dataset, and you rotate the key, any new tables
created in the dataset after key rotation use the latest key version.
Impact on Cloud KMS billing
When you create or truncate a CMEK-protected table, BigQuery
generates an intermediate key-encryption key which is then encrypted with the
specified Cloud KMS key.
For billing purposes, this means that neither your calls to Cloud KMS
nor their associated costs scale with the table size. For CMEK-protected tables,
you can expect one call to Cloud KMScryptoKeys.encryptfor each table creation or truncation and one call to Cloud KMScryptoKeys.decryptfor each table involved in a query. These methods both belong to the category ofKey operations: Cryptographiclisted inCloud KMS Pricing.
Either reading from or writing to an existing CMEK-protected table invokes
Cloud KMScryptoKeys.decryptbecause the intermediate key must be
decrypted.
Limitations
BigQuery access to the Cloud KMS key
A Cloud KMS key is considered available and accessible by
BigQuery under the following conditions:
The BigQuery service account has encrypt and decrypt
permissions on the key
The following sections describe impact to streaming inserts and long-term
inaccessible data when a key is inaccessible.
Impact to streaming inserts
The Cloud KMS key must be available and accessible for at least 24
consecutive hours in the 48-hour period following a streaming insertion request.
If the key is not available and accessible, the streamed data might not be fully
persisted and can be lost. For more information about streaming inserts, seeStreaming data into BigQuery.
Impact to long-term inaccessible data
As BigQuery provides managed storage, long-term inaccessible data
is not compatible with BigQuery's architecture. If the
Cloud KMS key of a given BigQuery table is not available
and not accessible for 60 consecutive days, BigQuery might choose
to delete the table and its associated data. At least 7 days before the
data is deleted, BigQuery sends an email to the email address
associated with the billing account.
Using external data sources
If you are querying data stored in anexternal data sourcesuch as Cloud Storage that has CMEK-encrypted
data, then the data encryption is managed byCloud Storage.
For example, BigLake tables support data encrypted with CMEK in
Cloud Storage.
BigQuery andBigLake tablesdon't support Customer-Supplied Encryption Keys (CSEK).
Switching between CMEK-protected and default encryption
You cannot switch a table in place between default encryptions and CMEK
encryption. To switch encryption,copy the
tablewith destination encryption
information set or use aSELECT *query to select the table into itself withWRITE_TRUNCATEdisposition.
Using table decorators
If you protect a table with Cloud KMS and then replace the data in the
table by using the valueWRITE_TRUNCATEfor aload,cp, orqueryoperation, thenrange decoratorsdon't work across the encryption change boundary. You can still use table
decorators, including range decorators, to query the data before or after the
boundary, or query the snapshot at a point in time.
Wildcard table queries
CMEK-protected tables cannot be queried with awildcard
suffix.
Script support
Scriptscannot define destination tables for CMEK operations.
Editions support
CMEK support for BigQuery is only available for BigQuery Enterprise, BigQuery Enterprise Plus and BigQuery On-Demand.
BigQuery Studio support
BigQuery Studio code assets support CMEK. Code assets include the
following:
With customer-managed encryption keys, specifying permissions repeatedly is not
required. As long as the BigQuery service account has permission
to use the Cloud KMS key to encrypt and decrypt, anyone with permission
to the BigQuery table can access the data, even if they
don't have direct access to the Cloud KMS key.
Which service account is used?
The BigQuery service account associated with the
Google Cloud project of the table is used to decrypt that table's data.
The BigQuery service accounts are unique for each project. For a
job that writes data into a Cloud KMS-protected anonymous table, the
job's project's service account is used.
As an example, consider three CMEK-protected tables:table1,table2, andtable3. To query data from{project1.table1, project2.table2}with
destination table{project3.table3}:
Use theproject1service account forproject1.table1
Use theproject2service account forproject2.table2
Use theproject3service account forproject3.table3
In what ways can BigQuery use my Cloud KMS key?
BigQuery uses the Cloud KMS key to decrypt data in
response to a user query, for example,tabledata.listorjobs.insert.
BigQuery can also use the key for data maintenance and storage
optimization tasks, like data conversion into a read-optimized format.
What cryptography libraries are used?
BigQuery relies on Cloud KMS for CMEK functionality.
Cloud KMS usesTinkfor
encryption.
How to get more help?
If you have questions that are not answered here, seeBigQuery support.
Troubleshooting errors
The following describes common errors and recommended mitigations.
Error
Recommendation
Please grant Cloud KMS CryptoKey Encrypter/Decrypter role
The BigQuery service account associated with your project
doesn't have sufficient IAM permission to operate on the
specified Cloud KMS key. Follow the instructions in the error orin this documentationto grant the proper
IAM permission.
Existing table encryption settings don't match encryption settings
specified in the request
This can occur in scenarios where the destination table has encryption
settings that don't match the encryption settings in your request. As
mitigation, use write dispositionTRUNCATEto replace the table,
or specify a different destination table.
This region is not supported
The region of the Cloud KMS key does not match the region of the
BigQuery dataset of the destination table. As a mitigation,
select a key in a region that matches your dataset, or load into a dataset
that matches the key region.
Your administrator requires that you specify an encryption key for queries
in projectPROJECT_ID.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2026-05-08 UTC."],[],[]]