#!/bin/bash #=============================================================================== #============================== INFORMACOES ================================== #=============================================================================== # NOME : check_apache_certificate # VERSAO : 1.0 # DESCRICAO: Plugin para Nagios/OpMon que monitora a expiracao dos certificados # de paginas https. # TIPO : Bash script # EMPRESA : Interop # SETOR : CMO # AUTOR : Otavio Campos Velho Gloria # E-MAIL : suporte@interop.com.br # CRIACAO : 06 de marco de 2013 # EDITOR : # E-MAIL : # EDICAO : # LICENCA : GPLv3 #=============================================================================== #=============================== VARIAVEIS =================================== #=============================================================================== # Informacoes do autor declare -r AUTHOR_NAME="Otavio Gloria" declare -r AUTHOR_EMAIL="suporte@interop.com.br" # Informacoes do script declare -r SCRIPT_NAME="${0##*/}" declare -r SCRIPT_VERSION='1.0' # Prefixo das mensagens declare -r OK_PREFIX="OK - " declare -r WARNING_PREFIX="WARNING - " declare -r CRITICAL_PREFIX="CRITICAL - " declare -r UNKNOWN_PREFIX="UNKNOWN - " # Codigos de saida reconhecidos pelo nagios declare -r OK_EXIT_CODE='0' declare -r WARNING_EXIT_CODE='1' declare -r CRITICAL_EXIT_CODE='2' declare -r UNKNOWN_EXIT_CODE='3' # Opcoes passadas declare WARN # Limite de alert passado por linha de CLI declare CRIT # Limite de critico passado por linha de CLI declare CERT # Arquivo do certificado passado por linha de CLI # Variaveis utilizadas no codigo declare -a EXPIRE_INFO # Dado de expiracao coletado do certificado declare DAY # Dia em que o certificado vai expirar declare MONTH # Mes em que o certificado vai expirar declare YEAR # Ano em que o certificado vai expirar declare TIME # Hora que o certificado vai expirar declare EXPIRE # Dia em que o certificado expira em segundos desde 1970 declare NOW # Dia de hoje em segundos desde 1970 declare REMAIN_DAYS # Dias que faltam para expirar #=============================================================================== #================================ FUNCOES ==================================== #=============================================================================== # Descricao : Monstra a versao atual do script e encerra # Parametros: Nenhum # Uso : print-version function print-version { echo " Author : $AUTHOR_NAME Email : $AUTHOR_EMAIL Version: $SCRIPT_VERSION " exit "$OK_EXIT_CODE" } # Descricao : Monstra o uso do script e encerra # Parametros: Nenhum # Uso : print-usage function print-usage { echo " Author : $AUTHOR_NAME Email : $AUTHOR_EMAIL Version: $SCRIPT_VERSION Usage: $SCRIPT_NAME -f [-w ] [-c ] $SCRIPT_NAME -h $SCRIPT_NAME -u $SCRIPT_NAME -v " exit "$OK_EXIT_CODE" } # Descricao : Monstra a ajuda do script e encerra # Parametros: Nenhum # Uso : print-help function print-help { echo " Author : $AUTHOR_NAME Email : $AUTHOR_EMAIL Version: $SCRIPT_VERSION Script designed to work with Nagios/OpMon monitoring tools. This sript verify the expiration date of a certificate. Usualy https certificates. Usage: $SCRIPT_NAME -f [-w ] [-c ] $SCRIPT_NAME -h $SCRIPT_NAME -u $SCRIPT_NAME -v Options: -c|--critical Critical threshold in days. Alert if certificate expire in less days the informed -f|--file Path to the certificate file -h|--help Show this help message -u|--usage show how to use this script -v|--version Show the script version -w|--warning Warning threshold in days. Alert if certificate expire in less days the informed Examples: $SCRIPT_NAME -f /etc/ssl/www.example.com.crt $SCRIPT_NAME -f /etc/ssl/www.example.com.crt -w 60 $SCRIPT_NAME -f /etc/ssl/www.example.com.crt -c 20 $SCRIPT_NAME -f /etc/ssl/www.example.com.crt -w 30 -c 20 " exit "$OK_EXIT_CODE" } # Descricao : Faz verificacoes no arquivo informado # Parametros: Nenhum # Uso : validate-file-path function validate-certificate-file { # Existe? if [ ! -e "$CERT" ] ; then echo "${UNKNOWN_PREFIX}Certificate $CERT doesn't exist" exit "$UNKNOWN_EXIT_CODE" fi # Eh um diretorio? if [ -d "$CERT" ] ; then echo "${UNKNOWN_PREFIX}Certificate $CERT isn't a file. It's a directory" exit "$UNKNOWN_EXIT_CODE" fi # Nao eh um arquivo? if [ ! -f "$CERT" ] ; then echo "${UNKNOWN_PREFIX}Certificate $CERT isn't a file" exit "$UNKNOWN_EXIT_CODE" fi # Pode ser lido? if [ ! -r "$CERT" ] ; then echo "${UNKNOWN_PREFIX}Certificate $CERT can't be read" exit "$UNKNOWN_EXIT_CODE" fi # Verifica se realmente eh um certificado if ! fgrep -q "CERTIFICATE" < "$CERT" ; then echo "${UNKNOWN_PREFIX}File $CERT isn't a certificate" exit "$UNKNOWN_EXIT_CODE" fi } # Descricao : Faz verificacoes no arquivo informado # Parametros: Nenhum # Uso : validate-file-path function validate-parameters { # Verifica se o certificado foi informado if [ -z "$CERT" ] ; then echo "${UNKNOWN_PREFIX}Certificate file must be informed." exit "$UNKNOWN_EXIT_CODE" fi # Verifica se o valor informado de warning eh um numero positivo if [ -n "$WARN" ] ; then if [[ ! $WARN =~ ^[1-9]+[0-9]*$ ]] ; then echo "${UNKNOWN_PREFIX}Warning threshold must be a positive number without preceding zeros." exit "$UNKNOWN_EXIT_CODE" fi fi # Verifica se o valor informado de critical eh um numero positivo if [ -n "$CRIT" ] ; then if [[ ! $CRIT =~ ^[1-9]+[0-9]*$ ]] ; then echo "${UNKNOWN_PREFIX}Critical threshold must be a positive number without preceding zeros." exit "$UNKNOWN_EXIT_CODE" fi fi # Se os dois limites foram informados if [ -n "$WARN" -a -n "$CRIT" ] ; then # Eles nao pode ser iguais if [ "$WARN" -eq "$CRIT" ] ; then echo "${UNKNOWN_PREFIX}Thresholds can't be igual. Critical threshold must be lower then warning threshold." exit "$UNKNOWN_EXIT_CODE" fi # O valor de critica deve ser menor que o de warning if [ "$WARN" -lt "$CRIT" ] ; then echo "${UNKNOWN_PREFIX}Critical threshold must be lower then warning threshold." exit "$UNKNOWN_EXIT_CODE" fi fi } # Descricao : Conver a sigla do mes para numero # Parametros: Nenhum # Uso : convert-month-to-number function convert-month-to-number { case "$MONTH" in Jan) MONTH="01" ;; Feb) MONTH="02" ;; Mar) MONTH="03" ;; Apr) MONTH="04" ;; May) MONTH="05" ;; Jun) MONTH="06" ;; Jul) MONTH="07" ;; Aug) MONTH="08" ;; Set) MONTH="09" ;; Oct) MONTH="10" ;; Nov) MONTH="11" ;; Dez) MONTH="12" ;; esac } #=============================================================================== #================================== MAIN ===================================== #=============================================================================== #------------------------------------------------------------------------------- # Coleta e valida os parametros passados ao script #------------------------------------------------------------------------------- # Se nenhum dado for informado, mostra a ajuda [ $# -eq 0 ] && print-help # Coleta os parametros while [ $# -ge 1 ] ; do case "$1" in # Opcoes de ajuda -h|--help) print-help ;; -u|--usage) print-usage ;; -v|--version) print-version ;; # Opcoes pertinentes ao funcionamento -f|--file) CERT="$2" ; shift ; shift ;; -w|--warn) WARN=$2 ; shift ; shift ;; -c|--crit) CRIT=$2 ; shift ; shift ;; # Parametro invalido *) echo "${UNKNOWN_PREFIX}Option $1 is invalid. Read the help before use the script man." exit "$UNKNOWN_EXIT_CODE" esac done # Valida os parametros informados validate-parameters validate-certificate-file #------------------------------------------------------------------------------- # Coleta as informacoes e as separa #------------------------------------------------------------------------------- # Coleta a informacao de expiracao do certificado EXPIRE_INFO=( $( openssl x509 -text -in "$CERT" | fgrep 'Not After :' ) ) # Pega apenas o nome arquivo do certificado. Remove o caminho. CERT="${CERT##*/}" # Separa os dados de expiracao e os trata DAY="${EXPIRE_INFO[4]}" ; [ ${#DAY} -eq 1 ] && DAY="0$DAY" MONTH="${EXPIRE_INFO[3]}" ; convert-month-to-number YEAR="${EXPIRE_INFO[6]}" TIME="${EXPIRE_INFO[5]}" # Converte para segundos as datas para poder efetuar a comparacao # 86400 segundos = 1 dia EXPIRE=$(date -d "$MONTH/$DAY/$YEAR" '+%s') NOW=$(date '+%s') WARN=$(($EXPIRE-($WARN*86400))) CRIT=$(($EXPIRE-($CRIT*86400))) # Determina quantos dias faltam para expirar o certificado REMAIN_DAYS=$((($EXPIRE-$NOW)/86400)) #------------------------------------------------------------------------------- # Coleta as informacoes e as separa #------------------------------------------------------------------------------- # Ja expirou if [ "$NOW" -gt "$EXPIRE" ] ; then echo "${CRITICAL_PREFIX}Certificate $CERT expired ${REMAIN_DAYS/-/} days ago ($DAY/$MONTH/$YEAR $TIME)" exit "$CRITICAL_EXIT_CODE" fi # Expira hoje if [ "$NOW" -eq "$EXPIRE" ] ; then echo "${CRITICAL_PREFIX}Certificate $CERT expire today at $TIME." exit "$CRITICAL_EXIT_CODE" fi # CRITICAL if [ "$NOW" -ge "$CRIT" ] ; then echo "${CRITICAL_PREFIX}Certificate $CERT expire in $REMAIN_DAYS days ($DAY/$MONTH/$YEAR $TIME)" exit "$CRITICAL_EXIT_CODE" fi # WARNING if [ "$NOW" -ge "$WARN" ] ; then echo "${WARNING_PREFIX}Certificate $CERT expire in $REMAIN_DAYS days ($DAY/$MONTH/$YEAR $TIME)" exit "$WARNING_EXIT_CODE" fi # OK echo "${OK_PREFIX}Certificate $CERT expire in $REMAIN_DAYS days ($DAY/$MONTH/$YEAR $TIME)" exit "$OK_EXIT_CODE"