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