使用客户管理的证书授权机构 (CA) 保护数据安全

您可以安全地加密客户端应用与 Memorystore for Redis Cluster 之间传输的所有数据。这是传输加密。通过使用传输中加密,所有 Redis 数据流量都将通过传输层安全协议 (TLS) 协议进行加密。这可确保在应用与 Memorystore for Redis Cluster 之间传输的所有数据保持机密且未被篡改。

启用传输加密后,Redis 客户端仅通过安全连接进行通信。未配置 TLS 的 Redis 客户端会被屏蔽。如果您选择使用传输加密,则要负责确保您的 Redis 客户端能够使用 TLS 协议。

使用传输加密的集群具有证书授权机构 (CA)。您可以使用 CA 对集群中机器的证书进行身份验证。

您可以使用的 CA 模式之一是客户管理的 CA。您可以在 Memorystore for Redis Cluster 中为集群使用客户管理的 CA。如果出于合规性考虑需要自行管理 CA,您可以选择此 CA 模式。使用此模式时,您必须设置自己的 CA 池,该 CA 池托管在 Certificate Authority Service 上。

您必须先使用 CA Service 在与集群相同的区域中创建一个 CA 池,并在该池中创建至少一个 CA,然后才能将集群配置为使用客户管理的 CA。CA 可以是根 CA从属 CA。您还可以在 CA Service 中创建从属 CA,然后将该从属 CA 链接到外部根 CA。

创建集群时,您需要指定 CA 池。在此配置中,项目特有的 Memorystore for Redis Cluster 服务账号具有使用 CA 池的权限。服务账号从该池中请求 CA,Memorystore for Redis Cluster 使用该 CA 为集群的服务器证书签名。

准备工作

在使用客户管理的 CA 模式之前,请确保满足以下要求。

所需的角色

如需获得创建证书授权机构 (CA) 池和证书授权机构 (CA) 所需的权限,请让您的管理员为您授予 CA Service 的 CA Service Operation Manager (roles/privateca.caManager) IAM 角色。

您也可以通过自定义角色或其他预定义角色来获取所需的权限。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

使用客户管理的 CA 的工作流

如需使用客户管理的 CA,工作流如下所示:

  1. 创建 CA 池。您必须先在 CA Service 中创建 CA 池,然后才能将集群配置为使用客户管理的 CA。此池必须与您的集群位于同一区域。
  2. 在 CA 池中创建 CA。创建 CA 池后,您必须使用 CA Service 在该池中创建至少一个 CA。
  3. 向 Memorystore for Redis Cluster 服务账号委托权限,以使用您创建的 CA 池中的 CA 颁发服务器证书。
  4. 创建集群以使用客户管理的 CA。

创建 CA 池

您可以在计划创建 Memorystore for Redis Cluster 中的集群的同一项目中创建 CA 池,也可以在其他项目中创建 CA 池。不过,如果您在其他项目中创建证书授权机构 (CA) 池,VPC Service Controls 可能会根据组织政策阻止您创建任何集群。如需解决此问题,请确保托管 CA 池和 CA 的项目以及托管 Memorystore for Redis Cluster 的项目属于同一服务边界。如需了解详情,请参阅服务边界详情和配置以及管理服务边界

如需创建 CA 池,请按照创建 CA 池中的说明操作。您可以接受 CA 池的默认值,并使用以下必需的配置设置:

  • 在您计划创建集群的同一区域中创建 CA 池。如需查看 Memorystore for Redis Cluster 支持的区域列表,请参阅 Memorystore for Redis Cluster 位置
  • 允许基于配置的证书请求。
  • 允许在主题备用名称 (SAN) 中使用 DNS 名称。配置 CA 池的身份限制条件时,请勿对 DNS 名称格式设置任何限制,这些限制可能会与 Memorystore for Redis Cluster 添加到 SAN 中的条目冲突。

在 CA 池中创建 CA

在您创建的 CA 池中至少创建一个 CA。

您可以创建根 CA 或从属 CA。

如需创建根 CA,请按照创建根 CA 中的说明操作。您可以接受 CA 的默认值,但必须确保 CA 处于已启用状态时创建。

配置 CA 密钥大小和算法时,您可以选择任意密钥大小和算法。

