创建在虚拟机上使用 TLS 加密的部署

本文档介绍了如何向虚拟机 (VM) 上的 Spanner Omni 部署添加 TLS 加密。具有网络安全功能的部署使用传输层安全协议 (TLS) 1.3 来加密和验证部署内部以及与客户端之间的通信。Spanner Omni 提供双向 TLS (mTLS) 来增强安全性,其中双方在交换数据之前会先确定对方的真实性。客户端与服务器之间的 mTLS 是可选的,但 Spanner Omni 服务器之间通过 mTLS 进行通信。

Spanner Omni 的预览版不支持 TLS 加密,并且会在您创建部署 90 天后停止写入数据。如需抢先体验完整功能版,请与 Google 联系

准备工作

在开始之前,请确保您的环境满足以下要求:

  • 确保您拥有对部署中每台机器的 SSH 访问权限。通过此访问权限,您可以下载并运行 Spanner Omni 二进制文件。

  • 您的网络必须允许通过端口 15000 到 15025 进行 TCP 通信。

  • 每台机器都必须有足够的存储空间来托管部署所处理的数据。

  • 查看系统要求页面,确保您的设置符合要求。

  • 如果您在 vSphere 虚拟化平台上运行二进制文件,请停用 TSC 虚拟化。为此,请将 monitor_control.virtual_rdtsc = FALSE 设置添加到虚拟机的 .vmx 配置文件中。

第 1 步:创建不含 TLS 加密的部署

按照创建不加密的 Spanner Omni 虚拟机部署中的步骤操作。 验证未采用加密和安全功能的虚拟机部署是否正常运行。本页面假定您已创建包含三个可用区的区域性部署。

第 2 步:生成证书

您需要创建三组证书:

证书类型 说明
API 证书 API 证书有助于保护 Spanner API 服务器。
服务器证书 服务器证书有助于保护服务器间的通信。
客户端证书 最终用户或应用使用客户端证书来建立与 Spanner Omni 服务器的身份和信任关系。

这些证书由证书授权机构 (CA) 颁发。Spanner Omni 提供了用于创建 CA 和所有三种类型证书的工具。在您的某台设备上执行以下步骤。

您可以使用 Spanner Omni CLI 在工作站上创建这些证书,然后将证书文件传输到每个 Spanner Omni 服务器。如需了解详情,请参阅快速入门:使用 Spanner Omni CLI

如需生成证书,您必须完成以下步骤:

创建证书授权机构 (CA)

此授权机构是您在后续步骤中生成的所有客户端和服务器证书的根 CA。

spanner certificates create-ca --ca-certificate-directory=certs

certs 目录包含 CA 证书。创建此证书的副本,以用作 API 证书的 CA。

cp certs/ca.crt certs/ca-api.crt

目录 $HOME/.spanner/private-keys 包含 CA 的私钥。备份并保护此目录。有权访问私钥的用户可以签署任意证书,而信任自签名 CA 的客户端会信任这些证书。虽然您可以为所有证书使用同一 CA,但 API 证书和客户端证书必须使用同一 CA。您可以选择为 API 证书创建额外的 CA(或使用外部可信的 CA)。请务必在创建证书时,在以下步骤中使用正确的 CA。本文档对所有证书类型使用同一 CA。

生成服务器证书

您可以生成两种类型的服务器证书:

此设置可更灵活地管理这些证书,例如进行证书轮换。

创建 Spanner 服务器证书

Spanner Omni 服务器使用服务器证书来加密彼此之间的通信(服务器间通信)。

运行以下命令,创建服务器证书。将 SERVER_LIST 替换为以英文逗号分隔的 Spanner 服务器名称或后缀列表。

SERVER_NAMES=SERVER_LIST
spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

此命令会在 certs 目录中创建两个文件:server.crtserver.key

创建 API 证书

API 证书可加密与部署进行交互的系统的通信。为 API 和服务器间通信使用单独的证书,可让您独立管理和轮替每种证书。

运行以下命令,创建 API 证书。将 LB_DNS 替换为负载均衡器的 DNS。

SERVER_NAMES=LB_DNS
spanner certificates create-server --filename-prefix=api --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

此命令会在 certs 目录中再创建两个文件:api.crtapi.key。如果需要,您可以为 API 证书使用外部可信 CA。

将证书分发到所有服务器

certs 目录复制到部署中的所有其他服务器,以便使用网络安全功能启动这些服务器。

scp -r certs REMOTE_HOST:SPANNER_DIR/certs

第 3 步:生成客户端证书

您可以使用客户端证书对 Spanner 中的用户和应用进行身份验证。客户端证书可在客户端和服务器之间启用 mTLS。

客户端证书必须由 API 证书的同一 CA 签名,并且必须包含用于授权的用户名。此示例使用 admin 用户,该用户是每个数据库的默认用户。如需详细了解用户、角色和身份验证选项,请参阅 Spanner Omni 中的身份验证和授权

USERNAME=admin
spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs

此命令会在 clientcerts 目录中创建 client.crtclient.key 文件。将这些文件发送到连接到部署服务器的任何机器。

如果您计划将客户端证书与 Java 客户端库搭配使用,则必须以 PKCS#8 格式生成证书密钥。使用以下命令:

