Создан: 17.07.2007
Модиф: 04.06.2008
POSTFIX + SASL + PAM + BLOCKLISTS + GREYLIST
Задачи:
1. Попросить авторизацию у пользователя, отправляющего почту из локальной сети через сервер, где установлен Postfix. Это необходимо для того, чтобы всякая дрянь, заразившая Windows-компьютеры внутри сети, не смогла воспользоваться mail-релеем конторы и устроить спам-беспредел, по дороге отправив конторский сервер в чёрные списки спамерских компов Internet-а.
2. Дать возможность своим сотрудникам через Интернет пользоваться конторским сервером для отправки почты. Т.е. они должны аутентифицироваться на сервере при отправке почты с домашнего компьютера и аутентификация должна производиться по зашифрованному каналу, поскольку для SMTP она проходит открытым текстом.
Дополнение к задаче: Для авторизации хотелось использовать стандартные пользовательские пароли Linux сервера.
3. Требования авторизации и безопасного режима должны быть обязательными и нельзя полагаться на то, что юзер сам их настроит в учётных записях своих клиентских программ.
4. Защитить юзеров от спама.
5. Фильтр спама должен отвергать почту уже на этапе SMTP-соединения, чтобы спам не был входящим трафиком конторы и провайдер не насчитывал за него денежки.
Решаются эти задачи с помощью связки Postfix и SASL. При отправке почты пользователем локальной сети через почтовый сервер smptd Postfix-а запрашивает аутентификацию пользователя у почтового клиента (например Thunderbird или Seamonkey) и проверяет её при помощи SASL. SASL в свою очередь обращается к системе за проверкой login/password. У меня проверка делается с помощью PAM.
Фильтрацию спама делает сам Postfix. В описываемых конфигах настроена защита от спамеров, использующая сервера с блок-листами спамеров и дополнительно настроен режим greylist.
Блок-листы: В Интернете есть очень полезные сервера, содержащие списки спамерских компьютеров. Когда программа отсылки почты удалённого компьютера соединяется с нашим Postfix-ом, чтобы передать нам почту, с помощью этих списков определяется - не спаммер ли к нам просится.
Greylist: При первом соединении передающей почтовой программы удалённого компьютера с нашим Postfix-ом эта программа получит отказ от нас с ответом "Service temporary unavaliable". Нормальная программа повторит запрос и почта нами будет получена, а большинство спамерских программ больше к нам обращаться не будут.
Тренировался в Alt Linux Server 4.0.0. Замечу, что связка SASL+Postfix в случае, когда Postfix работает в chroot-режиме, не очень то работоспособна, несмотря на кучу советов из Internet - выпрямителей кривизны софта. :-(
Необходимые пакеты:
В Alt Linux должны быть установлены пакеты
posfix
postfix-cyrus
postfix-tls
cyrus-sasl2
libsasl2
В других Линуксах они могут называться по-другому, но слова postfix , cyrus, sasl, tls в них должны присутствовать :-)
Настройка SASL,PAM , проверка и запуск SASL.
В каталоге /etc/sasl2 создаём файл smtpd.conf с содержимым:
pwcheck_method: saslauthd
mech_list: plain login
Этот файл говорит SASL, что для сервиса smtpd:
1. для проверки пароля надо использовать метод saslauthd.
2. методы проверки пароля только PLAIN и LOGIN.
saslauthd - это программа-демон, которая должна быть запущена. Она умеет проверять пароли с помощью PAM.
Перед запуском следует создать каталог /var/run/saslauthd .
Для проверки программу стоит запустить вручную:
saslauthd -a pam -d
В компании с ней идёт testsaslauthd - программа проверки сервера saslauthd. Делаем проверку:
testsaslauthd -u zdotest1 -p password
Должны получить в ответ:
0: OK "Success.
В протоколе работы saslauthd вы должны увидеть что-нибудь вроде:
saslauthd[12011] :rel_accept_lock : released accept lock
saslauthd[12012] :get_accept_lock : acquired accept lock
saslauthd[15107] :server_exit : child exited: 15107
saslauthd[15108] :server_exit : child exited: 15108
saslauthd[15109] :server_exit : child exited: 15109
saslauthd[12011] :do_auth : auth success: [user=zdotest1] [service=imap] [realm=] [mech=pam]
saslauthd[12011] :do_request : response: OK
Обратите внимание, что testsaslauthd использует название сервиса "imap". У вас в системе для этого сервиса должен быть настроен PAM. В файле /etc/pam.d/imap у меня записано:
#%PAM-1.0
auth include system-auth
account include system-auth
Если этап проверки пройден успешно, то saslauthd должен быть запущен в системе уже как нормальный сервис.
Параметры командной строки запуска в Alt Linux настраиваются в /etc/sysconfig/saslauthd:
OPTIONS="-a pam -n 0"
Здесь указали, что способ аутентификации PAM и без параллельных потоков. В той версии, с которой я имел дело "-n 0" было важно. Глюки в параллельности приводили к глюкам в аутентификации.
Дальше как обычно:
chkconfig saslauthd on
service saslauthd start
Настройка Postfix,PAM.
Надеюсь, что читатель нормально владеет английским и может прочесть автодокументированные файлы конфигурации Postfix-а и дополнительные описания в/etc/postfix/README_FILES. Я здесь не буду описывать все мучительные подробности ключей конфигурации. Вы всё это можете почерпнуть из описаний.
0. Этот пункт описывает обычные настройки программы, которые не относятся к повышению защищённости приёма-передачи почты.
myhostname = mail.dom.ru
mydomain = dom.ru
myorigin = $mydomain
inet_interfaces = 1.1.1.1
mydestination = 1.1.1.1, $myhostname, $mydomain, mail.$mydomain
mynetworks = 1.1.1.1, 127.0.0.1/8, 192.168.1.1
unknown_local_recipient_reject_code = 550
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
mailbox_size_limit = 50000000
1. Делаем символьную ссылку /etc/postfix/sasl -> /etc/sasl2:
ln -s /etc/sasl2 /etc/postfix/sasl
2. Выводим smtpd Postfix-а из chroot-режима. Для этого в файле /etc/postfix/master.cf в строке с smtpd (первая строка) ставим в колонке "chroot" букву n.
(Добавлю, что с самой этой строки надо снять знак комментария, чтобы получение почты по протоколу SMTP работало.)
3. Поскольку Postfix запрашивает сервис "smtp" у saslauthd, а saslauthd в свою очередь запросит PAM с таким именем, у нас в каталоге / etc/pam.d должен быть файл smtp со следующим содержанием:
#%PAM-1.0
auth include system-auth
account include system-auth
4. В /etc/postfix/main.cf:
# Важно! В список своих сети вводим только один IP, торчащий в Internet
# Если указать здесь свои сети, то заставить авторизоваться
# клиента вы не сможете
mynetworks_style = host
mynetworks = 195.1.1.1
5. В /etc/postfix/main.cf:
# Здесь мы вводим защиту от спамеров
# Важно в правильном месте вписать permit_sasl_authenticated
# Это касается smtp-авторизации
smtpd_client_restrictions = permit_mynetworks,
reject_invalid_hostname,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
permit_sasl_authenticated,
reject_unauth_pipelining,
reject_unauth_destination,
reject_rbl_client list.dsbl.org,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client sbl.spamhaus.org,
reject_rbl_client dul.dnsbl.sorbs.net,
reject_rbl_client xbl.spamhaus.org,
reject_rbl_client dul.ru
6. В /etc/postfix/main.cf:
strict_rfc821_envelopes = yes
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_sasl_authenticated,
permit_mynetworks,
reject_invalid_hostname,
reject_non_fqdn_hostname
7. В /etc/postfix/main.cf:
# Разрешим аутентификацию через SASL
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = smtpd
smtpd_sasl_type = cyrus
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
8. В /etc/postfix/main.cf:
# Обязательная проверка пароля в секции recipient:
smtpd_recipient_restrictions = permit_sasl_authenticated,
reject_unknown_recipient_domain,
reject_non_fqdn_recipient,
permit_mynetworks,
reject_sender_login_mismatch,
reject_unauth_destination
Примечание:
В таком режиме Postfix-а команда newaliases больше не работает.
Если у вас способ хранения алиасов hash, то используйте:
postalias hash:aliases
9. В /etc/postfix/main.cf:
# Обязательное требование шифрованного канала для аутентификации и передачи данных:
smtpd_tls_cert_file = /var/lib/ssl/certs/imapd.pem
smtpd_tls_key_file = $ smtpd_tls_cert_file
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
В этих настройках я указал, что файл с сертификатом и закрытым ключом я использую такой же, как и для сервера IMAP.
В настройках сертификата вы должны имя сервера должно совпадать с реальным именем машины.
Как сгенерировать такой ключ, см. документ про IMAP-сервер.
10. В /etc/postfix/master.cf необходимо раскомментировать строку для smtps и оснастить
её ключами:
smtp inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
Настройка Greylist в Postfix.
Из каталога /usr/share/doc/postfix-2.3.9/examples/smtpd-policy переписываем файл greylist.pl в каталог /etc/postfix. Это выполняемый файл. Postfix делегирует этой программе право определить политику разрешения приёма писем дополнительно к своим политикам.
Создаём каталог /var/lib/postfix. Назначаем ему владельца nobody. В этом каталоге программа создаст базу отложенных почтовых запросов "greylist.db". База будет расти и файл базы стоит периодически удалять. Смотрите сами по загрузке спамом вашего почтового сервера и объёму базы. После уничтожения базы стоит перезапустить и Posfix, поскольку в этот момент он мог работать с программой политики.
В /etc/postfix/master.cf указываем программу:
policy unix - n n - - spawn user=nobody argv=/usr/bin/perl /etc/postfix/greylist.pl
В /etc/postfix/main.cf указываем время жизни потомка Postfix для этой программы:
policy_time_limit = 3600
Ранее описанный пункт 7 для /etc/postfix/main.cf теперь выглядит так:
# Обязательная проверка пароля в секции recipient:
smtpd_recipient_restrictions = permit_sasl_authenticated,
reject_unknown_recipient_domain,
reject_non_fqdn_recipient,
check_policy_service unix:private/policy,
permit_mynetworks,
reject_sender_login_mismatch,
reject_unauth_destination
Если вы хотите пропускать почту с каких-то машин без задержек, то добавьте строку:
# Обязательная проверка пароля в секции recipient:
smtpd_recipient_restrictions = permit_sasl_authenticated,
reject_unknown_recipient_domain,
reject_non_fqdn_recipient,
check_sender_access hash:/etc/postfix/sender_access,
check_policy_service unix:private/policy,
permit_mynetworks,
reject_sender_login_mismatch,
reject_unauth_destination
и в файле /etc/postfix/sender_access укажите эти хосты. Например :
vasya.com OK
...
Не забудьте сделать файл хэша sender_access.db командой:
postalias hash:sender_access
Настройки почтовой программы.
Я использую обычно Seamonkey. В настройках учётной записи для SMTP-сервера укажите использовать аутентификацию и установите галочку использовать "SSL" и порт 465.
Это выглядит примерно так:
seamonkey-sasl
При первой отправке почты Seamonkey заинтересуется самоподписанным сертификатом. Согласитесь принять сертификат и она от вас отстанет.
Проверка.
Не опускайте этот этап! Неправильная настройка mynetworks и некоторые детали, которые вы можете ввести в описанную конфигурацию, может изрядно подкосить безопасность соединений.
1. Включите в клиенте отправку без авторизации и проверьте, что Posfix не пропустит подобное письмо.
2. Отключите в клиенте отправку в режиме TLS и проверьте, что Postfix не пропустит подобное письмо.
Последующая часть документа осталась здесь только потому, что я изначально собирал SASL и Postfix самостоятельно, чтобы исключить глюки сборок пакетов из дистрибутива (и так проблем хватало :-) ). Мне жалко её удалять :-) , поскольку вполне может кому-нибудь пригодиться, может быть и мне самому.
(Как в воду глядел! Уже пригодилась!)
Установка SASL.
Раскрыть дистрибутив в каталог /usr/src/cyrus-sasl-2.1.22
Установить недостающие пакеты. У меня это были libpam0-devel, openssl-devel
Запустить configure с нужными ключами: ./configure --with-pam --without-des
make && make install
Сделать символический линк /usr/lib/sasl2 -> /usr/local/lib/sasl2. ЭТО ВАЖНО!
Добавить в /etc/ld.so.conf строку: /usr/local/lib и выполнить: ldconfig
Запустить в тестовом режиме: /usr/local/sbin/saslauthd -a pam -d -n 0
Проверить, что пароли системы saslauthd (демон аутентификации SASL) может проверять:
/usr/local/sbin/testsaslauthd -u user -p passwd
и получить
0: OK "Success."
Если всё так хорошо, и вам не требуются протоколы saslauthd для отладки, то остановите saslauthd и запустите его в боевом режиме. Лучше вставить в /etc/rc.d/init.d скрипт, чтобы saslauthd пускался как сервис.
Создать /etc/sasl2/smtp.conf и вписать в него:
pwcheck_method: saslauthd
Примечание: У меня для аутентификации юзеров используется LDAP. В данной схеме saslauthd использует PAM, который в свою очередь использует LDAP. saslauthd может быть напрямую настроен на использование LDAP, но лично мне дополнительные конфиги с LDAP совсем не нужны.
Установка Postfix.
Для того, чтобы разрешить SASL аутентификацию в Postfix SMTP сервере необходимо раскрыть его дистрибутив и в каталоге/usr/src/postfix-2.4.3 запустить:
make makefiles CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/local/include/sasl" AUXLIBS="-L/usr/local/lib -lsasl2"
make
make install
Дальше рихтуем /etc/postfix/main.cf и /etc/postfix/master.cf