Журнал LinuxFormat - перейти на главную

LXF121:network

Материал из Linuxformat
Перейти к: навигация, поиск
Сети Свяжем ваши Linux-ПК, и пускай они вас обслуживают

Содержание

Сервер почты: Долой спам!

Часть 6: Нейл Ботвик завершает установку почтового сервера с Postfix, а заодно учит избавляться от спама и вирусов.

Еще в LXF115 мы настроили почтовый сервер IMAP, и можем читать почту откуда угодно. В прошлом месяце мы добавили web-интерфейс, но почта по-прежнему сперва поступает к провайдеру или на другой почтовый сервис, а потом вытягивается оттуда с помощью Fetchmail. Пора замкнуть круг, добавив SMTP-сервер, который позволит доставлять почту прямо на IMAP-сервер. Это означает, что ее можно будет отфильтровать на вирусы и спам перед доставкой. По существу, SMTP устанавливает правила, определяющие, как почта будет передаваться между компьютерами.

Основной компонент в этом процессе – MTA (Mail Transport Agent – Агент передачи почты); он отвечает за получение почтовых сообщений с одного компьютера и передачу их на другой. Также можно встретить сокращения MUA и MDA. MUA (Mail User Agent, Пользовательский почтовый агент) – это программа, используемая для управления сообщениями, а MDA (Mail Delivery Agent, Агент доставки почты) отвечает за получение почты с сервера и доставку писем в ящики пользователей. Большинство MTA могут выступать как MDA, но в общем случае применяется отдельная, более продвинутая программа. При сборе почты с Fetchmail в качестве MDA мы использовали Procmail, с ней и продолжим работать.

У отдельного MDA есть еще одно преимущество: программы можно объединять в цепочки. Вместо прямой передачи почты от MTA к MDA ее можно отправить в спам-фильтр, потом в антивирус, и, наконец, в Procmail для доставки пользователю. Тогда все письма перед доставкой будут полностью проверены на нежелательное содержимое и соответствующим образом помечены или отфильтрованы как-то еще.


Для Linux существует несколько популярных почтовых серверов, в том числе Postfix, Sendmail и Exim. И Sendmail, и Exim – достаточно продвинутые программы; правда, синтаксис конфигурационного файла Sendmail так сложен, что мог бы посоперничать с проектом SETI. Но мы в итоге остановились на Postfix версии 2.5.6: эта версия вышла в начале текущего года, и ее легко достать. Если она еще не установлена, добавьте ее обычным образом с помощью менеджера пакетов.

Настройка Postfix

В Postfix есть несколько больших, хорошо откомментированных конфигурационных файлов в /etc/postfix, но в установке по умолчанию нужно изменить совсем немного. Основной файл конфигурации – /etc/postfix/main.cf, и прежде чем что-то менять в нем, прочтите комментарии. Теперь, предполагая, что ваш домен – mydomain.ru и нужно обрабатывать почту также с mydomain.com и example.com, изменим файл конфигурации. Начнем со строки

proxy_interfaces = 192.168.1.1 # optional

Менять proxy_interfaces не обязательно, но это защищает от почтовых «петель» (mail loops). Пропустите эту строку, если у вас прямое соединение без маршрутизатора или NAT; в противном случае подставьте IP-адрес своего интернет-шлюза. Теперь установите параметр

myhostname = mydomain.ru

Это имя вашего хоста и имя, которое будет использовать Postfix при подключении к другим серверам. Оно должно разрешаться на внешний IP-адрес, иначе некоторые серверы могут отказать в соединении как потенциальному спамеру. Затем измените mydestination следующим образом:


mydestination = mydomain.ru,mydomain.com,example.com

Здесь мы указали разделенный запятыми список доменов, почту с которых будет обрабатывать сервер – получив сообщение с домена, отсутствующего в этом списке, он попробует отправить его серверу, который сможет его обработать. Теперь запишем в myorigin адрес вашего домена:

myorigin = mydomain.ru

Обратите внимание, что теперь вся почта с этого сервера будет выглядеть как почта с этого домена. Домен также добавится ко всем адресам без доменной части (локальная почта).

Сообщения от несуществующих пользователей обычно отклоняются. Параметр luser_relay определяет получателя по умолчанию для этих писем. Если вы хотите получать сообщения и для несуществующих пользователей, установите его в значение

luser_relay = имя_пользователя # optional 

