Отслеживание обновлений с Zabbix

13 марта 2019

Отслеживание ключевых обновлений с помощью 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.
  • Но все они нам не нравятся.


← Назад в Блог

Подпишитесь на новые статьи: