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 для доставки пользователю. Тогда все письма перед доставкой будут полностью проверены на нежелательное содержимое и соответствующим образом помечены или отфильтрованы как-то еще.

Основной конфигурационный файл Postfix великоват, но там много комментариев, и значения по умолчанию разумные.

Для 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 следующим образом:

Скорая помощь

Все эти программы – демоны, и обычно ничего не выводят на терминал, на котором запущены. Весь полезный вывод отправляется в файл журнала: либо их собственный, либо через syslog. Для просмотра содержимого журнала в реальном времени при настройке используйте команду tail -f.

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.

Настройка роутера

Чтобы получать почту извне, вам потребуется статический IP-адрес, который предоставляют многие провайдеры (хотя иногда за дополнительную плату). Понадобится также DNS-запись MX для вашего домена: она скажет другим почтовым серверам, куда доставлять почту для вас. Ее можно получить там же, где вы регистрировали свое доменное имя. SMTP работает через порт 25, и его нужно открыть на маршрутизаторе (он же роутер) и перенаправить на сервер.

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

В былые времена, когда обитателями киберпространства были одни ученые да технари, почтовые серверы сотрудничали очень дружелюбно. Любой сервер переслал бы полученное сообщение должному адресату или ближайшему к нему серверу. Все закончилось, когда Сэнфорд «Спамфорд» Уоллес [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. Это важно при подключении извне: в противном случае ваши пароли можно будет перехватить.

Cкорая помощь

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

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

Тихо ли вы презираете спам или люто его ненавидите, но считаться с ним приходится всем. Обычно есть два варианта: либо фильтруйте почту с помощью спам-фильтров провайдера или почтового сервиса, с риском потерять нормальные письма из-за ложных срабатываний (письма, ошибочно признанные спамом), либо пользуйтесь локальным спам-фильтром. Последняя опция предоставляет больший контроль, но при каждом запуске клиента все равно придется загружать и сканировать всю почту, порождая задержки. Теперь у вас есть альтернатива: пусть почтовый сервер сканирует приходящие сообщения, работая в фоновом режиме! Тогда при запуске клиента нужно будет только загрузить проверенную почту. Выбор здесь богатый: 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.

Журналы Postfix

Postfix записывает все в syslog и может завалить вас высылаемой информацией. Обычно лучше всего приказать вашей службе журналирования отправлять эти сообщения в отдельный файл. Если вы пользуетесь syslog-ng (как в большинстве дистрибутивов), добавьте в файл /etc/syslogng/syslog-ng.conf такие строки:

#Postfix logging
destination mail { file(“/var/log/mail.log”); };
filter f_mail { facility(mail); };
filter f_notmail { not facility(mail); };
log { source(src); filter(f_mail); destination(mail); };

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

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

Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию