Use customer-managed encryption keys

By default, Eventarc encrypts customer content at rest. Eventarc handles encryption for you without any additional actions on your part. This option is called Google default encryption.

If you want to control your encryption keys, then you can use customer-managed encryption keys (CMEKs) in Cloud KMS with CMEK-integrated services including Eventarc. Using Cloud KMS keys gives you control over their protection level, location, rotation schedule, usage and access permissions, and cryptographic boundaries. Using Cloud KMS also lets you view audit logs and control key life cycles. Instead of Google owning and managing the symmetric key encryption keys (KEKs) that protect your data, you control and manage these keys in Cloud KMS.

After you set up your resources with CMEKs, the experience of accessing your Eventarc resources is similar to using Google default encryption. For more information about your encryption options, see Customer-managed encryption keys (CMEK).

Customer-managed encryption keys are stored as software keys, in a Cloud HSM cluster, or externally using Cloud External Key Manager.

Cloud KMS produces audit logs when keys are enabled, disabled, or used by Eventarc Advanced resources to encrypt and decrypt messages. For more information, see the Cloud KMS audit logging information.

What is protected with CMEK

You can configure CMEK for a channel that Eventarc Standard uses and encrypt the events that pass through the channel.

Enabling a channel with CMEK protects the data associated with it (for example, the Pub/Sub topic used as a transport layer) by using an encryption key that only you can access.

Note that when you enable CMEK for the Google channel in a Google Cloud project, all Eventarc Standard triggers for Google event types in that project and region are fully encrypted with that CMEK key. CMEK keys can't be applied on a per-trigger basis.

Before you begin

Before using this feature in Eventarc, you should:

Console

  1. Enable the Cloud KMS and Eventarc APIs.

    Enable the APIs

  2. Create a key ring.
  3. Create a key for a specified key ring.

gcloud

  1. Update gcloud components.
    gcloud components update
  2. Enable the Cloud KMS and Eventarc APIs for the project that will store your encryption keys.
    gcloud services enable cloudkms.googleapis.com eventarc.googleapis.com
  3. Create a key ring.
  4. Create a key for a specified key ring.

For information on all flags and possible values, run the command with the --help flag.

Note that Cloud KMS and Eventarc are regionalized services. The region for the Cloud KMS key and the protected Eventarc channel must be the same.

Grant the Eventarc service account access to a key

To grant the Eventarc service account access to the Cloud KMS key, add the service account as a principal of the key, and grant the service account the Cloud KMS CryptoKey Encrypter/Decrypter role:

Console

When you enable CMEK for a Google or third-party channel through the console, you are prompted to grant the Cloud KMS CryptoKey Encrypter/Decrypter role to the service account. For more information, in this document, see Enable CMEK for Google event types or Enable CMEK for a third-party event channel.

gcloud

 gcloud kms keys add-iam-policy-binding KEY_NAME \
    --keyring KEY_RING \
    --location LOCATION \
    --member serviceAccount:SERVICE_AGENT_EMAIL \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter

Replace the following:

  • KEY_NAME: the name of the key. For example, my-key.
  • KEY_RING: the name of the key ring. For example, my-keyring.
  • LOCATION: the location of the key. For example, us-central1.
  • SERVICE_AGENT_EMAIL: the email address of the service account with the eventarc.serviceAgentrole.

    For example, service-PROJECT_NUMBER@gcp-sa-eventarc.iam.gserviceaccount.com. For more information, see Service agents.

Enable CMEK for Google event types

Eventarc triggers that route Google event types publish events to a virtual channel referred to as a Google channel that is project and regional-specific. This virtual channel is available in all Eventarc regions.

When you enable CMEK for the Google channel in a Google Cloud project, all Eventarc triggers for Google event types in that project and region are fully encrypted with that CMEK key. You can add multiple CMEK keys, and associate each with a specific region for the Google channel. CMEK keys can't be applied on a per-trigger basis.

Console

  1. In the Google Cloud console, go to the Eventarc > Channels page.

    Go to Channels

  2. Click a channel with a Google Provider.

  3. In the Edit channel page, select the Use a customer-managed encryption key (CMEK) checkbox.

  4. Click Add encryption key.

  5. Select a Region and, in the CMEK encryption key list, select a key ring that you have created for the region. Note that you can add only one encryption key per region for a channel.

  6. Optional: To manually enter the resource name of the key, in the CMEK encryption key list, click Don't see your key? Enter key resource name, and enter the key name in the specified format.

  7. If prompted, grant the cloudkms.cryptoKeyEncrypterDecrypter role to the Eventarc service account with the eventarc.serviceAgent role.

  8. Optional: Click Add encryption key to add another key ring that you have created for a different region.

  9. Click Save.

gcloud

 gcloud eventarc google-channels update \
    --location=LOCATION \
    --crypto-key=KEY

Replace the following:

  • LOCATION: the location of the Google channel to be protected. It must match the location of the key used.
  • KEY: the fully qualified Cloud KMS key name in the format projects/PROJECT_NAME/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME.

