跳到主要内容

如何在单 ClickHouse 服务器上使用 Let's Encrypt 启用 SSL

·6 分钟阅读
了解如何使用 Let's Encrypt 为单 ClickHouse 服务器设置 SSL,包括证书颁发、配置和验证。

步骤指南

以下步骤可用于使用 Let's Encrypt 为单 ClickHouse 服务器启用 SSL,Let's Encrypt 是一个免费、自动化和开放的证书颁发机构 (CA),旨在让任何人都可以轻松地使用 HTTPS 保护其网站。通过自动化证书颁发和续订过程,Let's Encrypt 确保网站保持安全,而无需手动干预。

注意

在以下指南中,我们假设 ClickHouse 已安装在标准软件包位置。我们在所有示例中使用域名 product-test-server.clickhouse-dev.com。请相应地替换您的域名。

  1. 验证您是否有一个 DNS AAAAA 记录指向您的服务器。可以使用 Linux 工具 dig 来实现。例如,如果使用 Cloudflare DNS 服务器 1.1.1.1,则 product-test-server.clickhouse-dev.com 的响应如下:

dig @1.1.1.1 product-test-server.clickhouse-dev.com

; <<>> DiG 9.18.28-0ubuntu0.22.04.1-Ubuntu <<>> @1.1.1.1 product-test-server.clickhouse-dev.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22315
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;product-test-server.clickhouse-dev.com. IN A

;; ANSWER SECTION:
product-test-server.clickhouse-dev.com. 300 IN A 34.248.59.9

;; Query time: 52 msec
;; SERVER: 1.1.1.1#53(1.1.1.1) (UDP)
;; WHEN: Thu Dec 12 09:37:33 UTC 2024
;; MSG SIZE rcvd: 83

请注意下面确认 A 记录存在的部分。

;; ANSWER SECTION:
product-test-server.clickhouse-dev.com. 300 IN A 34.248.59.9
  1. 打开服务器上的端口 80。此端口将用于使用 ACME 协议和 certbot 进行自动证书续订。对于 AWS,可以通过修改实例关联的安全组来实现。

Open_Port_80_Security_Group

  1. 安装 certbot,例如使用 apt

sudo apt install certbot
  1. 获取 SSL 证书

sudo certbot certonly
Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Spin up a temporary webserver (standalone)
2: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Please enter the domain name(s) you would like on your certificate (comma and/or
space separated) (Enter 'c' to cancel): product-test-server.clickhouse-dev.com
Requesting a certificate for product-test-server.clickhouse-dev.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/product-test-server.clickhouse-dev.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/product-test-server.clickhouse-dev.com/privkey.pem
This certificate expires on 2025-03-12.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.openssl.ac.cn/donate
* Donating to EFF: https://eff.org/donate-le
注意

我们的服务器上没有运行 Web 服务器,因此请使用 (1) 允许 Certbot 使用独立的临时 Web 服务器。

当请求时,输入您的服务器的完整域名,例如 product-test-server.clickhouse-dev.com

注意

Let's Encrypt 制定了一项策略,即不为某些类型的域名颁发证书,例如公共云提供商生成的域名(例如,AWS *.compute.amazonaws.com 域名)。这些域名被视为共享基础设施,并因安全和滥用预防原因而被阻止。

  1. 将证书复制到 ClickHouse 目录。

echo '* * * * * root cp -u /etc/letsencrypt/live/product-test-server.clickhouse-dev.com/*.pem /etc/clickhouse-server/ && chown clickhouse:clickhouse /etc/clickhouse-server/*.pem && chmod 400 /etc/clickhouse-server/*.pem' | sudo tee /etc/cron.d/copy-certificates

此命令设置一个 cron 作业,以自动管理 ClickHouse 服务器的 Let's Encrypt SSL 证书。它每分钟以 root 用户身份运行,将 .pem 文件从 Let's Encrypt 目录复制到 ClickHouse 服务器的配置目录,但仅当文件已更新时才复制。复制后,脚本会将文件的所有权调整为 clickhouse 用户和组,确保服务器具有所需的访问权限。它还在复制的文件上设置安全的只读权限 (chmod 400),以保持严格的文件安全性。这确保 ClickHouse 服务器始终可以访问最新的 SSL 证书,而无需手动干预,从而保持安全并最大限度地减少运营开销。

  1. 在 clickhouse-server 中配置这些证书的使用。

echo "https_port: 8443
tcp_port_secure: 9440
openSSL:
server:
certificateFile: '/etc/clickhouse-server/fullchain.pem'
privateKeyFile: '/etc/clickhouse-server/privkey.pem'
disableProtocols: 'sslv2,sslv3,tlsv1,tlsv1_1'" | sudo tee /etc/clickhouse-server/config.d/ssl.yaml
  1. 重启 ClickHouse 服务器

sudo clickhouse restart
  1. 验证 ClickHouse 可以通过 SSL 通信

curl https://product-test-server.clickhouse-dev.com:8443/

Ok.

为了使最后一步有效,您可能需要确保端口 8443 可访问,例如包含在 AWS 中的安全组中。或者,如果您只想从服务器访问 ClickHouse,请修改您的 hosts 文件,即:

echo "127.0.0.1 product-test-server.clickhouse-dev.com" | sudo tee -a /etc/hosts
危险

如果您从通配符地址打开连接,请确保至少应用以下措施之一:

  • 服务器受到防火墙保护,无法从不受信任的网络访问;
  • 所有用户都限制为网络地址的子集(请参阅 users.xml);
  • 所有用户都拥有强密码,只有安全 (TLS) 接口可访问,或者连接仅通过 TLS 接口进行。
  • 没有密码的用户具有只读访问权限。

另请参阅:https://www.shodan.io/search?query=clickhouse

博客 使用 ClickHouse 和 HTTP 构建单页应用程序 可以用作保护公共实例的指南。

如果从运行 ClickHouse 的本地计算机连接,以下方法也应该有效。要通过 product-test-server.clickhouse-dev.com 连接,请在您的端口中打开端口 9440

clickhouse client --secure --user default --password <password>