剖析zookeeper中间件的安全机制

AI 摘要 / TL;DR

剖析zookeeper中间件的安全机制 点击上方“IT那活儿 ”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!! zookeeper简介 zookeeper是一个基于paxos算法实现的高可用的的分布式数据管理与系统协调服务。 常用于数据发布和订阅、负载均衡、分布式协调、集群管理与Master选举、分布式锁

来源: https://www.ucloud.cn/yun/129131.html 作者: IT那活儿 发布日期: 发布于2023-01-11 13:19

剖析zookeeper中间件的安全机制

点击上方“IT那活儿**”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!**

zookeeper简介

zookeeper是一个基于paxos算法实现的高可用的的分布式数据管理与系统协调服务。

常用于数据发布和订阅、负载均衡、分布式协调、集群管理与Master选举、分布式锁、分布式队列等场景中,保证分布式应用场景中数据的强一致性。

什么情况下使用zookeeper认证机制呢

zookeeper作为分布式架构中的一个重要中间件,通常会在其上面以节点的方式存储数据,默认情况下,所有应用都可以在zk读写任何节点,在复杂且对数据敏感性的应用中,这显然不安全,所以此时我们可以对zk做一些安全策略设置,可以使用以下几种手段。

  • 修改zk 默认端口,使用其它端口服务;
  • 限制访问来源地址;
  • 添加访问控制;
  • 不要将 zk 暴露在外网;
  • 设置 zk 用户认证和 ACL。

如何使用zookeeper安全机制

1. 对zk做一些初始安全配置

通常部署完zk服务后,我们可以做一些初始化安全加固配置。

1.1 修改zk的默认端口2181为其它服务端口,减少随意的网络端口扫描;只配置必要的参数项。

1.2其次限制访问zk的客户端访问源,通过配置主机防火墙策略,只允许指定的客户来源IP访问来zk的端口服务,其它网络连接一律拒绝。

Redhat/Centos 6/7:iptables -I INPUT 1 -p tcp -m iprange --src-range 135.50.xxx13-135.50.xxx.16 --dport 2181 -j ACCEPTiptables -I INPUT 2 -p tcp -s 135.10.xxx.155 --dport 2181 -j ACCEPTiptables -I INPUT 3 -p tcp -s 192.168.xxx.112 --dport 2181 -j ACCEPTiptables -I INPUT 4 -p tcp -s 192.168.xxx.113 --dport 2181 -j ACCEPTiptables -I INPUT 5 -p tcp -s 192.168.xxx.114 --dport 2181 -j ACCEPTiptables -I INPUT 6 -p tcp -s 127.0.0.1 --dport 2181 -j ACCEPTiptables -I INPUT 7 -p tcp --dport 2181 -j DROP

1.3 避免将zk服务端口暴露在外网,避免公网恶意的频繁连接。

2. zk设置访问指定IP访问数据节点

这种方式又称IP权限模式,设置指定的ip访问zk。

2.1 登录zk

zkCli.sh -server 192.168.XXX.112:2181

2.2 查看权限

[zk: 192.168.XXX.114:2181(CONNECTED) 0] getAcl /world,anyone #表示任何人都可以访问: cdrwa

2.3 添加可访问IP

注意:

添加本机的ip地址,以便进行修改,这里遇到一个坑:

添加一个ip地址后会覆盖之前添加的ip地址,结果把我的本即的ip覆盖了,修改可访问ip后我自己再次修改的时候无法修改认证失败!只能重装了。

[zk: 192.168.XXX.114:2181(CONNECTED) 1] setAcl / ip:192.168.XXX.112:cdrwa,ip:192.168.XXX.114:cdrwa,ip:192.168.XXX.115:cdrwa

2.4 查看是否正常添加

getAcl /

此时如果使用localhost登录zk,虽然未授权也可以连接,但是查看节点时会报错KeeperErrorCode = NoAuth for /,所以此时要从已添加的可访问IP才能正常的访问zk。

3. 配置zk访问控制列表

3.1 zk ACL访问控制规则原理

zk可以使用ACL访问控制列表来对节点的权限进行控制, 它与UNIX 文件访问权限非常相似,zk的节点类比文件,客户端可以删除节点、创建节点、修改节点:它使用权限位来允许/禁止对节点的各种操作以及这些位适用的范围。

ACL 指定一组 id 和与这些 id 关联的权限。acl权限控制使用scheme/id/permission来标志,主要包括三个方面

  • ·scheme     #权限模式
  • ·id:       #权限对象
  • ·permission   #权限类型

zk ACL访问控制流程图:

zookeeper acl的特性:

  • zookeeper的权限控制是基于znode节点的,需要对每个节点设置权限。
  • 每个znode支持设置多种权限控制方案和多个权限。
  • 子节点不会继承父节点的权限。客户端无法访问某个节点,但是可以访问他的子节点。

常用的授权acl规则的命令:

命令用法描述
getAclgetAcl path读取节点的ACL
setAclsetAcl path acl设置节点的ACL
createcreate path data acl创建节点时设置acl
addAuthaddAuth scheme auth添加认证用户,类似于登录操作

3.2 使用zk ACL访问控制规则

1)world权限模式

world权限模式只有一种设置模式。就是 setAcl world:anyone:[r][w][c][d][a]

其中id:为固定的anyone,表示任何用户。

示例:

设置所有人对节点具有读写删除及创建子节点的权限:

[zk: localhost:2181(CONNECTED) 1] setAcl /chg1 world:anyone:rwdc

2)IP模式

该模式使用的acl方式是 ip:192.168.XXX.12:[a][d][c][w][r]

示例:

设置只有ip为192.168.XXX.112/114/115的客户端连接才能进行adc操作,其他ip啥操作都做不了。因为图中设置ACL的客户端不是这个ip,所以设置了后,他就失去对该节点的权限了,所以getAcl命令会没有权限。

[zk: localhost:2181(CONNECTED) 0] setAcl / ip:192.168.XXX.112:cdrwa,ip:192.168.XXX.114:cdrwa,ip:192.168.XXX.115:cdrwa

设置以后尝试读取/node1节点将是没有权限 Authentication is not valid,需使用192.168.XXX.112/114/115登录查看。

[root@master2 ~]# zkCli.sh  -server 192.168.XXX.112:2181

3)设置auth方式的身份认证机制

  • 增加一个授权认证用户
[zk: 192.168.XXX.112:2181(CONNECTED) 11] addauth digest chg2:123456
  • 设置权限
[zk: 192.168.XXX.112:2181(CONNECTED) 11] setAcl /chg2 auth:chg2:cdrwa

kEX71…是账号chg2 和密码123456 经过sha1和base64加密后的密文密码。

把客户端quit退出重新连接后:

失去了对该节点的权限。需要使用addauth命令添加授权才行。类似登录之后才能对该节点有权限。

[zk: 192.168.XXX.112:2181(CONNECTED) 0] addauth digest chg2:123456

总 结

生产环境中为zk配置安全策略可有效的保证数据的安全性,为指定的节点指定访问访问IP以及配置身份验证机制可防止误删数据的可能性,保障某些敏感数据的私密性,但是需要客户端程序更改代码,增加开发的复杂度。

本文作者:陈洪刚(上海新炬中北团队)

本文来源:“IT那活儿”公众号