If you are creating Pub/Sub triggers using your own existing topics, for comprehensive CMEK protection, we recommend that you also configure the KMS key on the topic. For more information, see Configuring Pub/Sub topics.

Verify Cloud KMS usage

To verify that the channel is now CMEK-compliant:

Console

  1. In the Google Cloud console, go to the Eventarc > Triggers page.

    Go to Triggers

  2. Click a trigger that lists a Google Cloud source as its Event provider and a Region that you have protected using CMEK.

  3. On the Trigger details page, the Encryption status displays, the message, Events encrypted using Customer-managed encryption keys.

gcloud

 gcloud eventarc google-channels describe \
    --location=LOCATION

The output should be similar to the following:

 cryptoKeyName: projects/PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
 name: projects/PROJECT_ID/locations/LOCATION/googleChannelConfig
 updateTime: '2022-06-28T17:24:56.365866104Z'

The cryptokeyName value shows the Cloud KMS key used for the Google channel.

Enable CMEK for a third-party channel

An Eventarc channel for third parties is a resource through which non-Google Cloud entities that offer an Eventarc source can interact with destinations. This channel is specific to a region and you can add only one key per third-party channel.

To enable CMEK for a third-party channel:

Console

  1. In the Google Cloud console, go to the Eventarc > Channels page.

    Go to Channels

  2. Click a channel with a third-party Provider.

  3. In the Channel details page, click Edit.

  4. In the Edit channel page, for Encryption, select Cloud KMS key.

  5. In the Key type list, select a method to manage your keys.

    You can manage your keys manually or you can use Autokey which lets you generate key rings and keys on-demand. If the Autokey option is disabled, it isn't yet integrated with the current resource type.

  6. In the Select a Cloud KMS key list, select a key. Note that you can add only one encryption key per region for a channel.

  7. Optional: To manually enter the resource name of the key, in the Select a Cloud KMS key list, click Enter key manually, and enter the key name in the specified format.

  8. If prompted, grant the cloudkms.cryptoKeyEncrypterDecrypter role to the Eventarc Service Agent.

  9. Click Save.

gcloud

 gcloud eventarc channels update CHANNEL_NAME \
    --location=LOCATION \
    --crypto-key=KEY

Replace the following:

  • CHANNEL_NAME: the name of the third-party channel. To create a new third-party channel, see Create a channel.
  • LOCATION: the location of the third-party channel to be protected. It must match the location of the key.
  • KEY: the fully qualified Cloud KMS key name in the format projects/PROJECT_NAME/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME.

Verify Cloud KMS usage

To verify that the channel is now CMEK-compliant:

Console

  1. In the Google Cloud console, go to the Eventarc > Triggers page.

    Go to Triggers

  2. Click a trigger with a third-party source as its Event provider and a Region that you have protected using CMEK.

  3. In the Trigger details page, the status of Encryption displays the message, Events encrypted using Customer-managed encryption keys.

gcloud

 gcloud eventarc channels describe CHANNEL_NAME \
    --location=LOCATION

The output should be similar to the following:

 createTime: '2022-06-28T18:05:52.403999904Z'
 cryptoKeyName: projects/PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
 name: projects/PROJECT_ID/locations/LOCATION/googleChannelConfig
 pubsubTopic: projects/PROJECT_ID/topics/PUBSUB_TOPIC_ID
 state: ACTIVE
 uid: 5ea277f9-b4b7-4e7f-a8e0-6ca9d7204fa3
 updateTime: '2022-06-28T18:09:18.650727516Z'

The cryptokeyName value shows the Cloud KMS key used for the third-party channel.

Disable CMEK

You can disable the CMEK protection associated with a channel. The events that are delivered through such channels are still protected by Google-owned and Google-managed encryption keys. To delete the CMEK protection associated with a channel:

Console

  1. In the Google Cloud console, go to the Eventarc > Channels page.

    Go to Channels

  2. Based on the type of channel, do the following:

    Google channel

    1. Click a channel with a Google Provider.
    2. On the Edit channel page, hold the pointer over the CMEK encryption key list to see the Delete item button.
    3. Click Delete item.
    4. Click Save.

      You might need to refresh the page to enable the Use a customer-managed encryption key (CMEK) checkbox.

    Third-party channel

    1. Click a channel with a third-party Provider.
    2. On the Channel details page, click Edit.
    3. On the Edit channel page, for Encryption, select Google-managed encryption key.
    4. Click Save.

gcloud

Based on the type of channel, do the following:

Google channel

gcloud eventarc google-channels \
    update --clear-crypto-key

Third-party channel

gcloud eventarc channels CHANNEL_NAME \
    update --clear-crypto-key

Apply a CMEK organization policy

Eventarc is integrated with two organization policy constraints to help ensure CMEK usage across an organization:

  • constraints/gcp.restrictNonCmekServices is used to require CMEK protection.
  • constraints/gcp.restrictCmekCryptoKeyProjects is used to limit which Cloud KMS keys are used for CMEK protection.

