Отслеживание ключевых обновлений с помощью Zabbix
- С одной стороны, мы не любим обновления:
- из-за перерывов в обслуживании и необходимости согласовывать их с клиентами,
- из-за ночных работ и вечного риска получить на выходе тыкву вместо кареты, если что-то пойдёт не так ©
- из-за того, что вместо старых знакомых проблем (или в дополнение к ним) появятся новые неизвестные.
- С другой стороны, некоторые обновления безопасности необходимо устанавливать как можно быстрее:
- в первую очередь это касается сетевых сервисов,
- ..особенно публичных,
- ..особенно работающих с правами суперпользователя,
- ..особенно имеющих длинную историю найденных уязвимостей.
- Обновления должны происходить под обязательным присмотром администратора (см. выше про риск непредвиденных проблем).
- Поэтому вместо автоматической установки ключевых обновлений нам требуется инструмент для оповещения администраторов об их появлении.
- Т.к. у нас уже используется Zabbix для мониторинга всего на свете, отслеживание обновлений имеет смысл так же поручить ему.
- Список важных для нас пакетов мы составляем вручную — далеко не все обновления безопасности требуют немедленной реакции, и их мы в этот список не включаем.
Создаём шаблон:
- Template name: Custom-yum
- Groups: Custom-templates
- Applications: Yum
- Discovery rule:
- Name,Key: yum.watch_updates
- Update interval: 10800
- Item prototype:
- Name: Yum contains updated version for {#PKGNAME}
- Key:
yum.check_update[{#PKGNAME}]
- Update interval: 10800
- Applications: Yum
- Trigger prototype:
- Severity: Warning
- Name: Yum contains updated version for {#PKGNAME} on {HOSTNAME}
- Expression:
{Custom-yum:yum.check_update[{#PKGNAME}].str({#PKGNAME}.)}=1
- Allow manual close: Yes
Агент:
- В /etc/zabbix/zabbix_agentd.conf: увеличиваем таймаут так, чтобы yum check-update успевал отработать:
Timeout=15
Создаём /etc/zabbix/zabbix_agentd.d/yum-check-updates.conf (список в watch_updates дополните под свои нужды):
UserParameter=yum.check_update[*],/etc/zabbix/scripts/yum-check-updates $1
UserParameter=yum.watch_updates,echo '{ "data": [ { "{#PKGNAME}" : "openvpn" }, { "{#PKGNAME}" : "openssh" } ] }'
Создаём /etc/zabbix/scripts/yum-check-updates (и делаем исполняемым с помощью "chmod +x"):
#!/bin/sh -e
Print_data() { LANG=C yum -q check-updates || : ; }
MAXAGE=10800 # ..3 hours
MAXBGAGE=7200 # ..2 hours
. "$(dirname "$0")/CACHE_HELPERS"
test -s "$CACHE" &&
awk "/^$1\./ { print \$2; exit }" "$CACHE"
Примечания:
- Список watch_updates допустимо делать избыточным — если какой-то пакет из списка не установлен, проверка его игнорирует.
- Про структуру каталогов и CACHE_HELPERS читайте в нашей заметке про кэширование в Zabbix.
Небольшая ошибка, исправление которой мы оставили на потом:
- По умолчанию кэш метрик размещается в /var/run/zabbix, т.е. tmpfs.
- Из-за этого первое чтение метрик после старта системы не может обновить его в фоновом режиме, а должно создавать с нуля.
- Т.к. yum check-updates может работать непредсказуемо долго, первое чтение нередко завершается ошибкой по таймауту.
Возможные варианты исправлений:
- Переместить кэш на постоянный раздел.
- Увеличить значение Timeout в zabbix_agentd.conf.
- Написать [Service] ExecStartPre=/usr/bin/yum -q check-updates в /etc/systemd/system/zabbix-agent.service.d/YumCacheRefresh.conf.
- Но все они нам не нравятся.