Devops's Blog

Мониторинг сертификатов на zabbix

Пути до сертификатов будем брать из haproxy.cfg

Пишем скрипт haproxy-discovery.sh

Скрипт парсит haproxy.cfg и формирует два файла
haproxy-discovery.txt - ключ(#SSL_CRT) для zabbix и путь до сертификата в формате json
haproxy-discovery_info.txt - путь до сертификата и исколько дней осталось

					    
#haproxy-discovery.sh
#!/bin/bash
readonly DIR_SEP_1=" "


LOG_FILE=/etc/zabbix/script/mon_crt_haproxy/haproxy-discovery_info.txt
LOG_FILE_2=/etc/zabbix/script/mon_crt_haproxy/haproxy-discovery.txt
rm -f $LOG_FILE
touch $LOG_FILE
touch $LOG_FILE_2

day_crt()
{
  end_date=$(sudo /bin/openssl x509 -enddate -noout -in $1)
  end=$(cut -d= -f2- <<<"$end_date")
  end_date=`date -d "$end" '+%s'`
  curr_date=`date '+%s'`
  diff=$(( $end_date - $curr_date ))
  let "days = $diff / 86400"
  if ! cat "$LOG_FILE" | grep -w "$1" > /dev/null; then
      echo $1 $days >> $LOG_FILE
      tmp=$(echo "{"\""{#SSL_CRT}\":"\"$1\"" },")
      json=$json$tmp
   fi

}



FILES=$(cat /etc/haproxy/haproxy.cfg |grep -v '^$\|^\s*\#' | grep " ssl " | grep -oP ' ssl \K.*' | grep -oP 'crt \K.*' | sed  's/crt //g')

for ((i=0; i<${#FILES[@]}; i++))
 do
   array_v1=(${FILES[$i]//${DIR_SEP_1}/ })
      for ((j=0; j<${#array_v1[@]}; j++))
      do
         if [[ ${array_v1[$j]} == *".pem" ]] || [[ ${array_v1[$j]} == *".crt" ]]; then
            day_crt ${array_v1[$j]}
         fi
      done
done

json=$(echo $json | sed 's/.$//')
printf "{\"data\":[" > $LOG_FILE_2
printf "$json" >> $LOG_FILE_2
printf "]}" >> $LOG_FILE_2
chown -R zabbix:zabbix /etc/zabbix/script/
					    
				    

[root@srv v.senkevich]# cat /etc/zabbix/script/mon_crt_haproxy/haproxy-discovery_info.txt
/etc/pki/letssl/s33.ru/certificate.pem 33
/etc/pki/letssl/cyprusairways.com/certificate.pem 33
/etc/pki/letssl/s33airlines.com/certificate.pem 58
/etc/pki/letssl/s33-airlines.com/certificate.pem 33
/etc/pki/letssl/api.s33.ru/cert.pem 258
/etc/pki/letssl/web.s33.ru/certificate.pem 33
/etc/pki/letssl/cp.web.s33.ru/certificate.pem 33
/etc/pki/letssl/web.cyprusairways.com/certificate.pem 33
/etc/pki/letssl/w7-qa/certificate.pem 33				    

[root@srv v.senkevich]# cat /etc/zabbix/script/mon_crt_haproxy/haproxy-discovery.txt
{"data":[{"{#SSL_CRT}":"/etc/pki/letssl/s33.ru/certificate.pem" },{"{#SSL_CRT}":"/etc/pki/letssl/cyprusairways.com/certificate.pem" },{"{#SSL_CRT}":"/etc/pki/letssl/s33airlines.com/certificate.pem" },{"{#SSL_CRT}":"/etc/pki/letssl/s33-airlines.com/certificate.pem" },{"{#SSL_CRT}":"/etc/pki/letssl/api.s33.ru/cert.pem" },{"{#SSL_CRT}":"/etc/pki/letssl/web.s33.ru/certificate.pem" },{"{#SSL_CRT}":"/etc/pki/letssl/cp.web.s33.ru/certificate.pem" },{"{#SSL_CRT}":"/etc/pki/letssl/web.cyprusairways.com/certificate.pem" },{"{#SSL_CRT}":"/etc/pki/letssl/w7-qa/certificate.pem" }]}

Ложим в крон


*/30 * * * * /etc/zabbix/script/mon_crt_haproxy/haproxy-discovery.sh

Пишем скрипт analiz_haproxy-discovery.sh, нужен будет для ключа ЭД


[root@srv mon_crt_haproxy]# cat analiz_haproxy-discovery.sh
cat /etc/zabbix/script/mon_crt_haproxy/haproxy-discovery_info.txt | grep $1 | awk '{print $2}'

Добавляе конфиг для zabbix agent и рестартим его


[root@srv mon_crt_haproxy]# cat /etc/zabbix/zabbix_agentd.d/userparameter_haproxy-ssl.conf
UserParameter=haproxy_ssl_days.discovery[*],cat /etc/zabbix/script/mon_crt_haproxy/haproxy-discovery.txt
UserParameter=hp_ssl.days[*],/etc/zabbix/script/mon_crt_haproxy/analiz_haproxy-discovery.sh $1

Создаем шаблон haproxy_ssl_days

image

Создаем правило обнаружение Ключ - haproxy_ssl_days.discovery

image

Создаем прототип ЭД Ключ - hp_ssl.days[{#SSL_CRT}]

image

Создаем прототип триггера

image

Добавляем нужный host в шаблон , ЭД и триггеры создатуться автоматом

image