From 85704219176b79b5e9687fc328d73acb2258f78c Mon Sep 17 00:00:00 2001 From: Long Chen Date: Wed, 3 May 2017 15:28:43 +0100 Subject: [PATCH] Initial commit. --- README.md | 16 +- Templates/SSL_Certificates.xml | 189 ++++++++++++++++++ .../ssl/sslCertDomains.json | 12 ++ zabbix-externalscripts/sslCertExpiryCheck.sh | 38 ++++ zabbix-externalscripts/sslDomainsDiscovery.sh | 16 ++ 5 files changed, 270 insertions(+), 1 deletion(-) create mode 100644 Templates/SSL_Certificates.xml create mode 100644 zabbix-externalscripts/ssl/sslCertDomains.json create mode 100644 zabbix-externalscripts/sslCertExpiryCheck.sh create mode 100644 zabbix-externalscripts/sslDomainsDiscovery.sh diff --git a/README.md b/README.md index 66d151c..4edc5f3 100644 --- a/README.md +++ b/README.md @@ -1 +1,15 @@ -# zabbix-ssl \ No newline at end of file +# Zabbix-SSL + +SSL certificates expiry date monitoring separated by groups. + +**Installation** + +Pre-requisite: Zabbix Sender, Openssl Client, JQ - https://stedolan.github.io/jq/ + +1. Copy the scripts and SSL configuration to zabbix external scripts directory: /usr/lib/zabbix/externalscripts + +2. Add domains to the configuration file: ssl/sslCertDomains.json + +3. Create zabbix host and link with SSL template, add macro to the host: {$DOMAIN_GROUP}, macro value should match the group name in the SSL configuration file. + +4. Create a cron job to send data to the zabbix host, see description in "sslCertExpiryCheck.sh" diff --git a/Templates/SSL_Certificates.xml b/Templates/SSL_Certificates.xml new file mode 100644 index 0000000..b898811 --- /dev/null +++ b/Templates/SSL_Certificates.xml @@ -0,0 +1,189 @@ + + + 3.2 + 2017-05-03T14:19:38Z + + + Templates + + + + + + diff --git a/zabbix-externalscripts/ssl/sslCertDomains.json b/zabbix-externalscripts/ssl/sslCertDomains.json new file mode 100644 index 0000000..9266585 --- /dev/null +++ b/zabbix-externalscripts/ssl/sslCertDomains.json @@ -0,0 +1,12 @@ +{ + "DomainGroup1": [ + {"domain": "www.a.com"}, + {"domain": "www.b.com"}, + {"domain": "www.c.com"} + ], + "DomainGroup2": [ + {"domain": "www.d.com"}, + {"domain": "www.e.com"}, + {"domain": "www.f.com"} + ] +} \ No newline at end of file diff --git a/zabbix-externalscripts/sslCertExpiryCheck.sh b/zabbix-externalscripts/sslCertExpiryCheck.sh new file mode 100644 index 0000000..2ff4a2c --- /dev/null +++ b/zabbix-externalscripts/sslCertExpiryCheck.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +#Author: Long Chen +#Date: 25/01/2017 +#Description: A script to send SSL certificates expiry date to zabbix with zabbix sender +#Requires: zabbix sender, openssl client, jq - https://stedolan.github.io/jq/ +#Set up cron job to run hourly, example setup below: +#SHELL=/bin/bash +#PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/lib/zabbix/externalscripts +# SSL certificates monitoring, run hourly +#0 * * * * sslCertExpiryCheck.sh DomainGroup1 ZabbixHost1 &>/dev/null +#5 * * * * sslCertExpiryCheck.sh DomainGroup2 ZabbixHost2 &>/dev/null + +# Query domains in a group +DOMAIN_GROUP=$1 +ZABBIX_HOST=$2 +SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )" +ALL_DOMAINS=$SCRIPT_DIR"/ssl/sslCertDomains.json" +QUERY_DOMAINS=$(eval "cat $ALL_DOMAINS | jq -r '."$DOMAIN_GROUP"[] .domain' | xargs 2>/dev/null") + +get_SSL_Certs_Expirydate() { + for domain in $QUERY_DOMAINS; do + expiry_date=$(timeout 3 openssl s_client -host "$domain" -port 443 -servername "$domain" -showcerts /dev/null | sed -n '/BEGIN CERTIFICATE/,/END CERT/p' | openssl x509 -text 2>/dev/null | sed -n 's/ *Not After : *//p') + if [ -n "$expiry_date" ]; then + expiry_date_unix=$(date '+%s' --date "$expiry_date") + else + expiry_date_unix=0 + fi + echo $ZABBIX_HOST" ssl.cert.expirydate["$domain"] "$expiry_date_unix +done +} + +result=$(get_SSL_Certs_Expirydate | /usr/bin/zabbix_sender -c /etc/zabbix/zabbix_agentd.conf -i - 2>&1) +response=$(echo "$result" | awk -F ';' '$1 ~ /^info/ && match($1,/[0-9].*$/) {sum+=substr($1,RSTART,RLENGTH)} END {print sum}') +if [ -n "$response" ]; then + echo "$response" +else + echo "$result" \ No newline at end of file diff --git a/zabbix-externalscripts/sslDomainsDiscovery.sh b/zabbix-externalscripts/sslDomainsDiscovery.sh new file mode 100644 index 0000000..3524ed6 --- /dev/null +++ b/zabbix-externalscripts/sslDomainsDiscovery.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +#Author: Long Chen +#Date: 25/01/2017 +#Description: A script to get a list of domains in json format +#Requires: jq - https://stedolan.github.io/jq/ + +DOMAIN_GROUP=$1 +SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )" +ALL_DOMAINS=$SCRIPT_DIR"/ssl/sslCertDomains.json" +QUERY_DOMAINS=$(eval "cat $ALL_DOMAINS | jq -r '."$DOMAIN_GROUP"[] .domain' | xargs 2>/dev/null") + +for domain in $QUERY_DOMAINS; do + domainlist="$domainlist,"'{"{#DOMAIN}":"'${domain# }'"}' +done +echo '{"data":['${domainlist#,}']}' \ No newline at end of file