Тогда можно использовать разные имена пользователей для разных целей, но возрастет объем спама, так как пользователям со случайно сгенерированными именами спам отправляется в колоссальном количестве.

При отправке почты Postfix обычно пытается соединиться с почтовым сервером получателя напрямую. Если ваш провайдер не разрешает такие подключения или диапазон IP-адресов провайдера находится в «черном списке» как спамерский, можно сделать так, чтобы почта проходила сквозь почтовый сервер вашего провайдера. Для этого установите параметр:

relayhost = smtp.myisp.ru # optional

Не исключено, что этот сервер уже указан как SMTP-сервер в настройках вашего почтового клиента. Наконец, установите параметр:

mailbox_command = /usr/bin/procmail

Postfix может доставлять почту в ящики пользователей напрямую, используя параметр home_mailbox или mail_spool_directory, но может и работать с внешним агентом доставки почты, что существенно добавляет гибкости. Так как в LXF115 мы настроили Procmail для работы с Fetchmail, остановимся на этом варианте (по крайней мере, пока). Если этого номера нет у вас под рукой, добавьте для Procmail в /etc/procmailrc следующие строки:

MAILDIR=/var/spool/mail
DEFAULT=$MAILDIR/$LOGNAME/
LOGFILE=/var/log/procmail

После этого запустите (или перезапустите) сервис Postfix, настройте свой почтовый клиент на сервер localhost (или имя хоста компьютера, на котором работает Postfix, если это другая машина вашей сети) и порт 25 и отправьте самому себе тестовое сообщение. Перед отправкой выполните в терминале команду

sudo tail -f /var/log/messages | grep postfix

Она профильтрует все новые данные, записанные в файл системного журнала, и выведет на экран то, что относится к Postfix. При отправке письма вы должны увидеть несколько строк вывода с сообщением, что соединение с почтовым клиентом было установлено, сообщение получено и доставлено Procmail. Если вы видите сообщение об ошибке, оно должно ссылаться на настройку, подлежащую исправлению. Если ошибки нет, а почта не доставлена, вероятно, она успешно попала к Procmail, но не сработала доставка. Загляните в файл журнала /var/log/procmail.


Авторизованный доступ

В былые времена, когда обитателями киберпространства были одни ученые да технари, почтовые серверы сотрудничали очень дружелюбно. Любой сервер переслал бы полученное сообщение должному адресату или ближайшему к нему серверу. Все закончилось, когда Сэнфорд «Спамфорд» Уоллес [Sanford ‘Spamford’ Wallace] и его коллеги сообразили, что это отличный метод массовой рассылки незваных сообщений. Теперь пересылку в почтовых серверах отключают. Это означает, что сервер принимает и доставляет только почту, удовлетворяющую одному из трех критериев:

  • Сообщение предназначено для одного из адресатов в списке доменов сервера.
  • Сообщение отправлено с компьютера в списке доменов сервера
  • Пользователь, отправляющий сообщение, аутентифицировался перед отправкой почты.

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

Однако аутентификация помогает избежать этой проблемы, потому что она означает, что пользователь «правильный», и сервер перенаправит сообщение ему. На собственном сервере это нужно, если вы хотите иметь возможность отправлять почту откуда угодно: из локальной сети, через беспроводное подключение в кафе или через 3G USB-модем. Для аутентификации Postfix использует Cyrus SASL, поэтому убедитесь, что он установлен, а сервис saslauthd запускается при загрузке. Теперь добавьте такие строки в конец файла /etc/postfix/main.cf:

smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes # optional
smtpd_recipient_restrictions = permit_sasl_
authenticated,permit_mynetworks,check_relay_domains

Строка, отмеченная как опционная, нужна только для некоторых версий Outlook Express и Microsoft Exchange. Перезагрузив конфигурацию, по локальной сети вы все еще сможете отправлять почту с почтового клиента без аутентификации. У вас также должна быть возможность получать и пересылать почту при подключении извне, если почтовый клиент настроен на аутентификацию при отправке (с теми же именем пользователя и паролем, которые используются для получения почты; это справедливо по умолчанию для большинства клиентов). Подробное руководство имеется по адресу http://postfix.state-of-mind.de/patrick.koetter/smtpauth; из него также можно узнать, как зашифровать трафик с помощью TLS. Это важно при подключении извне: в противном случае ваши пароли можно будет перехватить.


Фильтрация спама

