Контроль сертификатов OpenVPN и отчёт на почту об окончании срока действия сертификата
Добавлено: 15 июл 2025, 14:14
Итак, понастроил VPN серверов тучу... И пришло время истечения сроков действия сертификатов пользователей. Причём в самые неподходящие моменты. Пришлось написать скрипт, отслеживающий сроки действия сертификатов и информирование об этом на почту.
место сохранения журнала отправленных уведомлений:
Сам скрипт:
Записываем в cron
место сохранения журнала отправленных уведомлений:
Код: Выделить всё
touch /var/log/openvpn/check-expare.log
Код: Выделить всё
touch /etc/openvpn/check-expare.sh
chmod +x /etc/openvpn/check-expare.sh
Код: Выделить всё
#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
HOSTNAME=`cat /etc/hostname`
MAILADM=admin@padonak.su
# Указываем месторасположение файлов сертификатов
KEYS=/etc/openvpn/easy-rsa/pki/issued
# Указываем имя и местораположение индекса используемых сервером сертификатов
INDEX=/etc/openvpn/easy-rsa/pki/index.txt
# Указываем имя и месторасположение индекса рассылки
LOG=/var/log/openvpn/check-expare.log
# Задаём временные метки для инициирования высылки уведомления
AMONTH=2678400
AWEEK=604800
ATREEDAY=259200
# Запускаем перебор строк файла индекса (отрабатываем только задействованные, не отозванные)
cat $INDEX | grep '^V' | while read LINE
do
# Получаем имя сертификата
CN=`echo $LINE | awk '{print $5}' | cut -c 5-`
# Получаем дату начала действия сертификата
DFROM=`cat ${KEYS}/${CN}.crt | grep -i "Not Before" | awk 'match($0,/: .+/) {print substr($0, RSTART, RLENGTH)}' | cut -c 3- | rev | cut -c 1- | rev`
# Получаем дату окончания действия сертификата
DTO=`cat ${KEYS}/${CN}.crt | grep -i "Not After" | awk 'match($0,/: .+/) {print substr($0, RSTART, RLENGTH)}' | cut -c 3- | rev | cut -c 1- | rev`
# Приводим значения полученных дат к единому образцу - времени, прошедшему от начала "эпохи" UNIX (seconds since 1970-01-01 00:00:00 UTC)
DCURR=`date +%s`
DFROM=`date --date="${DFROM}" +%s`
DTO=`date --date="${DTO}" +%s`
# Вычисляем, сколько секунд осталось до окончания действия сертификата
DEXP=`expr ${DTO} - ${DCURR}`
# Проверяем, не настало-ли время
if [ ${DEXP} -lt ${ATREEDAY} ]
then
# Если событие по сроку информирования для проверяемого сертификата не зафиксировано, то делаем это
if [ "`cat ${LOG} | grep -i ${CN} | grep -i ATREEDAY`" == "" ] || [ `cat ${LOG} | sort --reverse | grep -i ${CN} | grep -i --max-count=1 ATREEDAY | awk '{print $1}'` -lt ${DFROM} ]
then
# Высылаем уведомление на адрес электронной почты, указанный при создании сертификата
echo -e "Content-Type: text/plain; charset="utf-8"\nSubject: Внимание! VPN server ${HOSTNAME} ключ для \"${CN}\"\nДо окончания срока действия сертификата (VPN) удалённого доступа осталось три дня." | sendmail -F${HOSTNAME} ${MAILADM}
# Записываем в журнал событие
echo "${DCURR} ${CN} ATREEDAY" >> ${LOG}
fi
else
if [ ${DEXP} -lt ${AWEEK} ]
then
if [ "`cat ${LOG} | grep -i ${CN} | grep -i AWEEK`" == "" ] || [ `cat ${LOG} | sort --reverse | grep -i ${CN} | grep -i --max-count=1 AWEEK | awk '{print $1}'` -lt ${DFROM} ]
then
echo -e "Content-Type: text/plain; charset="utf-8"\nSubject: Внимание! VPN server ${HOSTNAME} ключ для \"${CN}\"\nДо окончания срока действия сертификата (VPN) удалённого доступа осталась одна неделя." | sendmail -F${HOSTNAME} ${MAILADM}
echo "${DCURR} ${CN} AWEEK" >> ${LOG}
fi
else
if [ ${DEXP} -lt ${AMONTH} ]
then
if [ "`cat ${LOG} | grep -i ${CN} | grep -i AMONTH`" == "" ] || [ `cat ${LOG} | sort --reverse | grep -i ${CN} | grep -i --max-count=1 AMONTH | awk '{print $1}'` -lt ${DFROM} ]
then
echo -e "Content-Type: text/plain; charset="utf-8"\nSubject: Внимание! VPN server ${HOSTNAME} ключ для \"${CN}\"\nДо окончания срока действия сертификата (VPN) удалённого доступа остался один месяц." | sendmail -F${HOSTNAME} ${MAILADM}
echo "${DCURR} ${CN} AMONTH" >> ${LOG}
fi
fi
fi
fi
done
exit 0
Код: Выделить всё
vim /etc/crontab
Код: Выделить всё
00 5 * * * root /etc/openvpn/check-expare.sh > /dev/null 2>&1