Создан: 17.07.2007
Модиф: 04.06.2008
Иванов Аркадий
Задачи:
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 .
Для проверки программу стоит запустить вручную:
В компании с ней идёт testsaslauthd - программа проверки сервера saslauthd. Делаем проверку:
testsaslauthd -u zdotest1 -p password |
Должны получить в ответ:
В протоколе работы 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:
Здесь указали, что способ аутентификации 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 для этой программы:
- Ранее описанный пункт 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 укажите эти хосты. Например : Не забудьте сделать файл хэша sender_access.db командой: postalias hash:sender_access |
Настройки почтовой программы.
Я использую обычно Seamonkey. В настройках учётной записи для SMTP-сервера укажите использовать аутентификацию и установите галочку использовать "SSL" и порт 465.
Это выглядит примерно так:
При первой отправке почты 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