如果您创建从属 CA,则需要先创建并配置根 CA。

为服务账号提供对 CA 池的访问权限

为确保 Memorystore for Redis Cluster 服务账号具有为集群请求证书并签名的权限,请向服务账号授予您创建的 CA 池的 roles/privateca.certificateRequester 角色。

此服务账号格式如下:
service-PROJECT_NUMBER@cloud-redis.iam.gserviceaccount.com。将 PROJECT_NUMBER 替换为您的Google Cloud 项目的项目编号。

gcloud

如需向服务账号授予对 CA 池的访问权限,请使用 gcloud privateca pools add-iam-policy-binding 命令。

gcloud privateca pools add-iam-policy-binding CA_POOL_ID \
--project=PROJECT_ID \
--location=REGION_ID \
--member serviceAccount:SERVICE_ACCOUNT_NAME \
--role=roles/privateca.certificateRequester

进行以下替换:

  • CA_POOL_ID:您创建的 CA 池的 ID。
  • PROJECT_ID:您要在其中创建集群的 Google Cloud 项目的 ID。
  • REGION_ID:CA 池所在的区域。
  • SERVICE_ACCOUNT_NAME:Memorystore for Redis Cluster 服务账号的名称。此服务账号的项目编号与 PROJECT_ID 关联的项目编号相同。

创建使用客户管理的 CA 的集群

控制台

按照创建实例中的步骤操作。

gcloud

如需创建使用客户管理的 CA 的集群,请使用 gcloud redis clusters create 命令。

gcloud redis clusters create CLUSTER_ID \
--region=REGION_ID \
--network=NETWORK \
--replica-count=REPLICA_COUNT \
--node-type=NODE_TYPE \
--shard-count=SHARD_COUNT \
--transit-encryption-mode=server-authentication \
--server-ca-mode=customer-managed-cas-ca \
--server-ca-pool="projects/CA_POOL_PROJECT_ID/locations/REGION_ID/caPools/CA_POOL_ID"

进行以下替换:

  • CLUSTER_ID:您要创建的集群的 ID。集群 ID 必须包含 1 到 63 个字符,并且只能使用小写字母、数字或连字符。必须以小写字母开头,并以小写字母或数字结尾。

  • REGION_ID:您希望集群所在的区域。 您必须在所创建的 CA 池所在的区域中创建集群。

  • NETWORK:用于创建集群的网络。必须采用以下格式:projects/NETWORK_PROJECT_ID/global/networks/NETWORK_ID。您使用的网络 ID 必须与服务连接政策使用的网络 ID 相符。否则,您将无法创建集群。

  • REPLICA_COUNT:副本数(每个分片)。可接受的值为 0-5

  • NODE_TYPE:节点类型。接受的值包括:

    • redis-shared-core-nano
    • redis-standard-small
    • redis-highmem-medium
    • redis-highmem-xlarge
  • SHARD_COUNT:集群中的分片数。分片数决定了用于存储集群数据的总内存容量。如需详细了解集群规范,请参阅集群和节点规范

  • CA_POOL_PROJECT_ID:您创建的 CA 池的 ID。

  • REGION_ID:CA 池所在的区域。您要创建的集群和 CA 池必须位于同一区域。

  • CA_POOL_ID:您创建的 CA 池的 ID。

server-ca-mode 参数表示集群的 CA 模式。对于客户管理的 CA,customer-managed-cas-ca 是相应参数的值。 如果您不使用此参数,则默认 CA 模式为按实例。

例如:

gcloud redis clusters create my-cluster \
--region=us-central1 \
--network=projects/my-network-project/global/networks/default \
--replica-count=1 \
--node-type=redis-highmem-medium \
--shard-count=3 \
--transit-encryption-mode=server-authentication \
--server-ca-mode=customer-managed-cas-ca \
--server-ca-pool="projects/my-CA-pool-project/locations/us-central1/caPools/my-CA-pool"

轮替集群的服务器证书

除了 Memorystore for Redis Cluster 每周进行一次服务器端证书轮替之外,您还可以按需轮替证书。

gcloud

如需轮替集群中所有机器的服务器证书,请使用 gcloud redis clusters update 命令。

gcloud redis clusters update CLUSTER_ID \
--region=REGION_ID \
--rotate-server-certificate

