
# 1. 未授权漏洞
标准部署中,默认没有对所有节点加密,安全扫描可能会扫出未授权漏洞,关键字为getAcl,根目录未加密等,如果安全扫描有根节点加密要求,按照第一章节操作加密即可。
注意:如果安全扫描的描述关键字为echo envi |nc IP 2181,环境,敏感信息等,此为第二种未授权漏洞,需要修改conf/zoo.cfg中4lw.commands.whitelist= (等号后面置空),重启zk即可修复。此设置影响监控建议评估后操作。

## 1.1 确认zk账号密码
mc-【集群管理】,选择集群后,可以看到zk的用户名和密码(如果没有这2个值,需要到【组件维护】-【zookeeper管理】中确认)。使用安装器部署的应该非空,可以查看安装器安装记录或者联系运维获取密码;如果为空可以自行设置账号密码后保存发布。

再确认容器环境变量是否已经加密,同样安装器默认已经加密,如果检查现场环境没有加密,需要添加上。
格式参考:192.168.118.118:2181?user=zookeeper&password=Cosmic@2020
#示例账号zookeeper,密码Cosmic@2020,此处如果不想明文显示密码可以参考文章5-明文密码

## 1.2 zk根目录加密
在zookeeper/bin目录下执行:
./zkCli.sh
addauth digest zookeeper:Cosmic@2020
setAcl / ip:IP:cdrwa,ip:127.0.0.1:cdrwa,auth:kafka:cdrwa
#由于kafka需要连接zk,直接加密后kafka无法正常启动,此处需要设置kafka机器的ip地址添加到白名单

配置完成后重启kafka服务,能正常启动即为配置成功,解决zookeeper根目录的未授权漏洞。正常情况下到此能满足绝大部分扫描软件要求,如果还有扫描到其他节点存在未授权漏洞,建议提交扫描报告至总部,针对报告再进行具体的分析。
以下内容介绍苍穹zk节点的改密和授权,可以根据需求查看。
# 2. zookeeper修改密码,苍穹节点加密
苍穹版本5.0.011,使用安装器部署的环境默认已经加密部分节点,以下方案为针对安装器部署环境修改密码,如果默认没有设置密码可以跳过步骤2;如果可以删除zk数据,可以参考重新初始化zk;如果需要更完整的加密,请先阅读下文"其他苍穹zookeeper节点相关说明"内容。
# 操作步骤
## 2.1. 停服,包括所有苍穹容器和mc
## 2.2. 去除老账号信息
以下示例旧加密信息old:Cosmic@2020,新加密信息newzk:Cosmic@2023
在zookeeper/bin目录下执行
./zkCli.sh
addauth digest old:Cosmic@2020
setAcl -R /集群id world:anyone:cdrwa
setAcl -R /mc world:anyone:cdrwa
setAcl -R /schedule world:anyone:cdrwa
setAcl -R /QRootProfiler world:anyone:cdrwa
#getAcl /集群id 显示'world,'anyone说明修改成功
quit

## 2.3. 使用新账号,必须重新登录zk进行加密
./zkCli.sh
addauth digest newzk:Cosmic@2023
setAcl -R /集群id auth:newzk:cdrwa
setAcl -R /mc auth:newzk:cdrwa
setAcl -R /schedule auth:newzk:cdrwa
setAcl -R /QRootProfiler auth:newzk:cdrwa
quit

## 2.4. mc配置修改
mc容器的环境配置,通过gpaas或k8s语句修改configurl的值,在地址后加上?user=newzk&password=Cosmic@2023,启动mc。

## 2.5. 针对苍穹配置修改
mc-【集群管理】,选择集群后,修改zk用户名和zk密码,部分环境mc此处可能是选择zk机器,账号密码需要到【组件维护】-【zookeeper管理】中修改。修改完成后集群界面,保存发布。

苍穹容器的环境配置,通过gpaas或k8s语句修改configurl的值,在地址后加上?user=newzk&password=Cosmic@2023,启动苍穹服务。至此完成配置。

# 3. 重新初始化zk
如果是测试环境,可以跳过上面步骤,删除zk数据重新初始化也可以完成苍穹节点,此操作涉及删除zk数据,请谨慎操作。
停止所有苍穹服务,停止zookeeper服务后将zk的数据目录zk_2181改名后启动zk,zk数据将被清空,再按照上述步骤4-登录mc重新初始化-步骤5,即可完成配置。
# 4. 其他苍穹zookeeper节点加密相关说明
上述方案,仅针对苍穹5.0.011版本下的标准部署下的加密配置。如果有比较高的安全要求,可以看到目前还有2个节点未加密:
MUTEX:历史接口,后续会优化此节点,目前暂不建议加密。
kdubbo:可以加密,需要可以在上面加密流程中同时添加如下操作:
## 4.1 步骤2.3添加操作
setAcl -R /kdubbo auth:newzk:cdrwa
## 4.2 步骤2.4添加操作
mc容器的环境配置,修改configurl后,还需要添加一个环境变量,变量名称:dubbo.registry.address,变量值为zk地址+加密信息,与configurl一致

## 4.3 步骤2.5添加操作
配置完成后,mc-【集群管理】-【对应集群】-【配置信息】,添加dubbo.zookeeper.ip_port和Schedule.zk.server.ip_port的加密信息,修改后保存发布

# 5. 注意事项
## zk跳过授权验证
zookeeper加密异常,在紧急情况下可以修改zk配置文件,zk安装目录下zookeeper/config/zoo.cfg,添加值:skipACL=yes,重启zk后可以暂时去除所有的加密限制,后续修复完成后请务必删除此值再重启保证加密正常生效。
## 集群配置
zookeeper集群手动加密时,可以只针对任意一个节点进行操作,集群会同步变更。在填写集群值也是值最后加上账号密码即可,示例如下:
192.168.118.10:2181,192.168.118.11:2181,192.168.118.12:2181?user=newzk&password=Cosmic@2023
## 明文密码
zk的密码在configurl配置中是明文的,如果希望进行对密码加密,可以使用mc-【组件维护】-【加密工具】,进行加密,加密后的值示例如下:
192.168.118.100:2181?user=newzk&password=d@f*g:SGVsbG8=`=QijlBj923RHvrE81qtWWMDVWDCgHqLlgpVouV2Fho6hPa2RwYXNzd29yZA==
## 报错NoAuth
日志中NoAuth for / 这类的报错,基本都是zk加密的问题,可以自行排查加密情况。
由于历史版本部署的zk未加密,并且zk的加密并不会传递的特性,随着加密场景增多,会出现以下两种场景遇到加密相关报错:
### 1. 未对zk加密而mc集群中填写了加密信息
zookeeper和容器环境变量没有加密,却在mc-【集群管理】中添加了账号密码,由于未加密,所以无论填的是什么账号密码都可以成功保存发布,但后续新增的数据就会被带上加密信息,导致报错身份验证失败。例如升级补丁的过程会添加一个新的zk值,这个值携带了加密信息,此时重启mservice就会报错此值NoAuth,需要使用mc配置的账号密码登录zk后去除授权,或设置skipACL=yes先保证容器启动再进行修改。

### 2. 有开发环境连接后的问题
配置了加密的开发环境,连接未加密的环境进行操作,后续断开后,未加密的环境使用中出现一些报错,报错关键字NoAuth /集群id/xxxx,可以推测是开发环境连接上添加的。此值需要去除此报错节点的身份授权,可以参考步骤1,或者使用skipACL=yes。为了避免此问题,建议zookeeper设置加密,后续开发环境连接也必须提供正确的账号密码才能连上使用,避免出现上述问题。
