由于实验室产品的监控模块的需求,需要绕过zabbix的验证模块,实现从二级平台到zabbix的无缝接入。
测试发现,zabbix的身份验证并不是想象的那么简单,为了实现功能,遂进行源码分析。
分析./include/classes/user/CWebUser.php
中的login和logout可以了解到zabbix的常规验证流程。
主要逻辑如下:
然而,从一个静态URL想要绕过登陆直接跳转到zabbix的某个监控页面,肯定是不能走这个常规流程,所以,我们以zabbix的监控图表界面对应的charts.php代码来理清zabbix对于URL跳转这类请求的验证流程。
包括chart.php的几乎每一个zabbix的展示页面的php代码都会在开头包含一个config.inc.php
,且并无其他验证相关代码存在,config.inc.php
中只有一行主要代码Z::getInstance()->run()
,追踪到这个run函数里,就能找到疑似的验证流程入口$this->authenticateUser()
。
该函数位于 ./include/classes/core/ZBase.php
中。
ZBase.php中的函数,是对./include/classes/user/CWebUser.php
中同名函数的封装,CWebUser.php中的checkAuthentication又是对zabbix API即./include/classes/api/services/CUser.php
中的同名函数的封装。
具体流程如下:
zbx_sessionid
的值存入sessionIdSession terminated, re-login, please
check_perm2system
检查该用户的权限,若有问题,报错No permissions for system access
autologout
> 0, 删除数据库中对应用户的过期的session分析得出结论,如果要实现在任何环境下的一次URL跳转都能成功以管理员的权限进入zabbix,关键在于以上流程的第2步,不能以访客模式进入zabbix,即需要让sessionId不为空且可用,自然得出的办法就是,提前保存好一个可用的sessionId到cookie中。
多番测试后,证实了以上方案是可行的,于是,实施方案如下:
手动在zabbix增加一个session记录,每次直接请求URL的时候,先调用一个自定义php,存入这个session的id,再继续访问,bingo!
后续发现问题,会回来更新。