文库网站建设,哪个做问卷网站佣金高,自己做网站多少钱,网页手游一、漏洞详情
Zookeeper是一个分布式的#xff0c;开放源码的分布式应用程序协调服务#xff0c;是Google的Chubby一个开源的实现#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件#xff0c;提供的功能包括#xff1a;配置维护、域名服… 一、漏洞详情
Zookeeper是一个分布式的开放源码的分布式应用程序协调服务是Google的Chubby一个开源的实现是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件提供的功能包括配置维护、域名服务、分布式同步、组服务等。 Zookeeper的默认开放端口是2181。Zookeeper 安装部署之后默认情况下不需要任何身份验证造成攻击者可以远程利用 Zookeeper通过服务器收集敏感信息或者在 Zookeeper 集群内进行破坏比如kill命令。攻击者能够执行所有只允许由管理员运行的命令。
二、使用Java解决zk的未授权访问漏洞
还是以digest为例
//给密码加密 public String getDigestUserPswd(String idPassword) throws NoSuchAlgorithmException { return DigestAuthenticationProvider.generateDigest(idPassword); } //获取ACL列表这里只设置一个可访问用户,用户名为user密码为pswd。如果你需要多个继续add即可。 public ListACL getAclList() { String idPassword user:pswd; if (idPassword null) { logger.warn(no digest config,so use world scheme); return ZooDefs.Ids.OPEN_ACL_UNSAFE; } ListACL aclList new ArrayList(); try { Id zkUser new Id(digest, getDigestUserPswd(idPassword)); ACL acl new ACL(ZooDefs.Perms.ALL, zkUser); aclList.add(acl); } catch (NoSuchAlgorithmException e) { logger.error(e); } return aclList; } //给znode设置权限只有aclList的用户可以访问 public void addDigestScheme(){ zk.setACL(znode, aclList, -1); } //创建znode的时候设置ACL zk.create(znode,data,aclList,...) //如何访问加密的znode public void client(){ ZooKeeper zk new ZooKeeper(xxx) zk.addAuthInfo(digest,user:pswd.getBytes()) //然后zk就可以访问加密znode了 }
上面的代码仅说明了核心步骤。 我在这里遇到个大坑就是idpasswod为空的情况之前直接给返回空了feature正常启动但是服务没有成功的发布出去。重要的是构建环境把我在配置文件配置的user信息给删掉了我不知道才开始跑的更坑的是它运行完后直接清除日志了哪里错了都看不到。 最后哼哧哼哧的啃代码终于定位到位置。 血泪教训空指针情况需要正确处理别TMD的随便返回空运行没问题不代表功能没问题。
到这里我们在create节点的时候可以为所有的znode设置访问权限理论上可以保护我们的数据安全了。 漏洞扫描验证
上面我们在创建znode的时候进行了加密这样总可以通过漏洞扫描了吧。 重点来了。
但是如果你使用漏洞扫描工具扫描的话还是有未授权访问漏洞的为啥呢 不知道你有没有注意zk服务端启动后默认会启动这几个具有world和cdrwa权限的znode“/” /zookeeper /zookeeper/config和/zookeeper/quota根据zookeeper的版本不同可能存在不同并且这几个节点虽然具有world和cdrwa权限但是是无法删除的不知道为什么好在我们可以给它设置ACL列表。另外官网对着几个节点也没有特别说明估计和zk本身的一些配置相关吧不删除最好。就是这几个znode会导致你的产品无法通过安全工具的漏洞扫描你说坑不坑解决办法也是很简单的用我们前面说过的zk.setACL为这几个节点设置权限就OK了千万别忘记根节点/了。
好了到这里才是真正的解决了这个未授权访问漏洞问题了。
还可以禁用2181端口试试。