跳到主要内容
跳到主要内容

配置 SSL-TLS

Not supported in ClickHouse Cloud
备注

本页面不适用于 ClickHouse Cloud。此处记录的过程在 ClickHouse Cloud 服务中是自动化的。

本指南提供了简单且最小的设置以配置 ClickHouse 使用 OpenSSL 证书来验证连接。为了演示,创建了自签名的证书颁发机构 (CA) 证书和密钥,并使用节点证书以适当的设置进行连接。

备注

TLS 实现是复杂的,有许多选项需要考虑,以确保完全安全和稳健的部署。这是一个基础教程,包含基本的 SSL/TLS 配置示例。请咨询你的 PKI/安全团队,以为你的组织生成正确的证书。

请查看此 关于证书使用的基础教程 以获得简介概述。

1. 创建 ClickHouse 部署

本指南是基于在以下主机上使用 DEB 包(通过 apt)安装的 Ubuntu 20.04 和 ClickHouse 编写的。域名为 marsnet.local

主机IP 地址
chnode1192.168.1.221
chnode2192.168.1.222
chnode3192.168.1.223
备注

请查看 快速入门 获取有关如何安装 ClickHouse 的更多详情。

2. 创建 SSL 证书

备注

使用自签名证书仅用于演示目的,不能用于生产环境。证书请求应该创建以由组织签名,并通过将配置中的 CA 链进行验证。然而,这些步骤可以用于配置和测试设置,然后可以使用实际将要使用的证书替换。

  1. 生成一个将用于新 CA 的密钥:
  1. 生成一个新的自签名 CA 证书。以下命令将创建一个新的证书,用于使用 CA 密钥对其他证书进行签名:
备注

将密钥和 CA 证书备份到集群外的安全位置。在生成节点证书后,应从集群节点中删除密钥。

  1. 验证新 CA 证书的内容:
  1. 为每个节点创建证书请求 (CSR) 并生成密钥:
  1. 使用 CSR 和 CA 创建新的证书和密钥对:
  1. 验证证书的主题和颁发者:
  1. 检查新证书是否通过 CA 证书验证:

3. 创建并配置用于存储证书和密钥的目录。

备注

这必须在每个节点上完成。请在每个主机上使用适当的证书和密钥。

  1. 在每个节点中创建一个可被 ClickHouse 访问的目录中的文件夹。我们建议使用默认配置目录(例如 /etc/clickhouse-server):
  1. 将 CA 证书、节点证书和对应于每个节点的密钥复制到新证书目录。

  2. 更新所有权和权限,以允许 ClickHouse 读取证书:

4. 使用 ClickHouse Keeper 配置基本集群的环境

对于此部署环境,每个节点使用以下 ClickHouse Keeper 设置。每个服务器将拥有自己的 <server_id>。 (例如,chnode1<server_id>1</server_id>,依此类推。)

备注

推荐的端口是 ClickHouse Keeper 的 9281。然而,该端口是可以配置的,如果该端口已被环境中的其他应用程序使用,则可以设置其他端口。

有关所有选项的完整说明,请访问 https://clickhouse.com/docs/operations/clickhouse-keeper/

  1. 在 ClickHouse 服务器的 config.xml 中的 <clickhouse> 标签内添加以下内容:

    备注

    对于生产环境,建议在 config.d 目录中使用单独的 .xml 配置文件。 有关更多信息,请访问 https://clickhouse.com/docs/operations/configuration-files/

  1. 在所有节点上取消注释并更新 keeper 设置,并将 <secure> 标志设置为 1:
  1. 更新并将以下集群设置添加到 chnode1chnode2chnode3 将用于 ClickHouse Keeper 仲裁。

    备注

    对于此配置,仅配置了一个示例集群。测试样本集群必须被删除、注释掉,或者如果存在正在测试的现有集群,则必须更新端口并添加 <secure> 选项。如果在安装或 users.xml 文件中最初配置了 default 用户具有密码,则必须设置 <user><password>

    下面的命令在两个服务器(每个节点一个)上创建了一个带有一个分片副本的集群。

  1. 定义宏值以能够创建用于测试的 ReplicatedMergeTree 表。在 chnode1 上:

chnode2 上:

5. 在 ClickHouse 节点上配置 SSL-TLS 接口

以下设置在 ClickHouse 服务器的 config.xml 中配置

  1. 设定部署的显示名称(可选):
  1. 设置 ClickHouse 监听外部端口:
  1. 在每个节点上配置 https 端口并禁用 http 端口:
  1. 在每个节点上配置 ClickHouse Native 安全 TCP 端口,并禁用默认的不安全端口:
  1. 在每个节点上配置 interserver https 端口,并禁用默认的不安全端口:
  1. 使用证书和路径配置 OpenSSL

    备注

    每个文件名和路径必须更新为与正在配置的节点匹配。 例如,在配置 chnode2 主机时,更新 <certificateFile> 条目为 chnode2.crt

有关更多信息,请访问 https://clickhouse.com/docs/operations/server-configuration-parameters/settings/#server_configuration_parameters-openssl

  1. 为每个节点配置 gRPC 以使用 SSL:

有关更多信息,请访问 https://clickhouse.com/docs/interfaces/grpc/

  1. 在至少一个节点上配置 ClickHouse 客户端,以便在其自己的 config.xml 文件中使用 SSL 进行连接(默认在 /etc/clickhouse-client/ 中):
  1. 禁用 MySQL 和 PostgreSQL 的默认仿真端口:

6. 测试

  1. 逐个启动所有节点:
  1. 验证安全端口是否已启动并在监听,应该在每个节点上类似于以下示例:
ClickHouse 端口描述
8443https 接口
9010interserver https 端口
9281ClickHouse Keeper 安全端口
9440安全 Native TCP 协议
9444ClickHouse Keeper Raft 端口
  1. 验证 ClickHouse Keeper 健康 典型的 4 字母命令 (4lW) 命令在没有 TLS 的情况下使用 echo 无法工作,以下是如何在 openssl 会话中使用这些命令。
    • 使用 openssl 启动一个交互式会话
  • 在 openssl 会话中发送 4LW 命令
  1. 使用 --secure 标志和 SSL 端口启动 ClickHouse 客户端:
  1. 使用 https 接口登录 Play UI,地址为 https://chnode1.marsnet.local:8443/play

    备注

    浏览器将显示一个不受信的证书,因为它是从工作站访问的,并且证书不在客户端计算机的根 CA 存储中。 当使用公共权威或企业 CA 颁发的证书时,应该显示为受信任。

  2. 创建一个副本表:

  1. chnode1 上添加几行:
  1. 通过查看 chnode2 上的行来验证复制:

总结

本文重点介绍了如何配置带有 SSL/TLS 的 ClickHouse 环境。在生产环境中,设置将因不同的需求而有所不同;例如,证书验证级别、协议、密码等。 但你现在应该对配置和实施安全连接所涉及的步骤有了良好的理解。