为 Looker (Google Cloud Core) 启用 CMEK

默认情况下,Google Cloud 会使用由 Google 管理的加密密钥自动加密静态数据。如果您对保护数据的密钥有特定的合规性或监管要求,则可以使用客户管理的加密密钥 (CMEK) 对 Looker (Google Cloud Core) 进行应用级加密。

如需大致了解 CMEK(包括何时和为何启用 CMEK),请参阅 Cloud Key Management Service 文档

本页面介绍了如何配置 Looker (Google Cloud Core) 实例以使用 CMEK。

Looker (Google Cloud Core) 如何与 CMEK 交互?

Looker (Google Cloud Core) 使用单个 CMEK 密钥(通过辅助密钥层次结构)来帮助保护由 Looker (Google Cloud Core) 实例管理的敏感数据。在启动期间,Looker 实例中的每个进程都会对 Cloud Key Management Service (KMS) 进行一次初始调用,以解密密钥。在正常操作期间(启动后),整个 Looker 实例大约每五分钟对 KMS 进行一次调用,以验证密钥是否仍然有效。

哪些类型的 Looker (Google Cloud Core) 实例支持 CMEK?

当满足以下两个条件时,Looker (Google Cloud Core) 实例支持 CMEK:

  • 本页面介绍的 CMEK 配置步骤是在创建 Looker (Google Cloud Core) 实例之前完成的。您无法在现有实例上启用客户管理的加密密钥。
  • 实例版本必须为企业版嵌入版本

使用 CMEK 创建 Looker (Google Cloud Core) 实例的工作流

本页面将引导您完成以下步骤,以便为 Looker (Google Cloud Core) 实例设置 CMEK。

  1. 设置您的环境
  2. 仅限 Google Cloud CLI、Terraform 和 API 用户:如果尚未设置任何需要客户管理的加密密钥的项目,请为该项目创建一个服务帐号
  3. 创建密钥环和密钥,并设置密钥的位置。位置是您要创建 Looker (Google Cloud Core) 实例的 Google Cloud 区域。
  4. 仅限 Google Cloud CLI、Terraform 和 API 用户复制或记下密钥 ID (KMS_KEY_ID) 和密钥位置以及密钥环的 ID (KMS_KEYRING_ID)。在向服务帐号授予对密钥的访问权限时,您需要用到此信息。
  5. 仅限 Google Cloud CLI、Terraform 和 API 用户授予服务帐号对密钥的访问权限。
  6. 前往您的项目,然后使用以下选项创建 Looker (Google Cloud Core) 实例
    1. 选择与客户管理的加密密钥相同的位置
    2. 版本设为企业版嵌入版
    3. 启用客户管理的密钥配置。
    4. 按名称或 ID 添加客户管理的加密密钥。

完成所有这些步骤后,您的 Looker (Google Cloud Core) 实例将通过 CMEK 启用。

准备工作

如果您尚未执行此操作,请确保您的环境已配置为允许您按照本页面上的说明操作。请按照本部分中的步骤操作,确保您的设置正确无误。

  1. 在 Google Cloud 控制台的项目选择器页面上,选择或创建 Google Cloud 项目注意:如果您不打算保留在此过程中创建的资源,请创建一个项目,而不是选择现有项目。完成上述步骤后,您可以删除所创建的项目,但此操作会移除与该项目关联的资源。

    前往项目选择器

  2. 确保您的 Google Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能
  3. 安装 Google Cloud CLI。
  4. 如需initialize gcloud CLI,请运行以下命令:

    gcloud init
    

  5. 启用 Cloud Key Management Service API。

    启用 API

  6. 启用 Looker (Google Cloud Core) API。

    启用 API

所需的角色

如需了解设置 CMEK 所需的角色,请访问 Cloud Key Management Service 文档中的使用 IAM 进行访问权限控制页面。

如需创建 Looker (Google Cloud Core) 实例,请确保您对创建 Looker (Google Cloud Core) 实例的项目拥有 Looker Admin IAM 角色。如需在 Google Cloud 控制台中为实例启用 CMEK,请确保您对要用于 CMEK 的密钥拥有 Cloud KMS CryptoKey Encrypter/Decrypter IAM 角色。

