Пришла задача организовать сбор логов на почтовом сервере Postfix, который развёрнут на Ubuntu Server. Заказчика интересуют логи отправки писем в виде JSON. Он хочет, чтобы почтовый сервер на каждую отправку письма отчитывался — передавал по curl данные из лога. Поможет нам в этом непростом деле NXLog.
NXLog — это высокопроизводительное многоплатформенное решение для управления логами.
Решение существует как в бесплатном исполнении Community Edition, так и в платном — Enterprise Edition. Сравнение редакций:
Бесплатная редакция полностью удовлетворяет всем требованиям нашей задачи:
- Функции NXLog
- Отправка логов Postfix в файл
- Отправка логов Postfix по HTTP
- Установить Postfix
- Настройка Postfix
- Настройка формата почтового ящика
- Аутентификация SMTP
- Настройка аутентификации SMTP
- Настройка TLS
- Результат первоначальной конфигурации
- САСЛ
- Настройка SASL
- Проверьте настройки
- Устранение неполадок
- Бегство от chroot
- СМТПС
- Просмотр журнала
- Увеличить детализацию регистрации
- Регистрация доставки почты
- Увеличить многословность демона
- Журнал отладочной информации SASL
Функции NXLog
У нас почтовый сервер Postfix работает на ОС Ubuntu 16.04.

Мануал по установке на Debian нам подойдёт:
В списке можно найти нужную для нашей ОС версию дистрибутива. Однако, нам она не очень интересна, потому что не Community Edition.

Переходим на страничку загрузки пакетов для CE:

Выбираем пакет для нашей операционной системы и скачиваем.

No thanks, just start my download.
Загружаем пакет на сервер и пробуем установить:
dpkg -i nxlog-ce_3.1.2319_ubuntu16_amd64.deb

И у нас ничего не устанавливается!

Есть проблемы зависимостей. Удаляем пакет:
apt-get remove nxlog-ce
Смотрим в документацию и видим волшебную надпись:
If dpkg returned errors about uninstalled dependencies, use apt-get to install them and complete the NXLog installation.
Ну ладно, ставим зависимости:
apt-get install libapr1
apt-get -f install
Повторно устанавливаем пакет NXLog:

И у нас всё устанавливается!
Автоматически запускается служба nxlog:
service nxlog status

Конфигурационный файл находится по адресу:

И там сейчас находится пример конфигурации.

Данный пример нам не нужен, стираем всё, будем настраивать обработку логов Postfix.
Отправка логов Postfix в файл
Для начала просто убедимся в том, что nxlog работает. Для этого организуем запись логов в файл: /var/log/smtp.log. А данные будем брать из логов Postfix: /var/log/mail.log.
Мы будем преобразовывать данные в формат JSON, в конфиге будет модуль xm_json:
Для получения данных из файла /var/log/mail.log используем модуль im_file:
Целиком взял этот блок из документации.
Для записи данных в файл /var/log/smtp.log используем модуль om_file:
В итоге получаем:
Перезапускаем службу и смотрим что у нас в логе NXLog.
service nxlog restart

А у нас не хватает прав на чтение файла /var/log/mail.log. Дадим права. Я пока тестирую, делаю совсем просто, добавляю пользователя nxlog в группу администраторов:


Нет доступа к файлу /var/log/smtp.log. Да у нас просто нет такого файла, создадим.
cd /var/log
touch smtp.log
chown nxlog: ./smtp.log

И у нас всё заработало.

