Zabbix监控SSL证书的有效期
使用zabbix监测SSL证书的有效期
一、使用python脚本监控证书
1.1 创建python脚本
vim /etc/zabbix/User_scripts/ssl_cert_check.py
#脚本可以放在任何目录中,本示例中在zabbix-agent目录中创建了一个User_scripts目录用来存放一系列用户自定义脚本。1.2 python脚本内容
#!/usr/bin/python
import socket
import ssl
import datetime
import argparse
def ssl_expiry_datetime(hostname,port):
ssl_date_fmt = r'%b %d %H:%M:%S %Y %Z'
context = ssl.create_default_context()
conn = context.wrap_socket(socket.socket(socket.AF_INET),server_hostname=hostname,)
#3 second timeout because Lambda has runtime limitations
conn.settimeout(3.0)
conn.connect((hostname, int(port)))
ssl_info = conn.getpeercert()
#parse the string from the certificate into a Python datetime object
return datetime.datetime.strptime(ssl_info['notAfter'], ssl_date_fmt)
def ssl_valid_time_remaining(hostname,port):
"""Get the number of days left in a cert's lifetime."""
expires = ssl_expiry_datetime(hostname,port)
return expires - datetime.datetime.utcnow()
parser = argparse.ArgumentParser(description='returns the time before expiration of certificate')
#parser.add_argument("-c","--hostname", help="hostname of the certificate you want to check")
parser.add_argument("hostname", help="hostname of the certificate you want to check")
parser.add_argument("port", help="port of the hostname you want to connection")
args = parser.parse_args()
expire = ssl_valid_time_remaining(args.hostname,args.port)
print int(round(datetime.timedelta.total_seconds(expire), 0))此脚本内容为《Zabbix企业级分布式监控系统》(第2版)中第10章提供的代码。
我在此基础上进行了略微的改动,以适应更多的情况。
二、配置zabbix自定义监控项(key)
2.1 添加用户参数
vim /etc/zabbix/zabbix-agent.conf
#编辑zabbix-agnet的配置文件添加UserParameter
UserParameter=ssl_cert_check[*],/etc/zabbix/user_script/ssl_cert_check.py \$1 \$2
#这里对用户参数进行一下解释。
UserParameter=
#用户参数固定开头
ssl_cert_check[*],
#这是zabbix自定义的监控项名称即key,可以自己按需要设置。后面的"[*]"表示此监控项需要提供参数。
user_script/ssl_certificates_check.py
#这里指定了需要执行的脚本的路径,及我们创建的python脚本
\$1 \$2
#这里表示这个监控系需要2个参数。(在这里是证书的域名 和链接时的端口)2.2 重启zabbix-agent
systemctl restart zabbix-agent2.3 使用zabbix_get命令进行测试
zabbix_get -s 192.168.1.1 -k ssl_cert_check[www.baidu.com,443]
13136353
#测试百度的ssl证书有效期。可以看到返回的时间单位为秒。成功。
#这里对zabbix_get命令的参数进行一下解释
zabbix_get -s 192.168.1.1
#这里指定的是zabbix-agent的ip地址
-k ssl_cert_check[www.baidu.com,443]
#这里-k指定刚刚自定义的监控项(key),并且此监控项还有2个参数,参数之间使用逗号分隔,写在"[]"里面。
#第一个参数是证书的域名,第二个参数是域名监听的端口。
#这里在原书中的代码,默认使用的是443端口。我添加了第二个参数,可以指定端口号。这样绑定在非常规端口的证书也可以监测了。三、在zabbix内新建监控项
- 由于返回的剩余时间值为秒,因此在监控项的单位中我们设置为"s"。系统会自动识别,zabbix会转换为类似“7m 2d 8h”的格式,意为7个月2天8小时。
- 在图中我设置的更新间隔为10s,是为了测试方便。实际情况下1天更新一次就可以了。
四、建立触发器
- 这里设置为有效期少于30天则会报警。
- 当ssl证书更新后,有效期大于30天,则报警解除。