Zookeeper未授权访问漏洞修复


ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。默认安装配置完的zookeeper允许未授权访问,管理员未配置访问控制列表(ACL)。导致攻击者可以在默认开放的2181端口下通过执行envi命令获得大量敏感信息(系统名称、java环境)导致任意用户可以在网络不受限的情况下进行未授权访问读取数据甚至杀死服务。


zookeeper未授权访问漏洞修复

zookeeper的基本情况

zookeeper是分布式协同管理工具,常用来管理系统配置信息,提供分布式协同服务。zookeeper官网下载软件包,bin目录下有客户端脚本和服务端脚本。另外还有个工具对理解和使用zookeeper服务非常有用,即zk-ui,该工具是zk服务端的可视化工具,可在web界面对服务端进行操作。
zookeeper以树状结构保存数据,我们完全可以对比linux文件系统理解zookeeper的文件系统。不同点在于linux下的每个目录名对应一个znode。

znode是zk的基本单元,可以存在数据信息、版本信息等等。如图,/是zookeeper的根节点,/目录下的目录均为znode。

ZooKeeper设置ACL权限控制

ZK的节点有5种操作权限:

1
2
3
4
5
6
7
CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写)
注:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限
身份的认证有4种方式:
world:默认方式,相当于全世界都能访问
auth:代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)
digest:即用户名:密码这种方式认证,这也是业务系统中最常用的
ip:使用Ip地址认证

开启认证前须知

1
2
3
4
5
6
ls / #可以查看根节点
getAcl / #可以查看/的ACL认证配置

配置认证后,不在白名单内的机器是没有权限执行命令的了,需要取消策略就需要清除策略,或者授权登录,才有权限使用
setAcl / world:anyone:cdrwa #清除acl认证
授权登录 addauth digest admin:123456

修复办法一zookeeper增加一个认证用户方式访问(推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
1.cd bin
2../zkCli.sh -server 127.0.0.1:2181 (登录服务端)
3.create /kafka (创建znode,名称自拟)
4.addauth digest user:passwd (添加认证用户,配置密码)
5.setAcl /kafka auth:user:rwadc (配置ACL)
6.getAcl /kafka (查看ACL)

[zk: 127.0.0.1:2181(CONNECTED) 26] getAcl /kafka
'digest,'kafka:AHviFxZyZ/iL8MsBeboZ4XZzv/M=
: cdrwa
出现以上信息为成功

配置acl了后不同的客户端需要修改相应配置
以下是kafka的案例:

给kafka服务器端的kafka用户授权
1.给用户kafka所有topic的producer权限
./kafka-acls.sh --authorizer-properties zookeeper.connect=192.168.227.100:2181 --topic * --add --allow-principal User:kafka --producer --group=*

2.给用户kafka所有topic的consumer权限
./kafka-acls.sh --authorizer-properties zookeeper.connect=192.168.227.100:2181 --topic * --add --allow-principal User:kafka --consumer --group=*

3.给用户kafka所有topic的操作权限
./kafka-acls.sh --authorizer-properties zookeeper.connect=192.168.227.100:2181 --topic * --add --allow-principal User:kafka --operation all --group "*"

4.重启kafka,查看日志

5.Kafka 验证读写是否正常
1. 进入容器
命令:docker exec -it kafka /bin/bash
2. 进行测试(容器内)
目录:cd /opt/kafka_2.12-2.5.0/bin/
命令:
---创建topic
./kafka-topics.sh --create --zookeeper 10.166.10.248:2181 --replication-factor 1 --partitions 1 --topic elk_test
---查看topic
./kafka-topics.sh --list --zookeeper 10.166.10.248:2181
---生产数据
./kafka-console-producer.sh --broker-list 10.166.10.248:9092 -topic elk_test
---消费数据
./kafka-console-consumer.sh --bootstrap-server 10.166.10.248:9092 --topic elk_test --from-beginning

修复办法二 zookeeper创建ip白名单

1
2
3
格式:setAcl 路径 ip:xxx.xxx.xxx.xx1:cdrwa,ip:xxx.xxx.xxx.xx2:cdrwa
例如:setAcl /zkaa ip:127.0.0.1:cdrwa,ip:10.111.134.6:cdrwa (注意:加ip白名单时需要把本地ip127.0.0.1加进去,要不本地也没有操作权限了)
恢复:setAcl / world:anyone:cdrwa

修改办法三(推荐) 防火墙策略

1
2
3
4
5
iptables -I INPUT -s 172.16.65.0/24 -p tcp –dport 2181 -j ACCEPT
iptables -A INPUT -p tcp –dport 2181 -j DROP
允许172.16.65开头的ip 访问2181端口 ,其余ip不可访问2181 端口
查看防火墙:
iptables -nvL