Тихо ли вы презираете спам или люто его ненавидите, но считаться с ним приходится всем. Обычно есть два варианта: либо фильтруйте почту с помощью спам-фильтров провайдера или почтового сервиса, с риском потерять нормальные письма из-за ложных срабатываний (письма, ошибочно признанные спамом), либо пользуйтесь локальным спам-фильтром. Последняя опция предоставляет больший контроль, но при каждом запуске клиента все равно придется загружать и сканировать всю почту, порождая задержки. Теперь у вас есть альтернатива: пусть почтовый сервер сканирует приходящие сообщения, работая в фоновом режиме! Тогда при запуске клиента нужно будет только загрузить проверенную почту. Выбор здесь богатый: Spam Assassin (http://spamassassin.apache.org), Bogofilter (http://bogofilter.sourceforge.net)… ну, а мы возьмем Dspam с сайта http://dspam.nuclearelephant.com. Все эти программы есть в большинстве репозиториев, и все они используют метод поиска спама под названием «байесовский анализ» (Bayesian analysis), рассматривающий частоту различных слов в сообщениях.

Есть несколько способов вызова Dspam из Postfix – как фильтр содержимого, как транспорт или как команда почтового ящика. Воспользуемся последним вариантом: он, может, и не самый эффективный, зато самый простой в настройке. Когда фильтрация заработает как нужно, всегда можно заняться и другими методами.

Postfix может вызывать Dspam напрямую для каждого письма, но это неэффективно; лучше воспользоваться демоном Dspam, запускаемым как сервис при загрузке системы. Postfix вызывает dspamc, который использует демона вместо запуска отдельного экземпляра Dspam. Первый шаг – отредактировать файл /etc/dspam.conf (он может находиться в подкаталоге /etc) и убедиться, что данные параметры установлены:

TrustedDeliveryAgent “/usr/bin/procmail”
UntrustedDeliveryAgent “/usr/bin/procmail -d %u”
Preference “signatureLocation=headers”
ServerMode dspam
ServerPass.Relay1 “secret”
ClientIdent “secret@Relay1”

Первые две строки велят Dspam пользоваться Procmail для доставки почты всем пользователям. Опция signatureLocation предписывает Dspam хранить сигнатуру сообщения в заголовках, а не в теле письма. Dspam добавляет сигнатуру в каждое обрабатываемое сообщение, и поэтому не будет просматривать одно и то же письмо дважды. Последние три опции разрешают клиенту dspamc взаимодействовать с демоном. Убедитесь, что демон Dspam настроен на запуск при загрузке системы с помощью программы настройки сервисов своего дистрибутива, и перезапустите его после изменения файла конфигурации.

Затем откройте файл /etc/postfix/main.cf и установите параметры

mailbox_command = /usr/bin/dspamc --client --mode=teft --deliver=innocent,spam --feature=noise,whitelist --user $USER -- -d %u

которые скажут Postfix, соответственно, использовать dspamc для доставки почты, обучаться в зависимости от вашего выбора (mode=teft), доставлять как нормальные сообщения, так и спам, и от имени какого пользователя доставлять почту.

Dspam может обрабатывать спам двумя способами: изолировать его в карантине (который можно просмотреть через web-браузер и найти письма, признанные спамом ошибочно, а остальное удалить), или доставлять всю почту, но помечать спам как спам. Это дело вкуса, но я бы предпочел последний вариант: при этом сообщения все еще доступны с любого почтового клиента и уже помещены в отдельную почтовую папку. Отфильтровать сообщения можно по заголовку

X-DSPAM-Result:

который содержит Innocent или Spam.

Изменив конфигурационный файл, перезапустите Postfix или заставьте его перечитать настройки командой

postfix reload

Байесовские спам-фильтры узнают, что спам, а что нет, прямо из вашей почты. Они особо удобны благодаря отсутствию заданного набора правил и приспосабливаются к вашим потребностям. Недостаток, правда, в том, что их нужно обучать. Обучение происходит в двух направлениях. Во-первых, нужно дать им на пробу множество сообщений, и спама, и полезных (их иногда называют «хамом» – «ham»), чтобы они поняли, какие вам нужны, а какие не нужны. Поэтому до установки Dspam не удаляйте спам, просто поместите его в отдельную папку. Потом можно провести первичное обучение с помощью команды dspam_train, например, таким образом:

dspam_train username spam_dir ham_dir

Dspam фильтрует спам отдельно для каждого пользователя, и у каждого своя база данных классификации. Остальные два аргумента – пути к каталогам соспам- и хам-сообщениями, каждое в отдельном файле. Так как здесь используется стандартный формат почтового каталога IMAP-серверов, можно просто указать пути к папкам «входящие» и «спам» своего сервера, например:

dspam_train arthur /var/spool/mail/arthur/.INBOX.spam/cur/var/spool/mail/arthur/cur

Нужно также провести обучение «в деле», особенно в первое время. Оно включает информирование Dspam при каждом неверном определении спам-сообщения. Добросовестное отношение к этому вначале – залог успеха в будущем, потому что Dspam предполагает, что все неисправленные классификации верны, и принимает это к сведению. Простейший способ информировать Dspam о ложных тревогах и просчетах – напрямую из почтового клиента, задав несколько почтовых псевдонимов (алиасов). Они определяются в файле /etc/mail/aliases, который уже содержит несколько стандартных псевдонимов, поэтому откройте его на редактирование от имени root и добавьте туда две строки:

dspam-spam: “|/usr/bin/dspam -- user nobody -- source=error -- class=spam”
dspam-notspam: “|/usr/bin/dspam -- user nobody -- source=error -- class=innocent”

Определение псевдонима состоит из имени, двоеточия и поля назначения. Это может быть другой пользователь, полный почтовый адрес или любая их последовательность, разделенная запятыми. Это может быть и команда, предваряемая символом |. Она запустит программу и передаст ей содержимое сообщения в стандартный поток ввода. Теперь можно сообщить о ложных срабатываниях и пропущенном спаме, просто перенаправив сообщения на dspam-notspam@your.domain или dspam-spam@your.domain соответственно. Если ваш почтовый клиент поддерживает макросы, можно связать эти действия с комбинацией клавиш или пунктом меню, значительно упростив процесс обучения Dspam. Мы сделали этот псевдоним общим, применив пользователя ‘nobody’, но можно было бы задать отдельную пару псевдонимов и для каждого из пользователей. После изменения файла aliases потребуется выполнить команду newaliases чтобы добавить изменения в базу данных псевдонимов Postfix.


Ранняя фильтрация спама

Dspam хорошо обнаруживает спам, но часть спама проще обработать из Postfix. Спамеров не волнуют тонкости почтового обмена, поэтому неудивительно, что они почти не вникают в обычные правила передачи почты. Стараясь отправить побольше сообщений, они идут кратчайшим путем, опуская или подделывая информацию, отличающую настоящее письмо. Поэтому огромное количество спама можно отпихнуть на начальной стадии SMTP-обмена, отклонив соединение. При этом экономится трафик, так как почта не загружается, и Dspam не должен ее обрабатывать. Некоторые из этих типов некорректных сообщений можно отклонить, добавив строки в файл /etc/postfix/main.cf:

# HELO restrictions
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks, reject_non_fqdn_hostname, reject_invalid_hostname, permit
# Sender restrictions
smtpd_sender_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_non_fqdn_sender, reject_unknown_sender_domain, permit
# Recipient restrictions
smtpd_recipient_restrictions = reject_unauth_pipelining, reject_non_fqdn_recipient, reject_unknown_recipient_domain,
permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, permit

Здесь нет места на углубление в детали работы этого кода, но если вы хотите узнать побольше, зайдите на сайт http://www.postfix.org.

Сканирование на вирусы

Если с сервера будут загружать почту пользователи Windows, гуманно было бы проверить ее на вирусы. Dspam может это сделать с помощью ClamAV. Во-первых, убедитесь, что ClamAV установлен, а сервис clamd запущен, потом откройте файл dspam.conf и раскомментируйте следующие настройки ClamAV:

ClamAVPort 3310
ClamAVHost 127.0.0.1
ClamAVResponse spam

Первые две строки, скорее всего, менять не надо, а третья говорит Dspam, что делать с почтой, если ClamAV найдет вирус – reject отбросит сообщение и возвратит ошибку, accept примет сообщение и потом молча от него избавится, а spam велит Dspam считать сообщение спамом и изолировать или пометить его.

Теперь у вас должна быть полная почтовая система для SMTP, IMAP и web-почты. Программы, рассмотренные здесь, очень гибкие, и мы охватили только их базовые возможности, поэтому засучите рукава, прочтите документацию и настраивайте ПО в соответствии с вашими нуждами. LXF

Персональные инструменты
купить
подписаться
Яндекс.Метрика