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.