Логи Postfix считываются из файла /var/log/mail.log, преобразуются в JSON и записываются в файл /var/log/smtp.log.
Отправка логов Postfix по HTTP
Почему-то в документации странный конфиг и регулярное выражение. Переделал регулярку под рабочий вариант:
I am running OS X 10.12.3. I do not have the OS X Server package installed, but I know postfix comes as part of the standard (non-server) installation.
I have the occasional need to send emails from the command line and although I can send emails just fine using the ‘mail’ command, I cannot for the life of me find any kind of log that shows the progress and/or status of a sent mail item.
Despite what this answer says (mail and mailx fail to send emails to gmail), /var/log/mail.log does not exist, at least not on Sierra. I have scoured the config files in /etc/postfix trying to find a reference to a log directory but didn’t find one. I’ve even tried using the -mtime option of the find command to locate any changed files immediately after sending an email, but to no avail. Все, что приходит на ум, — это места временного хранения в /var/spool/postfix, но ни один из этих файлов на самом деле не является просто старым файлом журнала.
Я прочитал этот пост (Есть ли документация по новой системе ведения журнала macOS Sierra?) о новом подходе к ведению журнала в Sierra, но это не решило мою проблему. Я проверил system.log, и хотя есть несколько сообщений, содержащих постфикс, они касаются только выхода службы, а не отправки почтовых сообщений.
Делает ли postfix запись в журнале Sierra, когда вы отправляете электронное письмо?
Будем очень признательны за любую информацию по этой теме.
Это ошибка в системном журнале, но иллюстрирующая распространенную проблему, когда кто-то удаляет файл, когда он открыт программой. Когда вы делаете «rm», вы удаляете запись каталога, но НЕ удаляете базовый файл. Операционная система ведет подсчет ссылок на файл и фактически не удаляет базовые данные файла, пока счетчик ссылок не станет равным нулю. В случае среднего файла счетчик ссылок неоткрытого файла равен единице (запись каталога). Когда файл открывается, счетчик увеличивается до двух. Если вторая программа откроет тот же файл, счетчик будет увеличен до трех. Если запись каталога теперь удалена, счетчик уменьшается до двух, что означает, что файл является анонимным (не имеет имени), но не будет удален до тех пор, пока обе программы, в которых он открыт, не закроются, и в этом случае ОС удалить основное дисковое хранилище, связанное с файлом.
Когда вы удаляете /var/log/mail, системный регистратор по-прежнему имеет файл, открытый для записи. Если вы создадите новый /var/log/mail, он будет указывать на файл, отличный от того, который в данный момент записывает системный регистратор. Единственный способ привести все в соответствие — перезапустить системный журнал. Когда исходный системный журнал завершает работу, все файлы, связанные с ним, закрываются, включая журнал анонимной почты, запись в каталоге которого вы удалили. Когда вы перезапускаете системный регистратор, он повторно открывает /var/log/mail, когда ему нужно написать сообщение журнала, и после этого будет держать его открытым.
Что может сделать регистратор, чтобы предотвратить это, так это сначала записать сообщение журнала, проверить, существует ли запись в каталоге файла журнала, и, если она не существует, закрыть исходный файл журнала, открыть новый, а затем перепишите сообщение, чтобы оно не потерялось. Но для того, чтобы сделать все это, потребовалось бы гораздо больше сложности, чем должен был бы иметь системный регистратор — поскольку каждое сообщение, которое он записывает, будет записываться намного дольше из-за дополнительной проверки каталога — которая будет выполняться успешно каждый раз, когда файл НЕ был удален.
Примечание:
В этом руководстве не рассматривается настройка виртуальных доменов Postfix. Для получения информации о виртуальных доменах и других дополнительных конфигурациях см. Ссылки.
Установить Postfix
sudo apt установить постфикс
Сначала можно принять значения по умолчанию, нажимая клавишу возврата для каждого вопроса. Некоторые параметры конфигурации будут рассмотрены более подробно на этапе конфигурации.
Предупреждение об устаревании:
Метапакет mail-stack-delivery устарел в Focal. Пакет все еще существует из соображений совместимости, но не будет устанавливать работающую систему электронной почты.
Настройка Postfix
Перед настройкой необходимо решить четыре вещи:
sudo dpkg-reconfigure postfix
Чтобы установить формат почтового ящика, вы можете либо напрямую отредактировать файл конфигурации, либо использовать команду postconf. В любом случае параметры конфигурации будут храниться в файле /etc/postfix/main.cf. Позже, если вы захотите перенастроить определенный параметр, вы можете либо запустить команду, либо изменить ее вручную в файле.
Настройка формата почтового ящика
Чтобы настроить формат почтового ящика для Maildir:
sudo postconf -e ‘home_mailbox = Maildir/’
Аутентификация SMTP
SMTP-AUTH позволяет клиенту идентифицировать себя с помощью механизма аутентификации Simple Authentication and Security Layer (SASL), используя Transport Layer Security (TLS) для шифрования процесса аутентификации. После аутентификации SMTP-сервер позволит клиенту ретранслировать почту.
Настройка аутентификации SMTP
Чтобы настроить Postfix для SMTP-AUTH с использованием SASL (Dovecot SASL), выполните следующие команды в командной строке терминала:
sudo postconf -e ‘smtpd_sasl_type = dovecot’
sudo postconf -e ‘smtpd_sasl_path = private/auth’
sudo postconf -e ‘smtpd_sasl_local_domain =’
sudo postconf -e ‘smtpd_sasl_security_options = без анонимности, без открытого текста’
sudo postconf -e ‘smtpd_sasl_tls_security_options = неанонимный’
sudo postconf -e ‘broken_sasl_auth_clients = да’
sudo postconf -e ‘smtpd_sasl_auth_enable = да’
sudo postconf -e ‘smtpd_recipient_restrictions = allow_sasl_authenticated, permit_mynetworks, reject_unauth_destination’
Примечание:
Параметр конфигурации smtpd_sasl_path представляет собой путь относительно каталога очереди Postfix.
Существует несколько свойств механизма SASL, которые стоит оценить, чтобы повысить безопасность развертывания. Параметры «noanonymous, noplaintext» предотвращают использование механизмов, которые разрешают анонимную аутентификацию или передают учетные данные в незашифрованном виде.
Настройка TLS
Для MTA-MTA сертификаты TLS никогда не проверяются без предварительного согласия затронутых организаций. Для TLS MTA-MTA нет причин не использовать самозаверяющий сертификат, если этого не требует локальная политика. Подробнее о создании цифровых сертификатов и настройке собственного центра сертификации (ЦС) см. в нашем руководстве по сертификатам безопасности.
Получив сертификат, настройте Postfix для обеспечения шифрования TLS как для входящей, так и для исходящей почты:
sudo postconf -e ‘smtp_tls_security_level = может’
sudo postconf -e ‘smtpd_tls_security_level = может’
sudo postconf -e ‘smtp_tls_note_starttls_offer = да’
sudo postconf -e ‘smtpd_tls_key_file = /etc/ssl/private/server.key’
sudo postconf -e ‘smtpd_tls_cert_file = /etc/ssl/certs/server.crt’
sudo postconf -e ‘smtpd_tls_loglevel = 1’
sudo postconf -e ‘smtpd_tls_received_header = да’
sudo postconf -e ‘myhostname = mail.example.com’
Если для подписи сертификата вы используете собственный центр сертификации, введите:
sudo postconf -e ‘smtpd_tls_CAfile = /etc/ssl/certs/cacert.pem’
Результат первоначальной конфигурации
После выполнения всех вышеуказанных команд Postfix будет настроен для SMTP-AUTH с самоподписанным сертификатом для шифрования TLS.
Теперь файл /etc/postfix/main.cf должен выглядеть так:
sudo systemctl перезапустить postfix.service
САСЛ
Postfix поддерживает SMTP-AUTH, как определено в RFC2554. Он основан на SASL. Однако по-прежнему необходимо настроить аутентификацию SASL, прежде чем вы сможете использовать SMTP-AUTH.
При использовании IPv6 может потребоваться изменение параметра mynetworks для разрешения адресов IPv6, например:
Настройка SASL
Postfix поддерживает две реализации SASL: Cyrus SASL и Dovecot SASL.
Чтобы включить Dovecot SASL, необходимо установить пакет dovecot-core:
sudo apt install dovecot-core
auth_mechanisms = обычный
auth_mechanisms = простой логин
После того, как вы настроили Dovecot, перезапустите его с помощью:
sudo systemctl перезапустить dovecot.service
Проверьте настройки
телнет mail.example.com 25
После того, как вы установили соединение с почтовым сервером Postfix, введите:
250-СТАРТЛС
250-AUTH ВХОД ОБЫЧНЫЙ
250-AUTH=ВХОД ОБЫЧНЫЙ
250 8БИТИМИМ
Устранение неполадок
Когда возникают проблемы, есть несколько распространенных способов диагностировать причину.
Бегство от chroot
Пакет Ubuntu Postfix по умолчанию устанавливается в среду chroot из соображений безопасности. Это может усложнить поиск и устранение неполадок.
smtp inet n — — — — smtpd
smtp inet n — n — — smtpd
Затем вам потребуется перезапустить Postfix, чтобы использовать новую конфигурацию. В командной строке терминала введите:
перезапуск постфиксной службы sudo
СМТПС
smtps inet n — — — — smtpd
-o smtpd_tls_wrappermode=да
-o smtpd_sasl_auth_enable=да
-o smtpd_client_restrictions=permit_sasl_authenticated,отклонить
-o milter_macro_daemon_name=ПРОИСХОЖДЕНИЕ
Просмотр журнала
Postfix отправляет все сообщения журнала в /var/log/mail.log. Однако сообщения об ошибках и предупреждения могут иногда теряться в обычном выводе журнала, поэтому они также регистрируются в /var/log/mail.err и /var/log/mail.warn соответственно.
Чтобы увидеть сообщения, внесенные в логи, в режиме реального времени, вы можете использовать команду tail -f:
хвост -f /var/log/mail.err
Увеличить детализацию регистрации
Количество деталей, записываемых в журналы, можно увеличить с помощью параметров конфигурации. Например, чтобы увеличить ведение журнала активности TLS, установите для параметра smtpd_tls_loglevel значение от 1 до 4.
sudo postconf -e ‘smtpd_tls_loglevel = 4’
Перезагрузите сервис после любого изменения конфигурации, чтобы активировать новую конфигурацию:
sudo systemctl перезагрузить postfix.service
Регистрация доставки почты
Если у вас возникли проблемы с отправкой или получением почты с определенного домена, вы можете добавить этот домен в параметр debug_peer_list.
sudo postconf -e ‘debug_peer_list = проблема.домен’
sudo systemctl перезагрузить postfix.service
Увеличить многословность демона
Вы можете повысить уровень детализации любого процесса демона Postfix, отредактировав файл /etc/postfix/master.cf и добавив -v после записи. Например, отредактируйте запись smtp:
smtp unix — — — — — smtp -v
Затем перезагрузите сервис как обычно:
Журнал отладочной информации SASL
Как и в случае с Postfix, если вы измените конфигурацию Dovecot, процесс потребуется перезагрузить:
sudo systemctl перезагрузить dovecot.service
Примечание:
Некоторые из приведенных выше параметров могут значительно увеличить объем информации, отправляемой в файлы журнала. Не забудьте вернуть уровень журнала обратно в нормальное состояние после того, как вы исправите проблему, а затем перезагрузите соответствующий демон, чтобы новая конфигурация вступила в силу.

