配置 SSL-TLS
本页不适用于 ClickHouse Cloud。此处所述流程已在 ClickHouse Cloud 服务中自动化完成。
本指南提供简单且最小化的配置,用于将 ClickHouse 配置为使用 OpenSSL 证书验证连接。作为演示,我们将使用自签名的证书颁发机构(CA)证书和密钥,并为各节点创建证书,以便在配置好相应设置后建立连接。
TLS 的实现相当复杂,需要考虑许多选项以确保部署的安全性和健壮性。本文是一个基础教程,提供基本的 SSL/TLS 配置示例。请咨询贵组织的 PKI/安全团队,以生成适用于贵组织的正确证书。
请参阅这篇关于证书使用的基础教程,以获取入门级概览。
1. 创建 ClickHouse 部署
本指南基于 Ubuntu 20.04,ClickHouse 使用 DEB 软件包(通过 apt)安装在以下主机上。域名为 marsnet.local:
| 主机 | IP 地址 |
|---|---|
chnode1 | 192.168.1.221 |
chnode2 | 192.168.1.222 |
chnode3 | 192.168.1.223 |
请参阅 快速开始 了解有关安装 ClickHouse 的更多详细信息。
2. 创建 SSL 证书
使用自签名证书仅用于演示目的,不应在生产环境中使用。应创建证书请求,由组织签发并使用将在设置中配置的 CA 链进行验证。不过,这些步骤可用于配置和测试设置,之后可以替换为实际将使用的证书。
-
生成用于新 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 节点上配置 SSL-TLS 接口
下面的设置在 ClickHouse 服务器的 config.xml 中进行配置。
-
设置部署的显示名称(可选):
-
将 ClickHouse 设置为监听外部端口:
-
在每个节点上配置
https端口并禁用http端口: -
在每个节点上配置 ClickHouse 原生安全 TCP 端口,并禁用默认的非加密端口:
-
在每个节点上配置
interserver https端口,并禁用默认的非加密端口: -
使用证书和路径配置 OpenSSL
注意必须根据正在配置的节点,更新每个文件名和路径以保持一致。 例如,在配置
chnode2主机时,将<certificateFile>条目更新为chnode2.crt。 -
在每个节点上配置 gRPC 以使用 SSL:
-
至少在其中一个节点上,在其自身的
config.xml文件(默认位于/etc/clickhouse-client/)中配置 ClickHouse 客户端使用 SSL 建立连接: -
禁用 MySQL 和 PostgreSQL 的默认兼容端口:
6. 测试
-
依次启动所有节点:
-
验证安全端口是否已启动并处于监听状态,每个节点的输出应类似于以下示例:
ClickHouse 端口 描述 8443 HTTPS 接口 9010 服务器间 HTTPS 端口 9281 ClickHouse Keeper 安全端口 9440 安全的原生 TCP 协议端口 9444 ClickHouse Keeper Raft 端口 -
验证 ClickHouse Keeper 运行状况
典型的 4 letter word (4lW) 命令在未使用 TLS 且通过echo调用时将无法使用,下面是如何结合openssl使用这些命令。- 使用
openssl启动交互会话
- 使用
-
在
openssl会话中发送 4LW 命令
-
使用
--secure参数和 SSL 端口启动 ClickHouse 客户端: -
使用
https接口,通过https://chnode1.marsnet.local:8443/play登录 Play UI。
注意浏览器会显示证书不受信任,这是因为是从工作站访问,且这些证书未添加到客户端机器的根 CA 信任存储中。 当使用由公共 CA 或企业 CA 签发的证书时,则应显示为受信任。
-
创建一个复制表:
-
在
chnode1上插入几行数据: -
通过在
chnode2上查看行数据来验证复制情况:
总结
本文重点介绍了如何在 ClickHouse 环境中配置 SSL/TLS。生产环境中的具体设置会根据不同需求而有所差异,例如证书验证级别、协议、密码套件等。你现在应该已经清楚了解了配置并实现安全连接所需的各个步骤。