如果您需要向 Looker 服务帐号授予对 Cloud KMS 密钥的访问权限,则需要对使用的密钥拥有 Cloud KMS Admin IAM 角色。

创建服务账号

如果您使用 Google Cloud CLI、Terraform 或 API 创建 Looker (Google Cloud Core) 实例,而系统尚未为其创建 Looker 服务帐号时所在的 Google Cloud 项目,则需要为该项目创建一个服务帐号。如果您要在项目中创建多个 Looker (Google Cloud Core) 实例,那么同一服务帐号会应用于该项目中的所有 Looker (Google Cloud Core) 实例,并且服务帐号的创建只需执行一次。如果您使用控制台创建实例,则在您配置使用客户管理的加密密钥选项时,Looker (Google Cloud Core) 会自动创建服务帐号并向其授予对 CMEK 密钥的访问权限。

要允许用户管理服务账号,请授予以下角色之一:

  • Service Account User (roles/iam.serviceAccountUser):包括列出服务账号、获取服务帐号的详细信息以及模拟服务帐号的权限。
  • Service Account Admin (roles/iam.serviceAccountAdmin):包括列出服务帐号和获取服务帐号详情的权限。此外,还包括创建、更新和删除服务帐号的权限。

目前,您只能使用 Google Cloud CLI 命令来创建客户管理的加密密钥所需的服务帐号类型。如果您使用的是 Google Cloud 控制台,Looker (Google Cloud Core) 会自动为您创建此服务帐号。

gcloud

运行以下命令以创建服务帐号:

gcloud beta services identity create \
--service=looker.googleapis.com \
--project=PROJECT_ID

PROJECT_ID 替换为 Looker (Google Cloud Core) 实例所在的项目。

此命令会创建服务帐号并返回服务帐号名称。在向服务帐号授予密钥访问权限的过程中,您将使用此服务帐号名称。

创建服务帐号后,请等待几分钟,让服务帐号传播。

创建密钥环和密钥

您可以在 Looker (Google Cloud Core) 实例所在的 Google Cloud 项目中创建密钥,也可以在单独的用户项目中创建密钥。Cloud KMS 密钥环的位置必须与您要创建 Looker (Google Cloud Core) 实例的区域相匹配。多区域密钥或全球区域密钥将不会起作用。如果区域不匹配,Looker (Google Cloud Core) 实例创建请求将失败。

按照创建密钥环创建密钥文档页面中的说明,创建满足以下两个条件的密钥环和密钥:

  • 密钥环位置字段必须与您要为 Looker (Google Cloud Core) 实例设置的区域一致。
  • 密钥用途字段必须为对称加密/解密

如需了解如何轮替密钥和创建新的密钥版本,请参阅轮替密钥部分。

复制或记下 KMS_KEY_IDKMS_KEYRING_ID

如果您使用 Google Cloud CLI、Terraform 或 API 来设置 Looker (Google Cloud Core) 实例,请按照获取 Cloud KMS 资源 ID 文档页面中的说明操作,找到您刚刚创建的密钥环和密钥的资源 ID。复制或记下密钥 ID (KMS_KEY_ID) 和密钥位置,以及密钥环的 ID (KMS_KEYRING_ID)。在向服务帐号授予对密钥的访问权限时,您需要用到此信息。

向服务账号授予密钥的访问权限

只有在同时满足以下两个条件时,您才需要执行此过程:

  • 您使用的是 Google Cloud CLI、Terraform 或 API。
  • 尚未向服务帐号授予对密钥的访问权限。例如,如果同一项目中已存在使用同一密钥的 Looker (Google Cloud Core) 实例,您无需授予访问权限。或者,如果其他人已授予密钥的访问权限,则您无需授予访问权限。

您必须拥有要用于授予服务帐号访问权限的密钥Cloud KMS Admin IAM 角色。

如需向服务账号授予访问权限,请执行以下操作:

gcloud

gcloud kms keys add-iam-policy-binding KMS_KEY_ID \
--location=REGION \
--keyring=KMS_KEYRING_ID \
--member=serviceAccount:SERVICE_ACCOUNT_NAME \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter

替换以下内容:

  • KMS_KEY_ID:KMS 密钥的 ID
  • REGION:创建 Looker (Google Cloud Core) 的区域以及密钥环的位置
  • KMS_KEYRING_ID:KMS 密钥环的 ID
  • SERVICE_ACCOUNT_NAME创建服务帐号时返回的服务帐号名称

