本文档介绍了如何向虚拟机 (VM) 上的 Spanner Omni 部署添加 TLS 加密。具有网络安全功能的部署使用传输层安全协议 (TLS) 1.3 来加密和验证部署内部以及与客户端之间的通信。Spanner Omni 提供双向 TLS (mTLS) 以增强安全性,其中双方在交换数据之前会先确定对方的真实性。客户端与服务器之间的 mTLS 是可选的,但 Spanner Omni 服务器之间通过 mTLS 进行通信。
准备工作
在开始之前,请确保您的环境满足以下要求:
确保您拥有对部署中每台机器的 SSH 访问权限。通过此访问权限,您可以下载并运行 Spanner Omni 二进制文件。
您的网络必须允许通过端口 15000 到 15030 进行 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 步:启动服务器
生成证书并将其复制到部署中的所有服务器后,启动每个服务器。在每个服务器上创建一个基本目录,用于存储数据、元数据和日志。如果服务器需要重启,请指定同一目录以保持连续性。
单服务器部署
如需开始进行加密的单服务器部署,请为初始 admin 用户创建密码文件,并使用受支持的身份验证方法和证书启动服务器。
创建密码文件,并将权限设置为 600,以便只有其所有者可以读取该文件:
printf '%s' 'PASSWORD' > admin_password.txt chmod 600 admin_password.txt密码必须符合以下要求:
- 长度介于 8 到 32 个字符之间。
- 至少一个大写字符。
- 至少包含一个小写字符。
- 至少一个数字。
- 至少一个特殊字符。
启动已配置 TLS 和身份验证的单个服务器:
nohup spanner start-single-server \ --base-dir=BASE_DIR \ --certificate-directory=${HOME}/.spanner/certs \ --auth-methods=password,client-certificate \ --password-protocol=opaque \ --initial-admin-password-file=admin_password.txt &在初始启动时,
spanner start-single-server会设置受支持的身份验证方法和密码协议,并使用指定的密码文件创建初始管理员user with the角色/spanner.admin` 角色。
如需了解如何与部署互动,请参阅第 7 步:与部署互动。
横向扩容部署
对于横向扩缩部署,请在每台机器上启动服务器。server-address 和 zone 的值必须与部署配置中的值一致。网络必须解析 server-address。服务器使用 server-address 进行内部通信。运行以下命令以启动根服务器:
nohup spanner start \
--root \
--server-address=HOST_NAME \
--zone=ZONE_NAME \
--base-dir=BASE_DIR \
--certificate-directory=${HOME}/.spanner/certs &
以下命令显示了一个包含特定值的示例:
nohup spanner start \
--root \
--server-address=rootserver1 \
--zone=us-central-1a \
--base-dir=./spanbasedir \
--certificate-directory=${HOME}/.spanner/certs &
现在,服务器已在每台机器上运行,您可以创建部署了。
第 5 步:创建采用 TLS 加密的部署
如需创建部署,请按以下步骤操作:
创建一个密码文件,其中包含默认
admin用户的密码,并将其权限设置为 600(仅可由其所有者读取):printf '%s' 'PASSWORD' > admin_password.txt chmod 600 admin_password.txt密码必须符合以下要求:
- 长度介于 8 到 32 个字符之间。
- 至少一个大写字符。
- 至少包含一个小写字符。
- 至少一个数字。
- 至少一个特殊字符。
确保
deployment.yaml包含您选择的身份验证方法和密码协议:deployment_settings: security_settings: authentication_methods: - AUTHENTICATION_METHOD_PASSWORD - AUTHENTICATION_METHOD_CLIENT_CERTIFICATE password_authentication_protocol: PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE您可以指定以下一种或多种身份验证方法:
AUTHENTICATION_METHOD_PASSWORD:密码身份验证AUTHENTICATION_METHOD_CLIENT_CERTIFICATE:客户端证书身份验证
您可以指定以下密码协议:
PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE:不透明协议
从某个根服务器运行
spanner deployment create命令以创建部署。使用--base-dir标志指定基本目录(使用启动根服务器时指定的相同 BASE_DIR),并使用--admin-password-file标志提供管理员密码文件:spanner deployment create \ --config-file=deployment.yaml \ --base-dir=BASE_DIR \ --admin-password-file=admin_password.txt
每台机器的控制台都会显示消息,表明部署现在包含 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_password.txt中配置的密码。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
后续步骤
- 使用客户端库和 JDBC 驱动程序将应用与部署连接起来。
- 管理用户和角色。