This integration lets you specify the following encryption compliance requirements for Eventarc resources in your organization:

Considerations when applying organization policies

Before applying any CMEK organization policies, you should be aware of the following.

  • Prepare for a propagation delay

    After you set or update an organization policy, it can take up to 15 minutes for the new policy to take effect.

  • Consider existing resources

    Existing resources are not subject to newly created organization policies. For example, an organization policy does not retroactively apply to existing pipelines. Those resources are still accessible without a CMEK and, if applicable, are still encrypted with existing keys.

  • Verify 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 the Organization 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.

Require CMEKs for new Eventarc resources

You can use the constraints/gcp.restrictNonCmekServices constraint to require that CMEKs be used to protect new Eventarc resources in an organization.

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 applied continue to exist and are accessible without issue.

Console

  1. In the Google Cloud console, go to the Organization policies page.

    Go to Organization policies

  2. Using the Filter, search for the following constraint:

    constraints/gcp.restrictNonCmekServices
    
  3. In the Name column, click Restrict which services may create resources without CMEK.

  4. Click Manage Policy.

  5. On the Edit policy page, under Policy source, select Override parent's policy.

  6. Under Rules, click Add a rule.

  7. In the Policy values list, select Custom.

  8. In the Policy type list, select Deny.

  9. In the Custom values field, enter the following:

    is:eventarc.googleapis.com
    
  10. Click Done, and then click Set policy.

gcloud

  1. Create a temporary file /tmp/policy.yaml to store the policy:

      name: projects/PROJECT_ID/policies/gcp.restrictNonCmekServices
      spec:
        rules:
        - values:
            deniedValues:
            - is:eventarc.googleapis.com

    Replace PROJECT_ID with the ID of the project where you are applying this constraint.

  2. Run the org-policies set-policy command:

    gcloud org-policies set-policy /tmp/policy.yaml

To verify that the policy is successfully applied, you can try to create an Eventarc Standard channel in the project. The process fails unless you specify a Cloud KMS key.

Restrict Cloud KMS keys for an Eventarc project

You can use the constraints/gcp.restrictCmekCryptoKeyProjects constraint to restrict the Cloud KMS keys that you can use to protect a resource in an Eventarc project.

For example, you can specify a rule similar to the following: "For applicable Eventarc 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."

Console

  1. In the Google Cloud console, go to the Organization policies page.

    Go to Organization policies

  2. Using the Filter, search for the following constraint:

    constraints/gcp.restrictCmekCryptoKeyProjects
    
  3. In the Name column, click Restrict which projects may supply KMS CryptoKeys for CMEK.

  4. Click Manage Policy.

  5. On the Edit policy page, under Policy source, select Override parent's policy.

  6. Under Rules, click Add a rule.

  7. In the Policy values list, select Custom.

  8. In the Policy type list, select Allow.

  9. In the Custom values field, enter the following:

    under:projects/KMS_PROJECT_ID
    

    Replace KMS_PROJECT_ID with the ID of the project where the Cloud KMS keys you want to use are located.

    For example, under:projects/my-kms-project.

  10. Click Done, and then click Set policy.

gcloud

  1. Create a temporary file /tmp/policy.yaml to store the policy:

      name: projects/PROJECT_ID/policies/gcp.restrictCmekCryptoKeyProjects
      spec:
        rules:
        - values:
            allowedValues:
            - under:projects/KMS_PROJECT_ID

    Replace the following

    • PROJECT_ID: the ID of the project where you are applying this constraint.
    • KMS_PROJECT_ID: the ID of the project where the Cloud KMS keys you want to use are located.
  2. Run the org-policies set-policy command:

    gcloud org-policies set-policy /tmp/policy.yaml

To verify that the policy is successfully applied, you can try to create an Eventarc Standard channel using a Cloud KMS key from a different project. The process will fail.

Disabling and enabling Cloud KMS keys

A key version stores the cryptographic key material that you use to encrypt, decrypt, sign, and verify data. You can disable this key version so that data that was encrypted with the key can't be accessed.

When Eventarc cannot access Cloud KMS keys, event publishing with channels fails with FAILED_PRECONDITION errors and event delivery stops. You can enable a key in the Disabled state so that the encrypted data can be accessed again.

Disable Cloud KMS keys

To prevent Eventarc from using the key to encrypt or decrypt your event data, do any of the following:

Although neither operation guarantees instantaneous access revocation, Identity and Access Management (IAM) changes generally propagate faster. For more information, see Cloud KMS resource consistency and Access change propagation.

Re-enable Cloud KMS keys

To resume event delivery and publishing, restore access to Cloud KMS.

Pricing

This integration does not incur additional costs beyond the key operations, which are billed to your Google Cloud project. The use of CMEK for a channel incurs charges for access to the Cloud KMS service based on Pub/Sub pricing.

For more information on the most current pricing information, see Cloud KMS Pricing.

What's next