向服务帐号授予 IAM 角色后,请等待几分钟,让权限传播。

使用 CMEK 创建 Looker (Google Cloud Core) 实例

如需在 Google Cloud 控制台中使用客户管理的加密密钥创建实例,请先按照上文创建密钥环和密钥部分中的步骤,在要用于 Looker (Google Cloud Core) 实例的同一区域中创建密钥环和密钥。接下来,使用以下设置,按照说明创建 Looker (Google Cloud Core) 实例。

如需使用 CMEK 设置创建专用 IP 实例,请选择以下选项之一:

控制台

  1. 确保您对要用于 CMEK 的密钥拥有 Cloud KMS CryptoKey Encrypter/Decrypter IAM 角色。
  2. 创建实例页面的版本部分,您必须选择企业版嵌入版本才能使用 CMEK。
  3. 创建实例页面的加密部分中,选择客户管理的加密密钥 (CMEK) 单选按钮。此时会显示一个选择客户管理的密钥下拉字段。
  4. 选择客户管理的密钥字段中,设置要使用的密钥。密钥必须位于密钥环中,并且其位置设置为您正在创建的 Looker (Google Cloud Core) 实例所在的区域,否则实例创建将会失败。您可以通过以下两种方法之一选择密钥:
    1. 从下拉列表中选择密钥名称:您的 Google Cloud 项目中的可用密钥会显示在下拉列表中。选择密钥后,点击 OK
    2. 输入密钥的资源 ID:点击文本没有看到您的密钥?请输入密钥资源 ID(显示在下拉菜单底部)。此时会显示 Enter key resource ID(输入密钥资源 ID)对话框,您可以在其中输入密钥的 ID。输入 ID 后,选择保存
  5. 选择密钥后,系统会显示一条消息,要求您向服务帐号授予密钥的使用权限。点击授权按钮。
  6. 如果服务帐号无权使用所选密钥进行加密和解密,系统会显示一条消息。如果发生这种情况,请点击授予,向服务帐号授予所选 KMS 密钥的 Cloud KMS CryptoKey Encrypter/Decrypter IAM 角色
  7. 完成 Looker (Google Cloud Core) 实例的所有配置后,点击创建

gcloud

gcloud looker instances create INSTANCE_NAME \
--project=PROJECT_ID \
--oauth-client-id=OAUTH_CLIENT_ID\
--oauth-client-secret=OAUTH_CLIENT_SECRET \
--kms-key=KMS_KEY_ID
--region=REGION \
--edition=EDITION
[--consumer-network=CONSUMER_NETWORK --private-ip-enabled --reserved-range=RESERVED_RANGE]
[--no-public-ip-enabled]
[--public-ip-enabled]

替换以下内容:

  • INSTANCE_NAME:您的 Looker (Google Cloud Core) 实例的名称;它不与实例网址关联
  • PROJECT_ID:要在其中创建 Looker (Google Cloud Core) 实例的 Google Cloud 项目的名称
  • OAUTH_CLIENT_IDOAUTH_CLIENT_SECRET:您在设置 OAuth 客户端时创建的 OAuth 客户端 ID 和 OAuth 密钥。创建实例后,在 OAuth 客户端的已获授权的重定向 URI 部分中输入实例的网址
  • KMS_KEY_ID:KMS 密钥的 ID
  • REGION:托管 Looker (Google Cloud Core) 实例的区域。如需了解可用区域,请参阅 Looker (Google Cloud Core) 位置文档页面。
  • EDITION:如需启用 CMEK,EDITION 必须为 core-embed-annualcore-enterprise-annual
  • CONSUMER_NETWORK:您的 VPC 网络或共享 VPC。如果您要创建专用 IP 实例,则必须设置此字段。
  • RESERVED_RANGE:Google 将在其中为您的 Looker (Google Cloud Core) 实例预配子网的 VPC 内的 IP 地址范围。如果您要创建专用 IP 实例,则必须设置此字段。

您可以添加以下标志:

  • --private-ip-enabled 用于启用专用 IP。
  • --public-ip-enabled 启用公共 IP。
  • --no-public-ip-enabled 表示停用公共 IP。

