如何在单 ClickHouse 服务器上使用 Let's Encrypt 启用 SSL
步骤指南
以下步骤可用于使用 Let's Encrypt 为单 ClickHouse 服务器启用 SSL,Let's Encrypt 是一个免费、自动化和开放的证书颁发机构 (CA),旨在让任何人都可以轻松地使用 HTTPS 保护其网站。通过自动化证书颁发和续订过程,Let's Encrypt 确保网站保持安全,而无需手动干预。
在以下指南中,我们假设 ClickHouse 已安装在标准软件包位置。我们在所有示例中使用域名 product-test-server.clickhouse-dev.com
。请相应地替换您的域名。
- 验证您是否有一个 DNS
A
或AAAA
记录指向您的服务器。可以使用 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
- 打开服务器上的端口 80。此端口将用于使用 ACME 协议和 certbot 进行自动证书续订。对于 AWS,可以通过修改实例关联的安全组来实现。
- 安装
certbot
,例如使用apt
sudo apt install certbot
- 获取 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 域名)。这些域名被视为共享基础设施,并因安全和滥用预防原因而被阻止。
- 将证书复制到 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 证书,而无需手动干预,从而保持安全并最大限度地减少运营开销。
- 在 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
- 重启 ClickHouse 服务器
sudo clickhouse restart
- 验证 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>