Копирование исходящей почты с помощью Sendmail

Материал из Xgu.ru

Перейти к: навигация, поиск
Автор: Игорь Чубин

Правильная ссылка: http://xgu.ru/wiki/Sendmail_copy

На этой странице рассматривается как организовать копирование исходящей (или всей) почты, обрабатываемой Sendmail. Почта передаёт через Milter API на вспомогательную программу, которая выполняет копирование.


Содержание

[править] Морально-этические соображения

Морально-этические соображения, касающиеся вопроса копирования исходящей почты, находятся за рамками данной статьи и здесь не рассматриваются.

Следует отметить, что, как правило, копирование почты, в особенности без уведомления корреспондентов, считается неэтичным, а в некоторых случаях даже противозаконным. (см. [1], а также обсуждения [2], [3], [4]). Создатели Sendmail намеренно исключили такую возможность у самого почтовика, сославшись на то, что они хотят сделать подглядывание за чужой почтой хотя бы немного сложнее.

С другой стороны, надо понимать, что вся почта передающаяся через почтовый сервер, и через все остальные серверы по пути её следования, может быть легко просмотрена их администраторами. Если нужно чтобы почту не мог прочитать никто, нужно использовать системы шифрования почты, такие как PGP/GPG и другие подобные.

Icon-caution.gif

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

[править] Методы копирования почты

При использовании 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`

[править] Дополнительная информация

[править] Материалы по настройке почтовых систем на Xgu.ru