进行以下替换:

  • CLUSTER_ID:包含您要轮替服务器证书的机器的集群的 ID
  • REGION_ID:集群所在的区域

例如:

gcloud redis clusters update my-cluster \
--region=us-central1 \
--rotate-server-certificate

限制

将客户管理的 CA 与 Memorystore for Redis Cluster 搭配使用时,存在以下限制:

  • 为集群配置客户管理的 CA 后,您将无法修改该配置。例如,您无法更改集群的 CA 池的 ID。
  • 请勿删除客户管理的 CA 池或撤消与 CA 关联的服务账号权限。如果这样做,服务器证书将无法轮换,并且会过期。因此,您的客户端应用将无法连接到集群。

问题排查

本部分列出了在使用客户管理的 CA 时可能会收到的错误消息,并提供了有关如何排查这些消息的提示。

错误消息 原因 问题排查
FAILED_PRECONDITION: GetClusterCertificateAuthority not supported for customer-managed CAs 如果您使用的是客户管理的 CA,则无法使用 Memorystore for Redis Cluster 来检索 CA 证书。 如需获取客户管理的 CA 的 CA 证书,您必须使用 CA Service。
Server certificate rotation can only be triggered for customer-managed CAs. 您尝试为集群轮替服务器证书,但集群的 CA 模式为“每个实例”或“共享”。 除非您为集群使用的模式是客户管理的,否则您无法轮替服务器证书。
Invalid format for server CA pool: {CA pool resource}. Expected projects/{project}/locations/{location}/caPools/{caPool}. 您用于创建集群的 CA 池的格式无效。 对于 CA 池,请使用以下格式:
projects/CA_POOL_PROJECT_ID/locations/REGION_ID/ caPools/CA_POOL_ID
The instance/cluster's server CA pool must be in the same region as the instance/cluster. CA Pool region: {CA pool region}, Instance/cluster region: {cluster region}. 您正尝试创建位于不同于 CA 池的区域中的集群。 确保您要创建的集群和 CA 池位于同一区域。
Request is prohibited by organization's policy for CA Pool {CA pool ID}. 托管 CA 池的 Google Cloud 项目和托管集群的项目不在同一服务边界内。 配置 VPC Service Controls,使项目属于同一服务边界。
Permission privateca.certificates.create denied on {CA pool ID}. Make sure that you granted the roles/privateca.certificateRequester role to the service account {P4SA email}. Memorystore for Redis Cluster 服务账号对 CA 池没有 roles/privateca.certificateRequester 角色。因此,Memorystore for Redis Cluster 无法生成服务器证书。 roles/privateca.certificateRequester 角色授予服务账号。如需了解详情,请参阅为服务账号授予对 CA 池的访问权限
Resource {CA pool ID} not found. Memorystore for Redis Cluster 找不到您在尝试创建集群时指定的 CA 池。 检查 CA 池的项目 ID、位置和名称。
There are no enabled CAs in the CaPool {CA pool ID}. Please ensure that there is at least one enabled Certificate Authority to issue a certificate. CA 池中没有已启用的 CA。Memorystore for Redis Cluster 无法为集群生成服务器证书。 确保您在 CA 池中至少创建一个 CA,并且该 CA 处于已启用状态。
Quota exhausted for CA Service. Check quotas for the project hosting the CA Pool: {CA pool ID}. 您在托管 CA 池的 Google Cloud 项目中超出了 CA 服务的配额。Memorystore for Redis Cluster 无法执行需要此服务的操作。 检查项目中 CA Service 的配额。如需了解详情,请参阅配额和限制
server_ca_pool must be provided when server_ca_mode is SERVER_CA_MODE_CUSTOMER_MANAGED_CAS_CA. 您正在尝试创建使用客户管理的 CA 模式的集群。不过,您未提供有关 CA 池的信息。 指定 CA 池的项目 ID、位置和名称。
server_ca_pool must not be provided when server_ca_mode is not SERVER_CA_MODE_CUSTOMER_MANAGED_CAS_CA. 您尝试创建使用按实例或共享 CA 模式的集群。这些 CA 模式不使用 server_ca_pool 参数。 除非 CA 模式为客户管理模式,否则您无法使用此参数。