Apigee 加密密钥简介

本页面适用于 Apigee,但不适用于 Apigee Hybrid

查看 Apigee Edge 文档。

本部分介绍加密密钥的类型以及如何创建加密密钥。

在 Apigee 设置过程中,您需生成以下 Cloud Key Management Service 加密密钥:

密钥类型 创建时间 说明
控制平面加密密钥

Google Cloud 控制台:

命令行界面 (CLI):

使用数据驻留时,Apigee 会使用此密钥对租户项目的 BigQuery 中存储的 Analytics 数据进行加密。

加密 API 代理、目标服务器、truststore 和密钥库、分析数据,以及跨运行时共享的任何其他内容。

Apigee 会要求您提供两个控制平面 CMEK 密钥。 此密钥和一个 API 使用方数据加密密钥

控制平面加密密钥的位置应与控制平面位置一致。

API 使用方数据加密密钥

Google Cloud 控制台:

命令行界面 (CLI):

使用数据驻留时,除了控制平面加密密钥之外,Apigee 还需要单区域密钥,以用于仅在单个区域提供的服务。例如,Dataflow 和 Cloud SQL。

API 使用方数据加密密钥的位置应在控制平面位置内。

运行时数据库加密密钥

Google Cloud 控制台:

命令行界面 (CLI):

加密应用数据(如 KVM、缓存和客户端密钥),然后将其存储在数据库中。

每个组织都有一个运行时数据库加密密钥 - 组织中的所有实例/区域共享相同的运行时数据库加密密钥。

运行时数据库加密密钥支持所有支持 Cloud HSMCloud EKM 的 Cloud KMS 位置。创建此密钥时,Google 建议您使用多区域位置(例如 useurope)或双区域位置eur5nam4)。

使用数据驻留时,运行时数据库加密密钥的位置应在控制平面位置内。

磁盘加密密钥

Google Cloud 控制台:

命令行界面 (CLI):

在将运行时实例数据写入磁盘之前对其进行加密。

已加密的数据类型包括密钥管理系统 (KMS);键值对映射 (KVM);配额定义、存储桶和计数器;以及所有已缓存的数据。KMS 数据包括 API 产品、开发者、开发者应用、OAuth 令牌(包括访问令牌、刷新令牌和授权代码)和 API 密钥。

此密钥与运行时实例位于同一区域;创建新密钥时,请将密钥的位置与运行时实例的位置保持一致。

每个实例/区域组合都有自己的磁盘加密密钥。

要点

创建磁盘和运行时数据库加密密钥时,请注意以下事项:

  • Apigee 运行时数据库加密密钥的位置支持所有支持 Cloud HSMCloud EKM 的 Cloud KMS 位置。
  • 磁盘加密密钥的位置必须与使用该密钥的运行时实例的位置一致。
  • 这两个密钥的位置一经设置便无法更改。
  • 所有密钥都必须位于密钥环中。
  • 不同类型的密钥必须位于不同的密钥环中;磁盘加密密钥不能与运行时数据库加密密钥位于同一密钥环中。
  • 密钥必须具有一个 purpose。如果您要使用命令行生成新密钥,请将 purpose 设置为 encryption。如果您使用 Google Cloud 控制台,请选择对称加密/解密来实现此目的。
  • 这些密钥由密钥路径定义,该路径使用以下格式:
    projects/PROJECT_ID/locations/KEY_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME

列出现有密钥

如果您已经为 Apigee 创建新的 Cloud KMS 加密密钥,则可以在设置期间使用这些密钥,而无需创建新密钥。

如需列出密钥环中的所有 KMS 密钥,请执行以下操作:

执行 gcloud kms keys list 命令:

gcloud kms keys list --keyring KEY_RING_NAME --location KEY_RING_LOCATION

替换以下内容:

  • KEY_RING_NAME:密钥环的名称。例如 my-key-ring
  • KEY_RING_LOCATION:密钥环的物理位置,例如 us-west1

或者,您可以在 Google Cloud 控制台中查看密钥

在命令行中生成新密钥

您可以在命令行或 Google Cloud 控制台中创建密钥环和密钥。

每种类型的密钥都必须有自己的密钥环。例如,磁盘加密密钥可以存储在一个密钥环中,但您的运行时数据库加密密钥必须存储在单独的密钥环中。

