暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

剖析zookeeper中间件的安全机制

IT那活儿 2022-12-09
1742

点击上方“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 ACCEPT
iptables -I INPUT 2 -p tcp -s 135.10.xxx.155 --dport 2181 -j ACCEPT
iptables -I INPUT 3 -p tcp -s 192.168.xxx.112 --dport 2181 -j ACCEPT
iptables -I INPUT 4 -p tcp -s 192.168.xxx.113 --dport 2181 -j ACCEPT
iptables -I INPUT 5 -p tcp -s 192.168.xxx.114 --dport 2181 -j ACCEPT
iptables -I INPUT 6 -p tcp -s 127.0.0.1 --dport 2181 -j ACCEPT
iptables -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规则的命令:

命令

用法

描述

getAcl

getAcl path

读取节点的ACL

setAcl

setAcl path acl

设置节点的ACL

create

create path data acl

创建节点时设置acl

addAuth

addAuth 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那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论