Terraform

使用以下 Terraform 资源来预配具有专用网络连接Enterprise Looker (Google Cloud Core) 实例:

# Creates an Enterprise edition Looker (Google Cloud core) instance with full, Private IP functionality.
resource "google_looker_instance" "main" {
  name               = "my-instance"
  platform_edition   = "LOOKER_CORE_ENTERPRISE_ANNUAL"
  region             = "us-central1"
  private_ip_enabled = true
  public_ip_enabled  = false
  reserved_range     = google_compute_global_address.main.name
  consumer_network   = data.google_compute_network.main.id
  admin_settings {
    allowed_email_domains = ["google.com"]
  }
  encryption_config {
    kms_key_name = google_kms_crypto_key.main.id
  }
  maintenance_window {
    day_of_week = "THURSDAY"
    start_time {
      hours   = 22
      minutes = 0
      seconds = 0
      nanos   = 0
    }
  }
  deny_maintenance_period {
    start_date {
      year  = 2050
      month = 1
      day   = 1
    }
    end_date {
      year  = 2050
      month = 2
      day   = 1
    }
    time {
      hours   = 10
      minutes = 0
      seconds = 0
      nanos   = 0
    }
  }
  oauth_config {
    client_id     = "my-client-id"
    client_secret = "my-client-secret"
  }
  depends_on = [
    google_service_networking_connection.main,
    google_kms_crypto_key.main
  ]
}

resource "google_kms_key_ring" "main" {
  name     = "keyring-example"
  location = "us-central1"
}

resource "google_kms_crypto_key" "main" {
  name     = "crypto-key-example"
  key_ring = google_kms_key_ring.main.id
}

resource "google_service_networking_connection" "main" {
  network                 = data.google_compute_network.main.id
  service                 = "servicenetworking.googleapis.com"
  reserved_peering_ranges = [google_compute_global_address.main.name]
}

resource "google_compute_global_address" "main" {
  name          = "looker-range"
  purpose       = "VPC_PEERING"
  address_type  = "INTERNAL"
  prefix_length = 20
  network       = data.google_compute_network.main.id
}

data "google_project" "main" {}

data "google_compute_network" "main" {
  name = "default"
}