以下步骤介绍了如何创建密钥环和密钥,以及如何授予 Apigee Service Agent 使用新密钥的访问权限。为控制平面(如果使用数据驻留)、运行时数据库和运行时磁盘创建密钥环和密钥。

  1. 使用 gcloud kms keyrings create 命令创建新的密钥环:

    控制平面

    启用数据驻留后,为控制平面创建一个密钥环,然后为使用方数据区域创建另一个密钥环。

    gcloud kms keyrings create CONTROL_PLANE_KEY_RING_NAME \
    --location CONTROL_PLANE_LOCATION \
    --project PROJECT_ID
    gcloud kms keyrings create CONSUMER_DATA_KEY_RING_NAME \
    --location CONSUMER_DATA_REGION \
    --project PROJECT_ID

    替换以下内容:

    • CONTROL_PLANE_KEY_RING_NAME:控制平面密钥环名称。
    • CONTROL_PLANE_LOCATION:将存储 Apigee 控制平面数据的物理位置。
    • PROJECT_ID:Google Cloud 项目 ID。
    • CONSUMER_DATA_KEY_RING_NAME:使用方数据密钥环名称。
    • CONSUMER_DATA_REGION:控制平面区域的子区域。您必须同时指定 CONTROL_PLANE_LOCATION 和 CONSUMER_DATA_REGION。

    运行时数据库

    gcloud kms keyrings create RUNTIMEDB_KEY_RING_NAME \
      --location RUNTIMEDB_KEY_LOCATION \
      --project PROJECT_ID

    替换以下内容:

    • RUNTIMEDB_KEY_RING_NAME:您要创建的数据库密钥环的名称。
    • RUNTIMEDB_KEY_LOCATION:数据库密钥环的物理位置。
    • PROJECT_ID:Google Cloud 项目 ID。

    Apigee 加密密钥的位置支持所有支持 Cloud HSMCloud EKM 的 Cloud KMS 位置。

    运行时磁盘

    gcloud kms keyrings create RUNTIMEDISK_KEY_RING_NAME \
      --location RUNTIMEDISK_KEY_LOCATION \
      --project PROJECT_ID

    替换以下内容:

    • RUNTIMEDISK_KEY_RING_NAME:您要创建的磁盘密钥环的名称。
    • RUNTIMEDISK_KEY_LOCATION:磁盘密钥环的物理位置。
    • PROJECT_ID:Google Cloud 项目 ID。

    验证磁盘密钥环是否设置为与实例相同的位置。每个实例和密钥环都应该有自己的位置。

    gcloud kms keyrings list \
    --location  \
    --project $PROJECT_ID

    gcloud kms keyrings describe $DISK_KEY_RING_NAME \
    --location  \
    --project $PROJECT_ID
  2. 密钥环的名称在您的组织中必须是唯一的。如果您创建了其他区域,这些区域的密钥环名称不能与现有密钥环名称相同。

  3. 使用 kms keys create 命令创建密钥:

    控制平面

    启用数据驻留后,为控制平面创建一个密钥环,然后为使用方数据区域创建另一个密钥环。

    gcloud kms keys create CONTROL_PLANE_KEY_NAME \
    --keyring CONTROL_PLANE_KEY_RING_NAME \
    --location CONTROL_PLANE_LOCATION \
    --purpose "encryption" \
    --project PROJECT_ID
    gcloud kms keys create CONSUMER_DATA_KEY_NAME \
    --keyring CONSUMER_DATA_KEY_RING_NAME \
    --location CONSUMER_DATA_REGION \
    --purpose "encryption" \
    --project PROJECT_ID

    替换以下内容:

    • CONTROL_PLANE_KEY_NAME:控制平面密钥名称。
    • CONTROL_PLANE_KEY_RING_NAME:控制平面密钥环名称。
    • CONTROL_PLANE_LOCATION:将存储 Apigee 控制平面数据的物理位置。
    • PROJECT_ID:Google Cloud 项目 ID。
    • CONSUMER_DATA_KEY_NAME:使用方数据密钥名称。
    • CONSUMER_DATA_KEY_RING_NAME:使用方数据密钥环名称。
    • CONSUMER_DATA_REGION:控制平面区域的子区域。您必须同时指定 CONTROL_PLANE_LOCATION 和 CONSUMER_DATA_REGION。

    运行时数据库

    gcloud kms keys create RUNTIMEDB_KEY_NAME \
      --keyring RUNTIMEDB_KEY_RING_NAME \
      --location RUNTIMEDB_KEY_LOCATION \
      --purpose "encryption" \
      --project PROJECT_ID

    替换以下内容:

    • RUNTIMEDB_KEY_NAME:您要创建的数据库密钥的名称。
    • RUNTIMEDB_KEY_RING_NAME:您要创建的数据库密钥环的名称。
    • RUNTIMEDB_KEY_LOCATION:数据库密钥环的物理位置。
    • PROJECT_ID:Google Cloud 项目 ID。

    运行时磁盘

    gcloud kms keys create RUNTIMEDISK_KEY_NAME \
      --keyring RUNTIMEDISK_KEY_RING_NAME \
      --location RUNTIMEDISK_KEY_LOCATION \
      --purpose "encryption" \
      --project PROJECT_ID

    替换以下内容:

    • RUNTIMEDISK_KEY_NAME:您要创建的磁盘密钥的名称。
    • RUNTIMEDISK_KEY_RING_NAME:您要创建的磁盘密钥环的名称。
    • RUNTIMEDISK_KEY_LOCATION:磁盘密钥环的物理位置。
    • PROJECT_ID:Google Cloud 项目 ID。

    此命令会创建密钥并将其添加到密钥环中。

    在引用密钥时,请使用密钥 ID

  4. 使用 gcloud kms keys add-iam-policy-binding 命令向 Apigee Service Agent 授予使用新密钥的权限:

    控制平面

    启用数据驻留后,为控制平面创建一个密钥环,然后为使用方数据区域创建另一个密钥环。

    gcloud kms keys add-iam-policy-binding CONTROL_PLANE_KEY_NAME \
    --location CONTROL_PLANE_LOCATION \
    --keyring CONTROL_PLANE_KEY_RING_NAME \
    --member "serviceAccount:service-PROJECT_NUMBER@gcp-sa-apigee.iam.gserviceaccount.com" \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
    --project PROJECT_ID
    
    gcloud kms keys add-iam-policy-binding CONSUMER_DATA_KEY_NAME \
    --location CONSUMER_DATA_REGION \
    --keyring CONSUMER_DATA_KEY_RING_NAME \
    --member "serviceAccount:service-PROJECT_NUMBER@gcp-sa-apigee.iam.gserviceaccount.com" \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
    --project PROJECT_ID
    

    替换以下内容:

    • CONTROL_PLANE_KEY_NAME:控制平面密钥名称。
    • CONTROL_PLANE_LOCATION:将存储 Apigee 控制平面数据的物理位置。
    • CONTROL_PLANE_KEY_RING_NAME:控制平面密钥环名称。
    • PROJECT_NUMBER:Google Cloud 项目编号。
    • PROJECT_ID:Google Cloud 项目 ID。
    • CONSUMER_DATA_KEY_NAME:使用方数据密钥名称。
    • CONSUMER_DATA_REGION:控制平面区域的子区域。您必须同时指定 CONTROL_PLANE_LOCATION 和 CONSUMER_DATA_REGION。
    • CONSUMER_DATA_KEY_RING_NAME:使用方数据密钥环名称。

    运行时数据库

    gcloud kms keys add-iam-policy-binding RUNTIMEDB_KEY_NAME \
      --location RUNTIMEDB_KEY_LOCATION \
      --keyring RUNTIMEDB_KEY_RING_NAME \
      --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-apigee.iam.gserviceaccount.com \
      --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
      --project PROJECT_ID

    替换以下内容:

    • RUNTIMEDB_KEY_NAME:您要创建的数据库密钥的名称。
    • RUNTIMEDB_KEY_RING_NAME:您要创建的数据库密钥环的名称。
    • RUNTIMEDB_KEY_LOCATION:数据库密钥环的物理位置。
    • PROJECT_NUMBER:Google Cloud 项目编号。
    • PROJECT_ID:Google Cloud 项目 ID。

    运行时磁盘

    gcloud kms keys add-iam-policy-binding RUNTIMEDISK_KEY_NAME \
      --location RUNTIMEDISK_KEY_LOCATION \
      --keyring RUNTIMEDISK_KEY_RING_NAME \
      --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-apigee.iam.gserviceaccount.com \
      --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
      --project PROJECT_ID

    替换以下内容:

    • RUNTIMEDISK_KEY_NAME:您要创建的磁盘密钥的名称。
    • RUNTIMEDISK_KEY_RING_NAME:您要创建的磁盘密钥环的名称。
    • RUNTIMEDISK_KEY_LOCATION:磁盘密钥环的物理位置。
    • PROJECT_NUMBER:Google Cloud 项目编号。
    • PROJECT_ID:Google Cloud 项目 ID。

    此命令将密钥绑定到 Apigee Service Agent。

    成功完成此请求后,gcloud 的响应将如下所示:

    Updated IAM policy for key [runtime].
    bindings:
    - members:
    - serviceAccount:service-1234567890@gcp-sa-apigee.iam.gserviceaccount.com
    role: roles/cloudkms.cryptoKeyEncrypterDecrypter
    etag: BwWqgEuCuwk=
    version: 1

    如果您收到如下错误:

    INVALID_ARGUMENT: Role roles/cloudkms.cryptokms.cryptoKeyEncrypterDecrypter is not supported for this resource.

    请务必使用项目编号,而不是服务账号电子邮件地址中的项目名称。

    如需验证密钥是否绑定到 Apigee Service Agent,请执行以下操作:

    gcloud kms keys get-iam-policy $DISK_KEY_NAME \
      --keyring $DISK_KEY_RING_NAME \
      --location  \
      --project $PROJECT_ID

    gcloud kms keys describe $DISK_KEY_NAME \
      --keyring $DISK_KEY_RING_NAME \
      --location  \
      --project $PROJECT_ID

