Копирование исходящей почты с помощью Sendmail
Материал из Xgu.ru
- Автор: Игорь Чубин
Правильная ссылка: http://xgu.ru/wiki/Sendmail_copy
На этой странице рассматривается как организовать копирование исходящей (или всей) почты, обрабатываемой Sendmail. Почта передаёт через Milter API на вспомогательную программу, которая выполняет копирование.
Содержание |
[править] Морально-этические соображения
Морально-этические соображения, касающиеся вопроса копирования исходящей почты, находятся за рамками данной статьи и здесь не рассматриваются.
Следует отметить, что, как правило, копирование почты, в особенности без уведомления корреспондентов, считается неэтичным, а в некоторых случаях даже противозаконным. (см. [1], а также обсуждения [2], [3], [4]). Создатели Sendmail намеренно исключили такую возможность у самого почтовика, сославшись на то, что они хотят сделать подглядывание за чужой почтой хотя бы немного сложнее.
С другой стороны, надо понимать, что вся почта передающаяся через почтовый сервер, и через все остальные серверы по пути её следования, может быть легко просмотрена их администраторами. Если нужно чтобы почту не мог прочитать никто, нужно использовать системы шифрования почты, такие как PGP/GPG и другие подобные.
Вся почта, подвергшаяся копированию в соответствии с описанным ниже методом, содержит предупреждающее сообщение в служебных заголовках письма. |
[править] Методы копирования почты
При использовании Sendmail в качестве основной почтовой программы (MTA), копирование исходящей почты возможно одним из трёх способов:
- Копирование с помощью другой копии sendmail
- Копирование с помощью локального обработчика почты, обычноprocmail
- Копирование с помощью программы, подключенной через milter-интерфейс Sendmail
Ниже рассматривается, как можно настроить копирование почты по третьему способу, то есть через milter-интерфейс Sendmail.
В качестве программы, выполняющей копирование почты, используется программа Synonym.
[править] Копирование через milter
Копирование почты выполняется с помощью внешней программы Synonym, которая получает почтовое сообщение от Sendmail'а через Milter API. Synonym на основе достаточно грубых критериев выбирает часть писем и передаёт их программе procmail, которая выполняет обработку на основе любой информации в заголовках и теле письма.
[править] Установка synonym
Установка выполняется их архива исходных текстов. Получить архив можно здесь [5].
Для сборки необходимы пакеты:
- libxml2
- libxml2-dev
- libmilter1
- libmilter-dev
Необходимо установить эти пакеты (или другие соответствующие) принятым в дистрибутиве способом:
%# apt-get install libxml2 libxml2-dev libmilter1 libmilter-dev
Распакуйте архив synonym:
synonym-0.4-1.tar.gz | tar xvf -
Соберите synonym.
make clean make
Если при сборке возникла ошибка:
gcc -Wall synonym.o -lmilter config.o filtering.o -lpthread -o synonym -L/usr/local/lib -lxml2 -lcrypt /usr/bin/ld: cannot find -lmilter
попробуйте собрать synonym командой:
gcc -Wall /usr/lib/libmilter.so.1 synonym.o config.o filtering.o -lpthread -o synonym -lxml2 -lcrypt
Собранный файл synonym установите в
cp synonym /usr/local/sbin
Создайте скрипт для запуска/остановки Synonym и ссылки на него в иерархии /etc/rc.d. В данном примере конфигурационный файл Synonym располагается в /etc/synonym.conf. Synonym запускается как демон, в фоне.
%# vi /etc/init.d/synonym
#!/bin/sh case $1 in 'start' ) # Increase file descriptor limit to 1024 ulimit -Sn 1024 LD_LIBRARY_PATH=/usr/local/lib /usr/local/sbin/synonym \ -c /etc/mail/synonym.conf -d -u daemon ;; 'stop' ) kill `ps -ef | grep [s]ynonym | awk '{print $2}'` > /dev/null 2>&1 [ -f /var/run/synonym/synonym.pid ] && rm /var/run/synonym/synonym.pid ;; *) echo "usage: $0 {start|stop}" esac
Если не увеличить ограничение на количество файловых дескрипторов для милтера Synonym, могут возникнуть сообщения об ошибках, связанные с тем что предел на количество открытых дескрипторов достигнут:
Dec 16 10:58:01 mail_server Synonym[16007]: Synonym: thread_create() failed: 11, try again Dec 16 10:58:02 mail_server Synonym[16007]: Synonym: thread_create() failed: 11, try again Dec 16 10:58:04 mail_server Synonym[16007]: Synonym: thread_create() failed: 11, try again Dec 16 10:58:22 mail_server Synonym[16007]: Synonym: thread_create() failed: 11, try again Dec 16 10:58:23 mail_server Synonym[16007]: Synonym: thread_create() failed: 11, try again Dec 16 10:58:35 mail_server Synonym[16007]: Synonym: thread_create() failed: 11, try again Dec 16 10:58:36 mail_server Synonym[16007]: Synonym: thread_create() failed: 11, try again <pre> <pre> # /usr/proc/bin/pfiles 16007 3314: /usr/local/bin/perl /usr/local/bin/sendmail-milter-spf-1.41.pl -T daem Current rlimit: 64 file descriptors
Создайте ссылки в каталоге /etc/rc.d.
%# ln -s /etc/init.d/synonym /etc/rc2.d/S99synonym %# ln -s /etc/init.d/synonym /etc/rc1.d/K58synonym
Создайте каталог для сокета Synonym:
%# mkdir /var/run/synonym %# chown mail:mail /var/run/synonym
Владелец, здесь mail:mail, может отличаться. Узнать от имени какого пользователя Synonym пытается записать PID в файл можно, если запустить процесс не от имени root'а и посмотреть на сообщение об ошибке.
%$ ./synonym Failed to drop privileges to gid 8 %$ getent passwd | grep :8: mail:x:8:8:mail:/var/mail:/bin/sh
Или, если при запуске используется ключ -u, посмотреть, что указано после него.
Запустите Synonym:
%# /etc/init.d/synonym start
Теперь нужно настроить Sendmail на использование нового милтера.
Добавьте такие строки в конфигурационный файл sendmail.mc:
FEATURE(local_procmail)dnl define(`_FFR_MILTER', `true') INPUT_MAIL_FILTER(`Synonym', `S=local:/var/run/synonym/synonym.sock, T=C:10m;S:1s;R:1s;E:5m')dnl
Соберите и проинсталлируйте sendmail.cf
%# cd /etc/mail %# make
Или, если Makefile в каталоге /etc/mail отсутствует:
%# cd /etc/mail %# m4 <sendmail.mc > sendmail.cf
[править] Настройка Synonym
Пример файла synonym.conf, который заставит Synonym копировать все сообщения содержащие поле From в заголовке (то есть все сообщения передаваемые сервером) локальному пользователю mailcopy:
<Rules> <Rule> <Condition> <Header>From</Header> <Match>.*</Match> </Condition> <Action> <ActionType>Copy</ActionType> <Address>mailcopy</Address> </Action> </Rule> </Rules>
[править] Настройка пользователя mailcopy
В этом примере выполняется настройка procmail для локального пользователя mailcopy.
Вот пример содержимого файла ~mailcopy/.procmailrc:
FORMAIL=/usr/bin/formail #Don;t copy mail sent by megaboss to ultraboss :0 * ^FROM.*megaboss@example.com * ^TO.*ultraboss@example.com /dev/null # Don't copy mail which goes to security :0 * ^X-Loop /dev/null # Send all other messages to security :0 * | $FORMAIL -I "X-Loop: Synonym" | grep -v ^X-Synonym | /usr/sbin/sendmail security@example.com
В этом примере почта копируется на адрес электронной почты security@example.com.
Другой, более сложный пример:
MAILDIR=$HOME FORMAIL=/usr/local/bin/formail # Copy monitored addresses to abuse@example.com :0 c * ^(From|To).*brandonhutchinson@hotmail\.com { # Prevent mail loops :0 * ^X-Loop /dev/null # Copy each message to "monitored" directory :0 c monitored # Add an "X-Loop" header to prevent milter mail loops and mail a copy of the message to abuse@example.com :0 | $FORMAIL -I "X-Loop: Synonym" | mailx -s "Monitored email" abuse@example.com } # Copy messages from example.com containing attachments # to attachments sub-directory for attachment report processing :0 * ^From.*example\.com { :0 B * filename= attachments } # Discard all other messages :0 * /dev/null
[править] Запуск Synonym
Запуск Synonym:
%# /etc/init.d/synonym start
Перезапуск Sendmail:
%# kill -HUP `head -n1 /etc/mail/sendmail.pid`
[править] Дополнительная информация
- Копирование исходящей (входящей) почты - подборка ссылок
- How can I automatically copy messages based on sender or recipient addresses? - вопрос в Sendmail FAQ
- How to Filter All Incoming (and/or Outgoing) Mail with procmail (sendmail-mailer)
- Copying all messages with Sendmail (sendmail-synonym)
- Копирование почты с помощью sendmail (sendmail-sendmail)
[править] Материалы по настройке почтовых систем на Xgu.ru
- Sendmail
- Борьба со спамом в Sendmail
- Использование ClamAV, SpamAssassin, MIMEDefang для борьбы с нежелательной почтой в Sendmail
- Переход с POP3 на IMAP4
- Копирование исходящей почты с помощью Sendmail
- Отправка e-mail из скриптов
- Cyrus IMAP Server