为 Looker (Google Cloud Core) 启用 CMEK

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

如需大致了解 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 实例大约每 5 分钟发出一次对 KMS 的调用,以验证密钥是否仍然有效。

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

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

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

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

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

  1. 设置环境
  2. 仅限 Google Cloud CLI、Terraform 和 API 用户:如果项目尚未设置 Looker 服务账号,请为需要客户管理的加密密钥的每个项目创建一个服务账号
  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. 选择与 CMEK 相同的位置
    2. 版本设置为企业版嵌入
    3. 启用客户管理的密钥配置。
    4. 按名称或 ID 添加客户管理的加密密钥。

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

准备工作

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

  1. 在 Google Cloud 控制台的“项目选择器”页面上,选择或创建 Google Cloud 项目注意:如果您不打算保留在此过程中创建的资源,请创建新的项目,而不要选择现有的项目。完成本教程介绍的步骤后,您可以删除所创建的项目,这将移除与该项目关联的资源。

    前往项目选择器

  2. 确保您的 Google Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能
  3. 安装 Google Cloud CLI。
  4. 如需初始化 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 核心)实例,并且尚未为 Looker 将要驻留的 Google Cloud 项目创建 Looker 服务账号,则需要为该项目创建服务账号。如果您要在项目中创建多个 Looker(Google Cloud 核心)实例,则同一个服务账号适用于该项目中的所有 Looker(Google Cloud 核心)实例,并且只需创建一次服务账号。如果您使用控制台创建实例,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 核心)实例,请按照获取 Cloud KMS 资源 ID 文档页面上的说明,找到您刚刚创建的密钥串和密钥的资源 ID。复制或记下密钥 ID (KMS_KEY_ID) 和密钥的位置,以及密钥环的 ID (KMS_KEYRING_ID)。您在向服务账号授予密钥访问权限时需要此信息。

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

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

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

您必须对要使用的密钥具有 Cloud KMS 管理员 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 设置的 Looker (Google Cloud Core) 实例,请选择以下任一选项:

控制台

  1. 确保您对用于 CMEK 的密钥具有 Cloud KMS CryptoKey Encrypter/Decrypter IAM 角色
  2. 创建实例页面的版本部分中,您必须选择 EnterpriseEmbed 版本才能使用 CMEK。
  3. 创建实例页面的加密部分中,选择客户管理的加密密钥 (CMEK) 单选按钮。此时将显示选择客户管理的密钥下拉字段。
  4. 选择客户管理的密钥字段中,设置要使用的密钥。密钥必须位于密钥环中,并且该密钥环的位置应与您要创建的 Looker (Google Cloud Core) 实例位于同一区域,否则实例创建将失败。您可以通过以下两种方法之一选择密钥:
    1. 从下拉列表中选择密钥名称:下拉列表中会显示 Google Cloud 项目中的可用密钥。选择密钥后,点击 OK
    2. 输入密钥的资源 ID点击文本没有看到您的密钥?输入密钥资源 ID,该 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:VPC 内的 IP 地址范围,Google 将在该范围内为您的 Looker (Google Cloud Core) 实例预配子网。如果您要创建专用 IP 实例,则必须设置此字段。

您可以添加以下标志:

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

Terraform

使用以下 Terraform 资源预配具有专用网络连接企业版 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. 大约 15 分钟内,Looker(Google Cloud 核心)实例会检测到密钥版本已被撤消,停止运行并清除内存中的所有加密数据。
  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 核心)管理员操作(例如创建或更新)可能会失败。常见的失败原因如下:缺少 Cloud KMS 密钥版本;Cloud KMS 密钥版本已被停用或被销毁;IAM 权限不足,无法访问 Cloud KMS 密钥版本;或者 Cloud KMS 密钥版本与 Looker(Google Cloud 核心)实例位于不同的区域。请使用以下问题排查表格来诊断和解决常见问题。

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 核心)实例必须位于同一区域。如果 Cloud KMS 密钥版本位于全球区域或多区域中,则密钥不起作用。 在要创建实例的同一区域中创建密钥版本,然后重新完成实例创建步骤。请参阅创建密钥环和密钥部分。

后续步骤