USERNAME=admin
spanner certificates create-client $USERNAME \
    --output-directory clientcerts \
    --ca-certificate-directory certs \
    --generate-pkcs8-key

第 4 步:重新启动服务器

生成证书并将其复制到部署中的所有服务器后,请重启每台服务器。

单服务器部署

对于单服务器部署,请运行以下命令:

nohup spanner start-single-server \
    --base-dir=BASE_DIR \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false &

服务器启动。如需与部署互动,请参阅第 7 步:与部署互动

横向扩容部署

对于横向扩容部署,请在每台机器上启动服务器。server_addresszone 的值必须与部署配置中的值一致。网络必须解析 server_address。服务器使用此端口进行内部通信。运行以下命令以启动根服务器:

nohup spanner start \
    --root \
    --server-address=HOST_NAME \
    --zone=ZONE_NAME \
    --base-dir=BASE_DIR \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false &

以下命令显示了一个包含特定值的示例:

nohup spanner start \
    --root \
    --server-address=rootserver1 \
    --zone=us-central-1a \
    --base-dir=./spanbasedir \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false &

如需为客户端启用 mTLS,请在启动服务器时使用 --enable-client-certificate-authentication=true 标志。

nohup spanner start \
    --root \
    --server-address=HOST_NAME \
    --zone=ZONE_NAME \
    --base-dir=BASE_DIR \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false \
    --enable-client-certificate-authentication=true &

现在,服务器已在每台机器上运行,您可以创建部署了。

第 5 步:创建采用 TLS 加密的部署

从某个根服务器运行 spanner deployment create 命令以创建部署。如需启用 TLS 加密,请使用 --base-dir 标志指定基本目录。确保您使用的 BASE_DIR 与上一步中启动根服务器时指定的 BASE_DIR 相同。

spanner deployment create \
    --config-file=deployment.yaml \
    --base-dir=BASE_DIR

每台机器的控制台都会显示消息,表明部署现在包含 TLS 加密。所有服务器都通过加密通道相互通信。

第 6 步:(可选)配置负载均衡器

如需在部署中的服务器之间管理和分配客户端流量,请设置负载均衡器。确保健康检查的负载均衡器配置使用 HTTPS 而不是 HTTP。使用以下配置详细信息:

参数
协议 TCP
后端 IP 服务器的 IP 地址。
端口 15000(这是默认端口。如果您在 --server-address 标志中使用了其他端口,请使用该端口。)
健康检查网址 https://IP_ADDRESS:15012/healthz
均衡策略 roundrobin(按顺序在服务器之间分配请求)

第 7 步:与部署互动

您可以使用 Spanner Omni CLI 从任何虚拟机与 Spanner Omni 部署进行交互。

您必须在每个命令中添加以下标志,以建立加密连接:

  • --ca-certificate-file=certs/ca-api.crt

如果您为客户端启用了 mTLS,还需在每个命令中添加以下标志:

  • --client-certificate-directory=clientcerts

如需登录并与部署互动,请按以下步骤操作:

  1. 登录 Spanner Omni

    spanner auth login admin \
        --ca-certificate-file=certs/ca-api.crt \
        --deployment-endpoint=ENDPOINT
    

    默认密码为 admin

    Successfully logged in as "admin"
    
  2. 创建数据库

    spanner --deployment-endpoint=ENDPOINT databases create mydb --ca-certificate-file=certs/ca-api.crt
    
    Creating database...done.
    
  3. 打开 SQL Shell

    spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crt
    
    Connected.
    spanner>
    
  4. 创建表格并添加数据

    spanner> create table names (nameId INT64 NOT NULL, name String(100)) Primary Key (nameId);
    Query OK, 0 rows affected (4.62 sec)
    
    spanner> insert names (nameId, name) values (1, "Jack");
    Query OK, 1 rows affected (0.18 sec)
    
  5. 验证数据

    列出数据库:

    spanner databases list --ca-certificate-file=certs/ca-api.crt
    
    NAME  STATE  VERSION_RETENTION_PERIOD  EARLIEST_VERSION_TIME  KMS_KEY_NAME  ENABLE_DROP_PROTECTION
    mydb  READY  1h                        2025-02-07T12:25:30Z                 false
    

    从表中获取数据:

    spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crt
    
    Connected.
    spanner> show tables;
    +----------------+
    | Tables_in_mydb |
    +----------------+
    | names          |
    +----------------+
    1 rows in set (0.14 sec)
    
    spanner> select * from names;
    +--------+--------+
    | nameId | name   |
    +--------+--------+
    | 1      | Jack   |
    +--------+--------+
    1 rows in set (18.69 msecs)
    

第 8 步:(可选)扩缩部署

您可以向可用区添加非根服务器,以扩充可用区的容量。为此,请按照第 2 步:生成证书中的说明为非根服务器生成服务器证书,然后使用以下命令启动服务器:

spanner start \
    --server-address=NON_ROOT_MACHINE \
    --join-servers=ROOT_SERVER1,ROOT_SERVER2,ROOT_SERVER3 \
    --zone=us-central1-a \
    --base-dir=./spandir \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false

后续步骤