本文档介绍了如何向虚拟机 (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 服务器之间的通信进行加密。
API 证书:对与部署交互的系统 发出的通信进行加密。
此设置可让您更灵活地管理这些证书,例如轮替证书。
创建 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.crt 和 server.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.crt 和 api.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.crt 和 client.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_address 和 zone 的值必须与部署配置中的值一致。网络必须解析 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
如需登录并与部署交互,请按以下步骤操作:
登录 Spanner Omni
spanner auth login admin \ --ca-certificate-file=certs/ca-api.crt \ --deployment-endpoint=ENDPOINT默认密码为
admin。Successfully logged in as "admin"创建数据库
spanner --deployment-endpoint=ENDPOINT databases create mydb --ca-certificate-file=certs/ca-api.crtCreating database...done.打开 SQL Shell
spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crtConnected. spanner>创建表并添加数据
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)验证数据
列出数据库:
spanner databases list --ca-certificate-file=certs/ca-api.crtNAME 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.crtConnected. 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
后续步骤
- 使用 客户端库和 JDBC 驱动程序 将应用与部署 连接起来。
- 管理用户和角色。