POSTFIX + SASL + PAM + BLOCKLISTS + GREYLIST

Создан: 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 . 
Для проверки программу стоит запустить вручную: 

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