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