使用 Google Cloud 控制台生成新密钥

您可以按照创建对称加密密钥所述,使用控制台生成新密钥。

使用控制台创建新密钥时:

  • 对于运行时数据库加密密钥,请将位置设置为支持 Cloud HSMCloud EKM 的任何 Cloud KMS 位置。界面不允许您为该密钥选择任何其他位置,因此其会匹配您在密钥环中选择的内容。
  • 创建密钥后,通过点击该密钥旁边的 更多,然后选择复制资源名称,在加密密钥窗格中获取密钥路径。

获取密钥 ID

使用 Cloud KMS API 或 Google Cloud CLI 引用 Cloud Key Management Service 资源时,请使用资源 ID。您可以使用 gcloud kms keys list 命令获取密钥 ID:

控制平面

启用数据驻留后,控制平面有一个密钥环,使用方数据区域有另一个密钥环。

gcloud kms keys list \
--location=CONTROL_PLANE_LOCATION \
--keyring=CONTROL_PLANE_KEY_RING_NAME \
--project=PROJECT_ID

gcloud kms keys list \
--location=CONSUMER_DATA_REGION \
--keyring=CONSUMER_DATA_KEY_RING_NAME \
--project=PROJECT_ID

密钥 ID 的语法如下所示(类似于文件路径):

