Вроде бы и задача не самая новая. И статей в гугле воз и маленькая тележка. Но почему то у меня ушла почти неделя на все эксперименты и топтания по всевозможным граблям.

Итак, задача: Сервер CentOS 7, установлен комплект LEMP, установлен сервер Zabbix 2.4.6. Нужно настроить отправку уведомлений админам на почту.

Оговорка — CentOS ставился по методу «секс и еще раз секс» — minimal installations. Ввиду этого некоторые пакеты «должные быть из коробки» не работают, ибо их никто еще не поставил.

После курения ряда мануалов стало понятно, что для отправки почты нам надо, как минимум, почтовую прокладку умеющую SMTP с авторизацией и скрипт для Zabbix.

В качестве почтового клиента используем ssmtp.

yum install ssmtp

Затем в /etc/ssmtp/ssmtp.conf

root=mailbox@mail.server #почтовый ящик zabbixa
mailhub=smtp.mail.server #Если нужен TLS, то указывает еще порт ":465"
rewriteDomain=mail.server
AuthUser=mail_username
AuthPass=mail_password
FromLineOverride=YES
#UseTLS=YES #если нужен TLS раскомментировать эту строку

Дальше была попытка выставить ssmtp в качестве подмены для sendmail и использовать команду mail (пакет mailx) для отправки почты, но письма, хоть и приходили, были не удобочитаемыми (текст приходил не в поле текста, а как бинарное вложение).

В итоге пришлось поставить mutt, в качестве замены mail.

yum install mutt

Смотри где у нас домашний каталог пользователя zabbix:

getent passwd zabbix
zabbix:x:997:996:Zabbix Monitoring System:/var/lib/zabbix:/bin/bash

Затем создаем файл настроек mutt в домашнем каталоге zabbix

touch /var/lib/zabbix/.muttrc
echo set from="mailbox@mail.server" >> /var/lib/zabbix/.muttrc
set realname ="My Zabbix Monitoring" >> /var/lib/zabbix/.muttrc
set sendmail="/usr/sbin/ssmtp" >> /var/lib/zabbix/.muttrc
set charset="utf-8" >> /var/lib/zabbix/.muttrc
set copy=no >> /var/lib/zabbix/.muttrc
chown zabbix:zabbix /var/lib/zabbix/.muttrc

Теперь надо написать скрипт для отправки почты и положить его в /usr/lib/zabbix/alertscripts. Имя скрипта пусть будет: send_mail.sh:

#!/bin/bash
to=$1
subject=$2
body=$3

echo `date`" mail sended to:" $to >> /var/log/zabmail.log #после завершения отладки закомментировать эти строки
echo `date`" mail subj:" $subject >> /var/log/zabmail.log #после завершения отладки закомментировать эти строки
echo `date`" mail text:" $body >> /var/log/zabmail.log #после завершения отладки закомментировать эти строки

echo $body | mutt -s "$subject" "$to"

Теперь настройка самого zabbix. В Web-интерфейсе: Администрирование — Способы оповещений — Email

Тип: Скрипт
Имя скрипта: send_mail.sh
Активировано: Да (cheked)


Проверяем конфиг zabbix (/etc/zabbix/zabbix_server.conf)

AlertScriptsPath=/usr/lib/zabbix/alertscripts

Перезапускаем zabbix сервер:

service zabbix-server restart

И вот, если мы, в нарушение всех гайдлайнов, отключили SELinux, у нас все работает и оповещения ходят.

Однако, при включенном SELinux писем не было и нет. Переходим к дрессировке SELinux. Для ускорения дальнейшей настройки удобно завести какой-нибудь триггер, которому мы сможем легко и часто менять состояние (я не заморачивался и использовал перезагрузку сервера с zabbix, т.к. на этой виртуалке у меня никаких других нагрузок пока не было). Для выполнения настройки SELinux понадобится всего 4 действия, но их придется повторить столько раз сколько потребуется в вашей системе (у меня на это ушло 5 или 6 итераций).

Для личного «удобства» я собирал разрешающие правила не в один файл модуля SELinux, а в отдельный файл для каждой итерации, чтобы потом можно было внимательнее рассмотреть их содержимое. Поэтому имя модуля использовалось по схеме ZabSeModuleN, где N в конце имени файла — номер итерации, в итоге получается группа файлов ZabSeModule1.te, ZabSeModule1.mod, ZabSeModule1.pp, ZabSeModule2.te, ZabSeModule2.mod, ZabSeModule2.pp и т.д.

