一、背景&需求
-
在业务中,常常遇到域名证书到期续签的问题,证书续签后,需要为使用到证书的站点替换新证书,由于站点过多或者疏漏的原因,可能会遇到证书过期了而忘记替换的情况,因此使用 Zabbix 对域名和证书文件进行监控 -
需求:
- 到期检查配置多个触发器:60天后到期、30天后到期、10天后到期、明日到期、已过期、时间获取失败
- 定时检查,而非每分钟检查
对于第一个需求,一个域名或者证书文件的检查,直接配置监控项和证书文件即可,但是实际上往往有多个证书文件和数不完的域名,这个时候就需要借助 Zabbix 自动发现 对于第二个需求,在配置监控项目时,将更新间隔设为0,并采用调度间隔指定时间即可
二、Python 脚本获取域名、证书时间
要对域名、证书都做监控,监控证书的目的主要是提醒那些证书即将到期,监控域名的目的主要是为了提醒哪些域名的证书即将过期。
此处不详细展示代码,脚本代码、zabbix模版、配置以及如何使用详见https://github.com/LHB6540/zabbix/tree/main/domain_cert_monitor
脚本1 get_expired_time.py:
获取指定域名、证书的剩余时间
脚本2 get_domain_day.py:
借助 get_expired_time.py 获取指定域名列表的所有到期时间并生成 Zabbix 自动发现格式的数据
脚本3 get_cert_day.py:
借助 get_expired_time.py 获取指定目录下所有证书文件的到期时间并生成 Zabbix 自动发现格式的数据
脚本4 get_signal_cert.py:
借助 get_cert_day.py 生成的数据获取单个证书的剩余有效时间
脚本5 get_signal_cert.py:
借助 get_domain_day.py 生成的数据获取单个域名使用的证书的剩余有效时间
三、配置 Zabbix 监控模板
此处不仅仅配置为自动发现规则,而是配置为模板,在模板中添加自动发现规则,主要是为了在方便在不同机器上使用
脚本代码、zabbix模版、配置以及如何使用详见https://github.com/LHB6540/zabbix/tree/main/domain_cert_monitor
首先编写 Zabbix 配置文件并重启 Agent
UserParameter=domains_discovery,cat /tmp/domain_info.tmp
UserParameter=domain_expired[*],/usr/bin/python3 /etc/zabbix/shell/domain_cert/get_signal_domain.py $1
UserParameter=cert_discovery,cat /tmp/cert_info.tmp
UserParameter=cert_expired_day[*],/usr/bin/python3 /etc/zabbix/shell/domain_cert/get_signal_cert.py $1
以证书监控为例
1、更新间隔设为0,表示不主动检查,自定义间隔使用调度,在每天10点进行检查
2、配置监控项原型同理
3、配置触发器,注意部分触发器的恢复表达式是额外定义的,例如还有60天到期的触发器,因为目的是在60天的时候提醒,但是如果在59天的时候还没有签新证书,逻辑上不应该是触发器恢复.
四、参考和 Tip
1、参考:
- Zabbix 自动发现相关文档:https://www.zabbix.com/documentation/4.0/zh/manual/discovery/low_level_discovery
- Zabbix 监控项取值间隔:https://www.zabbix.com/documentation/4.0/zh/manual/config/items/item/custom_intervals
2、Tip:
-
代码和使用说明已上传 Github ,方便下载: -
get_expired_time.py 中 get_cert_from_endpoint 尝试采用两种方法去进行SSL握手,主要是由于部分网站强制使用TLS1.3进行握手,而ssl.get_server_certificate 方法并不支持 -
get_expired_time.py 可以当作命令行工具直接使用哦 -
使用 Zabbix 自动发现获取监控项后,针对每个监控项目的取值,可以采用相关项目代替脚本,这个会在后续文章中有提到,为了更好地利用这一特性,建议使用 Zabbix 5
|