Zabbix 4.0.2 批量监控域名证书过期时间

zabbix通过自定义key "domain.discovery" 发现域名(Json格式),然后自动生成监控项,监控项通过自定义key "https"获取域名证书有效期,若少于30天则出发告警。
1、在zabbix agent 上面创建脚本文件和域名文件
在/etc/zabbix/scritps/下创建domains.txt、get_domains.sh、https.sh这三个文件

get_domains.sh

#/bin/bash
#auth xc
#date 2024-06-20
ssl_array=`cat /etc/zabbix/script/domains.txt`
length=`echo "${ssl_array}" | wc -l`
count=0
echo '{'
echo -e '\t"data":['
echo "$ssl_array" | while read line
do
   echo -en '\t\t{"{#Domain_NAME}":"'$line'"}'
   count=$(( $count + 1 ))
   if [ $count -lt $length ];then
      echo ','
   fi
done
echo -e '\n\t]'
echo '}'

https.sh

#/bin/bash
#auth xc
#date 2024-06-20
#Attention: 通过域名获取证书的过期时间
#获取证书时间
end_date=`openssl s_client -host $1 -port 443 -showcerts </dev/null 2>/dev/null |sed -n '/BEGIN CERTIFICATE/,/END CERT/p' |openssl x509 -text 2>/dev/null |sed -n 's/ *Not After : *//p'`

if [ -n "$end_date" ];
then
 #把证书时间转换为时间戳
 end_timestamp=`date '+%s' --date "$end_date"`
 ##获取今天的时间戳
 today=`date '+%s'`
 #计算还有证书几天过期
 date1=$((($end_timestamp-$today)/86400))
 echo $date1
fi

domains.txt

2、在zabbix proxy或者zabbix server 修改zabbix配置文件
cd /etc/zabbix/zabbix_agentd.d
vi chk_pldomain.conf
UserParameter=domain.discovery,/bin/bash /etc/zabbix/script/get_doamins.sh
UserParameter=https[*],/bin/bash /etc/zabbix/script/https.sh $1
3、重启zabbix-agent 服务
systemctl restart zabbix-agent
4、登录zabbix server 创建监控模板5、编辑模板
点开刚才创建的模版,创建,自动发现规则



6、添加 监控原型7、添加监控主机,应用模板,测试。



稍等几分钟查看最新数据有没有



发现,监控原型里面的键值https已经存在了,更换一个新的,修改zabbix agnet端的配置文件。



vim /etc/zabbix/zabbix_agentd.d/chk_pldomain.conf



保存。重启zabbix agent服务
systemctl restart zabbix-agent
修改模板中的 监控原型 里面的键值


单击,最下面的,更新 按钮。

发现,过了几分钟还是同样的问题,报Cannot create item:item with the same key ……… already exits.

#####*******
经多次测试,最后发现是,{#DOMAIN_CERT} 这里的问题,这里面的值,必须是大写,如果有两个中间用下划线连接。


##最后get_doamins.sh修改后的脚本

8、添加触发器





再克隆一个,修改为,小于15天,告警程度,灾难。



####********

发现了一个问题:在监控域名对应的是ECS服务器时,证书过期时间是对的,但是当域名在,OSS SLB WAF 上面时,证书的过期时间是不对的。



原因是:检测命令少了一个参数,-sername,没有这个参数时,当检测是阿里云 OSS SLB WAF上的域名时,会自动检测到阿里的相关域名。当指定了这个-sername,就会去检测你的OSS SLB WAF 上面添加的域名,这样检测出来的时间才是正确的。

修改https.sh脚本:

#/bin/bash
#auth xc
#date 2024-06-20
#Attention: 通过域名获取证书的过期时间
#获取证书时间
end_date=`openssl s_client -host $1 -port 443 -servername $1 -showcerts </dev/null 2>/dev/null |sed -n '/BEGIN CERTIFICATE/,/END CERT/p' |openssl x509 -text 2>/dev/null |sed -n 's/ *Not After : *//p'`

if [ -n "$end_date" ];
then
 #把证书时间转换为时间戳
 end_date=`date '+%s' --date "$end_date"`
 ##获取今天的时间戳
 today=`date '+%s'`
 #计算还有证书几天过期
 date1=$((($end_date-$today)/86400))
 echo $date1
fi