• ausearch -m avc -ts today
Если вывод отличается от — выполняем действия ниже.
• cat /var/log/audit/audit.log | audit2allow -m ZabSeModuleN > ZabSeModuleN.te
• checkmodule -M -m -o ZabSeModuleN.mod ZabSeModuleN.te
• semodule_package -o ZabSeModuleN.pp -m ZabSeModuleN.mod
• semodule -i ZabSeModuleN.pp
• rm /var/log/audit/audit.log
• reboot

Перезагрузка только метод вызвать сработку триггера «Zabbix server restarted»

Для любителей порядка — после получения полного списка правил SELinux, их можно собрать в один .te файл, и, удалив из системы предыдущие модули, создать и установить один новый.

По результату оповещения от Zabbix ходят регулярно и с удовольствием.

В процессе настройки были честно использованы статьи:
Лиссяра — 'Решение проблем' или 'Ковыряния в Линуксе — 2' (с) Fomalhaut
Денис Волков — Настройка политик безопасности SELinux
NetSkills — Zabbix. Видео урок №4. Настройка email оповещений. Часть 2 (zabbix gmail)

Комментарии (6)


  1. evg_krsk
    23.09.2015 12:47

    Чуть позже вы столкнётесь с тем, что при перебоях связности будут теряться письма (насколько помнится, ssmtp не хранит очередь на диске).

    Вообще, можно было бы и прописать сервер заббикса в исключения, не требуя у него авторизацию.

    Я для себя пришел к тому, что поставил на этой же машине полноценный MTA в режиме smarthost и задал заббиксу сервер почты как localhost. Авторизацию с локалхоста, понятно, не требуют. При отсутствии возможности прописать машину в исключения можно и SASL-авторизацию исходящей почты настроить. Так что при восстановлении связности у машины она перешлёт письма из очереди на диске.


    1. VyacheslavKinzerskiy
      23.09.2015 15:00

      Спасибо за подсказку, возьму этот момент на контроль. Прописать сервер в исключения соблазн был, но есть планы по выносу почтовика за периметр, и тогда это уже перестанет быть возможным.


      1. fleaump
        24.09.2015 12:41

        Поставь на мобилу pushbullet и прикрути отправку сообщений

        В настройках оповещений в заббиксе прописываешь только не мыло кому отправлять, а API KEY

        #!/bin/sh

        /usr/bin/curl htt ps://api.pushbullet.com/api/pushes \
        -u $1: \
        -d type=«note» \
        -d title="$2" \
        -d body="$3" \
        -X POST

        И сообщения будут сыпать на мобилу, и в браузер, если поставить расширение их. Заодно между браузером и мобилой появится тузла для обмена ссылками\файлами


  1. yosemity
    23.09.2015 17:50

    Использую Debian. Почта внешнаяя, на яндексе. Все, что до описания SELinux делается одним простенькм скриптом с использованием sendEmail:

    скриптик
    #!/bin/sh

    smtpemailfrom=zabbix@domain.ru
    zabbixemailto="$1"
    zabbixsubject="$2"
    zabbixbody="$3"
    smtpserver=smtp.yandex.ru
    smtplogin=zabbix@domain.ru
    smtppass=Password

    /usr/bin/sendEmail -f $smtpemailfrom -t $zabbixemailto -u $zabbixsubject -m $zabbixbody -s $smtpserver:25 -xu $smtplogin -xp $smtppass >> /var/log/sendemail/$zabbixemailto.log


  1. blind_oracle
    23.09.2015 22:48
    +5

    OMG. Зачем так сложно?!

    Ставим постфикс и если есть внешний релей без авторизации, то:

    # cat /etc/postfix/main.cf
    mynetworks = 127.0.0.0/8
    relayhost = [x.x.x.x]
    

    Если нужна авторизация, то ещё капельку сложнее:
    smtp_sasl_auth_enable = yes
    smtp_tls_security_level = encrypt
    smtp_sasl_tls_security_options = noanonymous
    smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
    

    в sasl_passwd свои данные.

    В заббиксе указываем сервер почтовый localhost:25
    Всё! Зачем нужны скрипты какие-то?


  1. KorP
    23.09.2015 23:14

    эм… у меня из коробки на зимбру мою прекрасно всё приходит…