配置 TLS
本页不适用于 ClickHouse Cloud。此处所述流程已在 ClickHouse Cloud 服务中自动化完成。
本指南提供了一些简单且最基本的设置,用于配置 ClickHouse 使用 OpenSSL 证书来验证连接。出于演示目的,我们将创建自签名的证书颁发机构(CA)证书和密钥,并为各节点生成证书,以便在适当的配置下建立连接。
TLS 的实现较为复杂,要确保部署的安全性和健壮性,需要综合权衡多种选项。本文仅为基础教程,展示基本的 TLS 配置示例。请咨询您的 PKI/安全团队,为贵组织生成合适的证书。
如需入门概览,可先阅读这篇关于证书使用的基础教程。
1. 创建 ClickHouse 部署
本指南以 Ubuntu 20.04 为基础环境编写,并在以下主机上通过 DEB 软件包(使用 apt)安装了 ClickHouse。域名为 marsnet.local:
| Host | IP Address |
|---|---|
chnode1 | 192.168.1.221 |
chnode2 | 192.168.1.222 |
chnode3 | 192.168.1.223 |
请参阅快速开始以了解有关安装 ClickHouse 的更多详细说明。
2. 创建 TLS 证书
本文使用自签名证书仅用于演示目的,不应在生产环境中使用。生产环境中应创建证书请求,由组织签发证书,并使用将在设置中配置的 CA 链进行验证。不过,这些步骤可用于先配置和测试相关设置,之后再替换为实际要使用的证书。
-
为新的 CA 生成将要使用的密钥:
-
生成新的自签名 CA 证书。以下命令将创建一个新证书,该证书将使用 CA 密钥来签署其他证书:
注意将密钥和 CA 证书备份到集群之外的安全位置。在生成节点证书之后,应从集群节点中删除该密钥。
-
验证新 CA 证书的内容:
-
为每个节点创建证书请求(CSR)并生成密钥:
-
使用 CSR 和 CA 创建新的证书与密钥对:
-
验证证书的 subject 和 issuer:
-
检查新证书能否通过 CA 证书验证:
3. 创建并配置用于存储证书和密钥的目录。
必须在每个节点上执行此操作。在每个主机上使用相应的证书和密钥。
-
在每个节点上 ClickHouse 可访问的目录中创建一个子目录。我们推荐使用默认配置目录(例如
/etc/clickhouse-server): -
将 CA 证书、每个节点对应的节点证书和密钥复制到新的 certs 目录中。
-
更新所有者和权限,以允许 ClickHouse 读取证书:
4. 使用 ClickHouse Keeper 配置基础集群环境
在此部署环境中,每个节点上都使用以下 ClickHouse Keeper 设置。每台服务器都有自己的 <server_id>。(例如,节点 chnode1 的 <server_id>1</server_id>,其余节点依此类推。)
ClickHouse Keeper 推荐使用的端口为 9281。不过,该端口是可配置的,如果该端口已被环境中的其他应用程序占用,可以改为使用其他端口。
有关所有选项的详细说明,请访问 https://clickhouse.com/docs/operations/clickhouse-keeper/
-
在 ClickHouse 服务器的
config.xml中,将以下内容添加到<clickhouse>标签内部注意在生产环境中,建议在
config.d目录中使用单独的.xml配置文件。 更多信息参见 https://clickhouse.com/docs/operations/configuration-files/ -
在所有节点上取消注释并更新 keeper 设置,并将
<secure>标志设置为 1: -
在
chnode1和chnode2上更新并添加以下集群设置。chnode3将用于 ClickHouse Keeper 仲裁。注意对于此配置,只配置了一个示例集群。测试样例集群必须删除或注释掉;或者如果存在正在测试的现有集群,则必须更新端口并添加
<secure>选项。如果在安装过程中或在users.xml文件中将default用户配置为有密码,则必须设置<user>和<password>。以下配置会在两台服务器上创建一个拥有 1 个分片和 2 个副本的集群(两个副本分别位于每个节点上)。
-
定义宏的值,以便能够创建一个用于测试的 ReplicatedMergeTree 表。在
chnode1上:在
chnode2上:
5. 在 ClickHouse 节点上配置 TLS 接口
以下设置在 ClickHouse 服务器的 config.xml 中进行配置。
-
设置部署的显示名称(可选):
-
将 ClickHouse 设置为监听所有地址上的连接:
-
在每个节点上配置
https端口并禁用http端口: -
在每个节点上配置 ClickHouse 原生的安全 TCP 端口并禁用默认的非加密端口:
-
在每个节点上配置
interserver https端口并禁用默认的非加密端口: -
使用证书和路径配置 OpenSSL
注意每个文件名和路径都必须根据正在配置的节点进行更新。 例如,在
chnode2主机上进行配置时,需要将<certificateFile>条目更新为chnode2.crt。 -
在每个节点上为 gRPC 配置 TLS:
-
至少在其中一个节点上,在其自身的
config.xml文件中(默认路径为/etc/clickhouse-client/),配置 ClickHouse 客户端在连接时使用 TLS: -
禁用 MySQL 和 PostgreSQL 的默认仿真端口:
6. 测试
-
依次启动所有节点:
-
确认安全端口已经打开并处于监听状态,每个节点上的输出应类似如下示例:
ClickHouse 端口 说明 8443 HTTPS 接口 9010 服务器间 HTTPS 端口 9281 ClickHouse Keeper 安全端口 9440 安全的原生 TCP 协议端口 9444 ClickHouse Keeper Raft 端口 -
验证 ClickHouse Keeper 的健康状态 使用不带 TLS 的
echo无法执行常见的 4 letter word (4lW) 命令,以下示例展示了如何配合openssl使用这些命令。- 使用
openssl启动交互式会话
- 使用
-
在 OpenSSL 会话中发送 4LW 命令
-
使用
--secure参数和 TLS 端口启动 ClickHouse 客户端: -
通过
https://chnode1.marsnet.local:8443/play使用https接口登录 Play UI。
注意浏览器会显示证书不受信任,因为是从工作站访问,并且这些证书未被加入客户端机器的根 CA 信任存储中。 当使用公共证书机构(公共 CA)或企业 CA 签发的证书时,则应显示为受信任。
-
创建一个复制表:
-
在
chnode1上添加几行数据: -
在
chnode2上查看这些行以验证复制:
摘要
本文重点介绍了如何在 ClickHouse 环境中配置 TLS。针对生产环境中的不同需求(例如证书验证级别、协议、密码套件等),具体配置会有所差异。但现在你应该已经对配置和实现安全连接所需的各个步骤有了清晰的理解。