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

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

Spanner Omni 的 预览版 不支持 TLS 加密。如需获取可让您创建具有 TLS 加密的部署的功能 ,请与 Google 联系,申请提前访问 Spanner Omni 的完整版 。

准备工作

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

  • 确保您拥有对部署中每台机器的 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 命令:

spanner deployment create --config-file=deployment.yaml

每台机器的控制台都会显示消息,表明部署现在包含 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

后续步骤