一、背景
由于部门内clickhouse集群依赖的zookeeper集群并未设置访问权限控制,所以被安全部门通报漏洞
二、解决的方案
1、不把Zookeeper直接暴露在公网
2、添加访问控制,根据情况选择对应方式(认证用户,用户名密码)
3、绑定指定IP访问(利用IPtable实现)
三、实现
这里我们选择方案二(别问我为哈 手动黑人3问号)
3.1 zookeeper配置
首先打开命令行客户端 zkCli.sh
/opt/soft/zookeeper/bin/zkCli.sh
为zookeeper 增加一个认证用户
格式如下: addauth digest 用户名:密码明文
addauth digest clickhouse:myPassword
为zk路径设置权限,这里有明文和密文两种方式
首先创建一个测试目录
create /test test
- 方式一 明文
setAcl /test auth:clickhouse:myPassword:cdrwa
- 方式二 密文(密文密码的生成规则和目录权限可参考文末 : Zookeeper ACL权限配置及zkclient示例)
setAcl /test digest:clickhouse:myPassword:cdrwa
查看设置的权限
getAcl /test
此时只有:clickhouse:myPassword 能对/test目录操作
配置zk中的clickhouse目录
这里看zk的用途,如果zk只为ck提供服务,那么可以直接为/目录设置权限
setAcl / auth:clickhouse:myPassword:cdrwa
如果zk还同时为其他框架提供服务那么可只为ck使用的目录设置权限
setAcl /clickhouse auth:clickhouse:myPassword:cdrwa
这里需要注意的是zk的路径权限不会继承,也就是说你对于/clickhouse设置的权限 对于/clickhouse/xx 是不生效的 但是如果ck里配置了zk的用户及密码 那么由ck创建出的zk路径是带有权限的
3.2 clickhouse配置
在metrika.xml中配置zk的用户密码(注意这里密码需要配置成明文)
<zookeeper-servers>
<node index="1">
<host>example1</host>
<port>2181</port>
</node>
<node index="2">
<host>example2</host>
<port>2181</port>
</node>
<node index="3">
<host>example3</host>
<port>2181</port>
</node>
<identity>clickhouse:myPassword</identity>
</zookeeper-servers>
配置完必须重启所有ck服务 (如果长时间无法停止 可强制kill掉)
/etc/init.d/clickhouse-server restart
3.3 验证
随便找一个表查询或写入,无误即可
如果报错检查
- zk用户名密码是否配置
- ck xml配置明文密码是否正确 是否同步
- ck 是否全部重启
3.4 以后如果想通过zkCli操作ck的路径怎么办???
那当然是登录zkCli
再执行addauth digest clickhouse:myPassword 即可操作带有权限的路径