配置 SSL 用户证书进行身份验证
此页面不适用于 ClickHouse Cloud。此处记录的功能在 ClickHouse Cloud 服务中不可用。有关更多信息,请参阅 ClickHouse 云兼容性 指南。
本指南提供了配置使用 SSL 用户证书进行身份验证的简单和最小设置。本教程基于 配置 SSL-TLS 用户指南。
仅当使用 https
或原生接口时,才支持 SSL 用户身份验证。目前在 gRPC 或 PostgreSQL/MySQL 模拟端口中尚未使用。
ClickHouse 节点需要将 <verificationMode>strict</verificationMode>
设置为安全身份验证(尽管 relaxed
可以用于测试目的)。
1. 创建 SSL 用户证书
此示例使用自签名证书和自签名 CA。对于生产环境,请创建 CSR 并提交给您的 PKI 团队或证书提供商以获取正确的证书。
-
生成证书签名请求 (CSR) 和密钥。基本格式如下
openssl req -newkey rsa:2048 -nodes -subj "/CN=<my_host>:<my_user>" -keyout <my_cert_name>.key -out <my_cert_name>.csr
在本示例中,我们将使用它来表示将在此示例环境中使用的域和用户
openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode1.marsnet.local:cert_user" -keyout chnode1_cert_user.key -out chnode1_cert_user.csr
注意CN 是任意的,任何字符串都可以用作证书的标识符。在后续步骤中创建用户时会用到它。
-
生成并签名将用于身份验证的新用户证书。基本格式如下
openssl x509 -req -in <my_cert_name>.csr -out <my_cert_name>.crt -CA <my_ca_cert>.crt -CAkey <my_ca_cert>.key -days 365
在本示例中,我们将使用它来表示将在此示例环境中使用的域和用户
openssl x509 -req -in chnode1_cert_user.csr -out chnode1_cert_user.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365
2. 创建 SQL 用户并授予权限
有关如何启用 SQL 用户和设置角色的详细信息,请参阅 定义 SQL 用户和角色 用户指南。
-
创建一个定义为使用证书身份验证的 SQL 用户
CREATE USER cert_user IDENTIFIED WITH ssl_certificate CN 'chnode1.marsnet.local:cert_user';
-
向新的证书用户授予权限
GRANT ALL ON *.* TO cert_user WITH GRANT OPTION;
注意在本练习中,为了演示目的,用户被授予完全管理员权限。有关权限设置,请参阅 ClickHouse RBAC 文档。
注意我们建议使用 SQL 定义用户和角色。但是,如果您当前在配置文件中定义用户和角色,则用户将如下所示
<users>
<cert_user>
<ssl_certificates>
<common_name>chnode1.marsnet.local:cert_user</common_name>
</ssl_certificates>
<networks>
<ip>::/0</ip>
</networks>
<profile>default</profile>
<access_management>1</access_management>
<!-- additional options-->
</cert_user>
</users>
3. 测试
-
将用户证书、用户密钥和 CA 证书复制到远程节点。
-
在 ClickHouse 客户端配置 中使用证书和路径配置 OpenSSL。
<openSSL>
<client>
<certificateFile>my_cert_name.crt</certificateFile>
<privateKeyFile>my_cert_name.key</privateKeyFile>
<caConfig>my_ca_cert.crt</caConfig>
</client>
</openSSL> -
运行
clickhouse-client
。clickhouse-client --user <my_user> --query 'SHOW TABLES'
注意请注意,当在配置中指定证书时,传递给 clickhouse-client 的密码将被忽略。
4. HTTP 测试
-
将用户证书、用户密钥和 CA 证书复制到远程节点。
-
使用
curl
测试示例 SQL 命令。基本格式为echo 'SHOW TABLES' | curl 'https://<clickhouse_node>:8443' --cert <my_cert_name>.crt --key <my_cert_name>.key --cacert <my_ca_cert>.crt -H "X-ClickHouse-SSL-Certificate-Auth: on" -H "X-ClickHouse-User: <my_user>" --data-binary @-
例如
echo 'SHOW TABLES' | curl 'https://chnode1:8443' --cert chnode1_cert_user.crt --key chnode1_cert_user.key --cacert marsnet_ca.crt -H "X-ClickHouse-SSL-Certificate-Auth: on" -H "X-ClickHouse-User: cert_user" --data-binary @-
输出将类似于以下内容
INFORMATION_SCHEMA
default
information_schema
system注意请注意,没有指定密码,证书被用来代替密码,这就是 ClickHouse 验证用户身份的方式。
总结
本文介绍了创建和配置用户以进行 SSL 证书身份验证的基础知识。此方法可以与 clickhouse-client
或任何支持 https
接口并且可以设置 HTTP 标头的客户端一起使用。生成的证书和密钥应保密并限制访问,因为证书用于对 ClickHouse 数据库上的操作进行身份验证和授权。对待证书和密钥如同对待密码一样。