Назад | Перейти на главную страницу

postfix - hock - извлечение информации из обработанных писем

Установка

Linux, Debian Wheezy, служит почтовым сервером примерно для 1000 пользователей. В этом ящике установлены Courier и Postfix.

Информация о сервере

Это установка постфикса, которая отбрасывает электронные письма в почтовые ящики под/home/vmail/$domain/$user - эта часть работает.

Что я планирую делать:

Я хотел бы реализовать это, когда электронное письмо отправляется через сервер, скрипт (/home/vmail/mail_logger.sh) запускается, чтобы я мог войти в систему и предпринять действия. Зачем? Я хотел бы реализовать действие по замедлению / отключению учетной записи, если такая учетная запись будет взломана и кто-то начнет рассылать спам по системе.

Прямо сейчас я чередую файлы журналов и извлекаю, какой пользователь отправил, сколько писем за определенный период времени, а затем блокирую учетную запись, если они отправляют более x писем в час (настраивается). Эта реализация ротации журналов не очень хороша, поэтому я подумал, что было бы неплохо иметь перехватчик, который запускается каждый раз, когда электронное письмо отправляется через smtps (прямо сейчас для пользователей разрешен только smtps - нет smtp).

я нашел это руководство и это дало мне несколько идей, как реализовать "скакалки" для различных методов доставки (smtp, smtpd, самовывоз)

В main.cf я добавил следующие строки

hooksmtp   unix  -       n       n       -       -       pipe  flags=F user=vmail argv=/home/vmail/mail_logger.sh ${sender} ${size} ${recipient} smtp
hooksmtps  unix  -       n       n       -       -       pipe  flags=F user=vmail argv=/home/vmail/mail_logger.sh ${sender} ${size} ${recipient} smtps
hookpickup unix  -       n       n       -       -       pipe  flags=F user=vmail argv=/home/vmail/mail_logger.sh ${sender} ${size} ${recipient} pickup`

и изменил следующие строки также в main.cf

smtp       inet  n       -       -       -       -       smtpd -o content_filter=hooksmtp:dummy
smtps     inet  n       -       -       -       -       smtpd -o content_filter=hooksmtps:dummy  -o syslog_name=postfix/smtps  -o smtpd_tls_wrappermode=yes   -o smtpd_sasl_auth_enable=yes  -o smt
pickup    fifo  n       -       -       60      1       pickup -o content_filter=hookpickup:dummy

вызывать скакательные суставы на конкретные действия.

Сейчас запущенный скрипт выглядит так, и я улучшу его позже ...

cat /home/vmail/mail_logger.sh
#!/bin/bash
echo $(date +%Y.%m.%d_%H:%M:%S) $@ >> /home/vmail/mail_logger.log

Теперь у меня есть проблема, что теперь вся электронная почта обрабатывается "крючками" (что хорошо), но не доставляется в исходное место назначения (что плохо).

Я просмотрел руководство по postfix и понял, что могу реализовать, что для всех писем bcc отправляется на локальный адрес электронной почты, а не обрабатывается, но я подумал, что должен быть другой способ справиться с этим.

Итак, вопрос как изменить эти строки, чтобы «скакалки» получали уведомление, а письма по-прежнему обрабатывались, как и раньше, без необходимости выполнять BCC, а затем обрабатывать эту BCC.

Также приветствуются другие идеи решения указанной выше проблемы. Но обратите внимание, что я не хочу запускать сканер спама на этом ящике, потому что сканирование спама обрабатывается 4 узлами MX перед сервером (под управлением debian и sa-exim).

Обновление 1: Мои первые выводы после комментариев:

Я следил за комментариями и внес эти изменения

в main.cf я добавил следующие строки

local_transport = hookpickup
always_bcc = extract@localhost

в master.cf убедился, что крюк на месте

hookpickup unix  -       n       n       -       -       pipe  flags=F user=vmail
    argv=/home/vmail/mail_logger.sh ${sender} ${size} ${recipient} pickup

Я провел несколько тестов и выяснил, что

Теперь мне нужно настроить, чтобы local_transport = hookpickup просто «запускался», если электронное письмо приходит из почтового ящика extract @ localhost

Обновление 2: Мои следующие выводы после ответа:

Я следил за первым ответом и внес эти изменения

transport_maps = hash:/etc/postfix/map_mytransport
always_bcc = extract@localhost
# removed: local_transport = hookpickup

Файл / etc / postfix / map_mytransport имеет содержимое

extract@localhost hookpickup:

Каждый раз, когда вы изменяете содержимое / etc / postfix / map_mytransport, вам нужно запускать postmap /etc/postfix/map_mytransport который сгенерирует файл /etc/postfix/map_mytransport.db, который фактически использует постфикс.

Пожалуйста, убедитесь, что у вас есть transport_maps не определен ранее, иначе вы перезапишете его этим параметром, что может вызвать непредвиденное поведение. Я подписался на 70% это руководство настраивал сервер и еще не настраивал его, но я знаю, что это сделали другие люди.

В master.cf я изменил крючок и добавил больше значений для отладки

hookpickup unix  -       n       n       -       -       pipe  flags=F user=vmail
    argv=/home/vmail/mail_logger.sh client_address=${client_address} client_hostname=${client_hostname} client_port=${client_port} client_protocol=${client_protocol} domain=${domain} extension=${extension}mailbox=${mailbox} nexthop=${nexthop} original_recipient=${original_recipient} recipient=${recipient} sasl_method=${sasl_method}  sasl_sender=${sasl_sender} sasl_username=${sasl_username} sender=${sender} size=${size}

Полное описание параметров можно найти Вот.

Чтобы решение заработало, я добавил в систему пользовательский экстракт и перезапустил постфикс.

Сценарий /home/vmail/mail_logger.sh теперь получает в «реальном времени» информацию, которая мне нужна для блокировки учетной записи, если она рассылается по многим электронным письмам (определенным в соответствии с порогом, настроенным в базе данных).

Вместо отмены local_transport с вашим секс, вы можете настроить transport_maps.

#main.cf
transport_maps = hash:/etc/postfix/mytransport

#/etc/postfix/mytransport
extract@localhost hookpickup:

В этом режиме на подключение будет доставлено только электронное письмо, отправленное на extract @ localhost.