resource "google_kms_crypto_key_iam_member" "main" {
  crypto_key_id = google_kms_crypto_key.main.id
  role          = "roles/cloudkms.cryptoKeyEncrypterDecrypter"
  member        = "serviceAccount:service-${data.google_project.main.number}@gcp-sa-looker.iam.gserviceaccount.com"
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

您的 Looker (Google Cloud Core) 实例现已启用 CMEK。

查看启用了 CMEK 的实例的密钥信息

成功创建 Looker (Google Cloud Core) 实例后,您可以检查是否已启用 CMEK。

如需查看 CMEK 是否已启用,请选择以下选项之一:

控制台

  1. 在 Google Cloud 控制台中,前往 Looker 实例页面。
  2. 点击实例名称以打开其详细信息页面。如果实例启用了 CMEK,则加密行会指明该实例使用的加密方式。客户管理的加密密钥 (CMEK) 字段会显示密钥标识符。

gcloud

gcloud looker instances describe INSTANCE_NAME --region=REGION --format config

替换以下内容:

  • INSTANCE_NAME:您的 Looker (Google Cloud Core) 实例的名称;它不与实例网址关联
  • REGION:创建实例的区域

此命令应返回 kmsKeyNamekmsKeyNameVersionkmsKeyState,以确认该实例配置了 CMEK。

使用 Cloud External Key Manager (Cloud EKM)

如需保护 Looker (Google Cloud Core) 实例中的数据,您可以使用在受支持的外部密钥管理合作伙伴中管理的密钥。如需了解详情,请参阅 Cloud External Key Manager 文档页面,包括注意事项部分。

准备好创建 Cloud EKM 密钥后,请参阅 Cloud External Key Manager 文档页面的工作原理部分。创建密钥后,请在创建 Looker (Google Cloud Core) 实例时提供密钥名称。

Google 无法控制外部密钥管理合作伙伴系统中密钥的可用性。

轮替密钥

您可能需要轮替密钥以提高安全性。每次轮替密钥时,系统都会创建一个新的密钥版本。如需详细了解密钥轮替,请参阅密钥轮替文档页面。

如果您轮替用于帮助保护您的 Looker (Google Cloud Core) 实例的密钥,仍需使用先前的密钥版本,才能访问该密钥版本使用期间进行的备份或导出。因此,Google 建议在轮替后至少将旧密钥版本保持启用 45 天,以确保这些密钥版本仍然可供访问。密钥版本默认保留,直到其停用或销毁。

停用和重新启用密钥版本

请参阅以下文档页面:

如果用于帮助保护 Looker (Google Cloud Core) 实例的密钥版本被停用,Looker (Google Cloud Core) 实例必须停止运行,清除其内存中可能存在的任何未加密敏感数据,然后等待密钥再次可用。具体过程如下:

  1. 用于帮助保护 Looker (Google Cloud Core) 实例的密钥版本已停用。
  2. Looker (Google Cloud Core) 实例在大约 15 分钟内检测到密钥版本已撤消、停止运行,并清除了内存中的所有加密数据。
  3. 实例停止运行后,调用 Looker API 会返回错误消息。
  4. 实例停止运行后,Looker (Google Cloud Core) 界面会返回一条错误消息。
  5. 如果您重新启用密钥版本,则必须手动触发实例的重启

如果您停用密钥版本且不想等待 Looker (Google Cloud Core) 实例自行停止,则可以手动触发实例重启,以便 Looker (Google Cloud Core) 实例立即检测已撤消的密钥版本。

销毁密钥版本

请参阅以下文档页面:

如果用于帮助保护 Looker (Google Cloud Core) 实例的密钥版本被销毁,Looker 实例将无法访问。必须删除此实例,您将无法再访问其数据。

问题排查

本部分介绍了在设置或使用启用了 CMEK 的实例时收到错误消息时应尝试的操作。

由于 Cloud KMS 错误以及缺少角色或权限,Looker (Google Cloud Core) 管理员操作(例如创建或更新)可能会失败。常见的失败原因包括:缺少 Cloud KMS 密钥版本、Cloud KMS 密钥版本已停用或销毁、IAM 权限不足,无法访问 Cloud KMS 密钥版本,或者 Cloud KMS 密钥版本与 Looker (Google Cloud Core) 实例位于不同区域。请使用以下问题排查表来诊断和解决常见问题。

CMEK 问题排查表

错误消息 可能的原因 问题排查策略
找不到每个产品、每个项目的服务帐号 服务帐号名称不正确。 确保您已为正确的用户项目创建了服务帐号。

转到“服务帐号”页面

无法为服务帐号授予访问权限 用户账号无权授予对此密钥版本的访问权限。

为您的用户或服务帐号添加 Organization Administrator 角色。

转到“IAM 账号”页面

Cloud KMS 密钥版本已被销毁 密钥版本会被销毁。 如果密钥版本被销毁,您将无法使用它来加密或解密数据。必须删除 Looker (Google Cloud Core) 实例。
Cloud KMS 密钥版本已停用 密钥版本已停用。

重新启用 Cloud KMS 密钥版本。

转到密钥管理页面

权限不足,无法使用 Cloud KMS 密钥 您在 Looker (Google Cloud Core) 实例上运行操作的用户或服务帐号缺少 cloudkms.cryptoKeyEncrypterDecrypter 角色,或者 Cloud KMS 密钥版本不存在。

为您的用户或服务帐号添加 cloudkms.cryptoKeyEncrypterDecrypter 角色。

转到“IAM 帐号”页面

如果您的帐号已拥有此角色,请参阅创建密钥环和密钥部分,了解如何创建新的密钥版本。然后再次完成实例创建步骤。

找不到 Cloud KMS 密钥 密钥版本不存在。 创建新的密钥版本,并再次完成实例创建步骤。请参阅创建密钥环和密钥部分。
Looker (Google Cloud Core) 实例和 Cloud KMS 密钥版本位于不同区域 Cloud KMS 密钥版本和 Looker (Google Cloud Core) 实例必须位于同一区域中。如果 Cloud KMS 密钥版本位于全球区域或多区域中,则密钥不起作用。 在要创建实例的同一区域中创建一个密钥版本,并再次完成实例创建步骤。请参阅创建密钥环和密钥部分。

后续步骤