projects/PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/CONTROL_PLANE_KEY_RING_NAME/cryptoKeys/CONTROL_PLANE_KEY_NAME

运行时数据库

gcloud kms keys list \
--location=RUNTIMEDB_KEY_LOCATION \
--keyring=RUNTIMEDB_KEY_RING_NAME \
--project=PROJECT_ID

密钥 ID 的语法如下所示(类似于文件路径):

projects/PROJECT_ID/locations/RUNTIMEDB_KEY_LOCATION/keyRings/RUNTIMEDB_KEY_RING_NAME/cryptoKeys/RUNTIMEDB_KEY_NAME

运行时磁盘

gcloud kms keys list \
  --location=RUNTIMEDISK_KEY_LOCATION \
  --keyring=RUNTIMEDISK_KEY_RING_NAME \
  --project=PROJECT_ID

密钥 ID 的语法如下所示(类似于文件路径):

projects/PROJECT_ID/locations/RUNTIMEDISK_KEY_LOCATION/keyRings/RUNTIMEDISK_KEY_RING_NAME/cryptoKeys/RUNTIMEDISK_KEY_NAME

例如:

NAME: projects/my-project/locations/us-west1/keyRings/my-key-ring/cryptoKeys/my-key
PURPOSE: ENCRYPT_DECRYPT
ALGORITHM: GOOGLE_SYMMETRIC_ENCRYPTION
PROTECTION_LEVEL: SOFTWARE
LABELS:
PRIMARY_ID: 1
PRIMARY_STATE: ENABLED

您还可以在 Google Cloud 控制台中获取密钥 ID。如需了解详情,请参阅获取 Cloud KMS 资源 ID