Sendmail и SASL авторизация по SMTP


Автор|Источник|Перевод: Горбанев Владимир (www.unixdoc.ru)

В один прекрасный день в нашей конторе кто-то схватил вируса, который начал безудержно спамить налево и направо через наш почтовик. Естественно, через пару дней наш почтовый сервер попал во всевозможные <<черные списки>> и, соответственно, отправлять почту от нас стало проблематично. С нашим почтовиком (Sendmail 8.12.11) просто отказывались <<разговаривать>> другие сервера.

Вирус конечно мы пофиксили быстро, из <<черных списков>> убрались, но остался неприятный осадок. Для противодействия всяким Троянам рассылающим почту непосредственно соединяясь через наш почтовик, было принято решение устроить для всех клиентов SMTP авторизацию.

Примечание: Наиболее популярные почтовые клиенты Outlook Express и The BAT, по-разному осуществляют SMTP-авторизацию. Outlook Express работает только по методу LOGIN, в то время как The BAT работает только с MD5. Метод LOGIN по общему мнению, является ущербным и не надежным (как раз в стиле Microsoft) и пользоваться им не рекомендуется. По этому на вашем предприятии следует придерживаться единообразия почтовых клиентов.

По мнению Великих Гуру, самым оптимальны является использовать при SMTP-авторизации метод LOGIN но через SSL - соединение. Я же решил не углубляться в такие дебри и установить простую аутентификацию методами LOGIN и CRAM-MD5.
Итак начнем. Я работаю в ASP Linux 9.0, поэтому все нижесказанное относится к нему.
Для начала давайте проверим, поддерживает ли sendmail протокол SASL, для этого в командной строке набираем:
[root@adm mail]# sendmail -d0.1 -bv root      
В ответ вам должно выйти примерно следующая информация:
Version 8.12.11
           Compiled with: DNSMAP HESIOD HES_GETMAILHOST LDAPMAP LOG MAP_REGEX
           MATCHGECOS  MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6
           NETUNIX   NEWDB  NIS  PIPELINING  SASL  SCANF  STARTTLS  TCPWRAPPERS
            USERDB USE_LDAP_INIT

           -------- SYSTEM IDENTITY (after readcf)
            (short domain name) $w = adm
            (canonical domain name) $j = adm.roaddep.ru
            (subdomain name) $m = roaddep.ru
            (node name) $k = adm.roaddep.ru
           --------------------------------------
           gorbva... deliverable: mailer local, user gorbva
Смотрим строчку Compiled with и видим там среди прочих упоминание о SASL, значит все ОК. Если же этого нет то тогда вам придется перекомпилировать sendmail с поддержкой SASL, либо скачать и установить новый rpm sendmail-а. Как правило, в rpm-ках сэндмэйл идет уже собранный с поддержкой SASL. Теперь открываем файл /etc/mail/sendmail.cf и ищем там такую директиву:
# dequoting map
 Kdequote dequote
#  class E: names that should be exposed as from this host, even if we masquerade
#  class  L: names that should be delivered locally, even if we have a relay
#  class  M:    domains   that   should   be   converted   to   $M
#  class  N:   domains   that   should   not   be  converted  to  $M
#  CL root

           C{TrustAuthMech}GSSAPI  KERBEROS_V4  DIGEST-MD5  CRAM-MD5  PLAIN LOGIN
           C{E}root
           C{w}localhost.localdomain
Нам важна строчка
C{TrustAuthMech}GSSAPI  KERBEROS_V4  DIGEST-MD5  CRAM-MD5  PLAIN LOGIN
Она означает, что те пользователи, которые прошли аутентификацию вышеуказанными механизмами, смогут отправить почту. Чуете к чему я клоню ? Правильно, пора подправить файл /etc/mail/access. Там наверняка стоит строчка типа:
192.168.1    RELAY
Где 192.168.1 - адрес сетки ваших пользователей, а RELAY означает что почту с этой сетки можно отправлять через sendmail. Вот эту строчку-то и надо убрать. Что у нас тогда получится ? А получится то, что никому отправлять почту наружу нельзя, ... кроме тех, кто прошел аутентификацию. Естественно после таких манипуляций нужно перекомпилировать файл /etc/mail/access в полноценный /etc/mail/access.db . Сделать это можно либо выполнив:
makemap hash /etc/mail/access.db < /etc/mail/access
Либо просто перезапустив sendmail командой:
/etc/rc.d/init.d/sendmail restart
Теперь снова вернемся к файлу /etc/mail/sendmail.cf . Находим и разкомментируем следующие директивы :
# list of authentication mechanisms
O AuthMechanisms=LOGIN PLAIN SSAPI KERBEROS_V4 DIGEST-MD5 CRAM-MD5
Директива указывает допустимые механизмы авторизации. Механизм LOGIN и PLAIN можно убрать, если вы не пользуетесь Outlook Express.
#   default   authentication   information  for  outgoing  connections
O DefaultAuthInfo=/etc/mail/default-auth-info
Честно говоря, я не понял зачем нужна эта директива и что хранится в файле default-auth-info. У меня он пустой.
# SMTP AUTH flags
O AuthOptions=A
Ну эта директива говорит что аутентификацию надо включать.
И так, у нас все настройки исправлены, перезапускаем sendmail и телнетимся на 25 порт.
           [root@adm root]# telnet localhost 25
           Trying 127.0.0.1...
           Connected to localhost.
           Escape character is '^]'.
           220  adm.test.ru  ESMTP Sendmail with AntiSpam 8.12.11/8.12.8; 
Говорим ему EHLO user1 к примеру. Должен быть примерно такой ответ:
           EHLO user1
           250-adm.test.ru Hello localhost [127.0.0.1], pleased to meet you
           250-ENHANCEDSTATUSCODES
           250-PIPELINING
           250-8BITMIME
           250-SIZE
           250-DSN
           250-AUTH LOGIN DIGEST-MD5 CRAM-MD5
           250-DELIVERBY
           250 HELP
Нас интересует наличие строки AUTH после которой идут допустимые механизмы авторизации. Если ее нет, значит что-то вы не так сделали.
Ее может не быть и по следующей причине:
Вы указали в senmail.cf в директиве AuthMechanisms MD-5 механизмы без методов LOGIN или PLAIN, но не заполнили файл с паролями /etc/sasldb.
Для заполнения паролями этого файла воспользуйтесь командой:
saslpasswd  -a sendmail -u username
Она означает добавить пользователя username для процесса sendmail . В ответ она попросит ввести пароль для этого юзера.

Настройка SASL

Теперь нам нужно настроить SASL . Сперва смотрим есть ли он у нас вообще:
           [root@adm init.d]# rpm -qa|grep sasl
           cyrus-sasl-devel-2.1.15-6
           cyrus-sasl-2.1.15-6
           cyrus-sasl-md5-2.1.15-6
           cyrus-sasl-plain-2.1.15-6
           cyrus-sasl-gssapi-2.1.15-6
           [root@adm init.d]#
Вот у меня стоит SASL версии 2.1.15, плюс поддержка для методов MD-5, PLAIN и GSSAPI. Если у вас не показались данные строчки, значит SASL отсутствует, идем на http://www.rpmfind.net/ и качаем оттуда рпм-ки. Если же SASL установлен, то идем и правим файл /usr/lib/sasl/Sendmail.conf Там должна быть одна строчка pwcheck_method: sasldb, она говорит что проверять пароли будет сам SASL из своей базы /etc/sasldb.

Вместо sasluthd можно указать следующие методы:
  • passwd - Поиск пароля будет происходить в файле /etc/passd . Для систем без поддержки shadow.
  • shadow - Поиск будет происходит в файле /etc/shadow.
  • PAM - Использовать метод PAM.
  • Kerberos_v4 - Использовать метод Kerberos
  • pwcheck - Использовать внешнюю программу


  • Так же отмечу, SASL по умолчанию идет без поддержки механизма LOGIN. Как в этом убедится ? Переведите sendmail в режим ведения логов 15, перезапустив его с ключом -O LogLevel=15 . В этом режиме sendmail в своих логах будет подробно приводить сеанс SMTP-сессии. И так, запустите наблюдение за журналом командой:
    tail -f /var/log/maillog
    Эта команда будет выводить на экран файл maillog по-мере поступления в него строк от различных почтовых демонов, в том числе и от sendmail.

    Запускаем <<любимый>> Outlook Express, в настройках учетной записи укажите что SMTP-сервер требует авторизации и введите какие-нибудь имя пользователя и пароль. Напишие письмо самому себе и попытайтесь его отправить. При этом в логах должно появиться примерно следующее:
           May 16 11:07:00 adm sendmail[14969]: j4G5709p014969: <-- EHLO gorbva
           May 16 11:07:00 adm sendmail[14969]: j4G5709p014969:   ---            250-adm.roaddep.ru Hello [192.168.1.126], pleased to meet you
           May 16 11:07:00 adm sendmail[14969]: j4G5709p014969:   --- 250-ENHANCEDSTATUSCODES
           May 16 11:07:00 adm sendmail[14969]: j4G5709p014969:   --- 250-PIPELINING
           May 16 11:07:00 adm sendmail[14969]: j4G5709p014969: --- 250-8BITMIME
           May 16 11:07:00 adm sendmail[14969]: j4G5709p014969: --- 250-SIZE
           May 16 11:07:00 adm sendmail[14969]: j4G5709p014969: --- 250-DSN
           May 16 11:07:00 adm sendmail[14969]: j4G5709p014969: --- 250-AUTH LOGIN DIGEST-MD5 CRAM-MD5
           May 16 11:07:00 adm sendmail[14969]: j4G5709p014969: --- 250-DELIVERBY
           May 16 11:07:00 adm sendmail[14969]: j4G5709p014969: --- 250 HELP
           May 16 11:07:00 adm sendmail[14969]: j4G5709p014969: <-- AUTH LOGIN
           May 16 11:07:00 adm sendmail[14969]: j4G5709p014969:  ---  334 VXNlcm5hbWU6
           May 16 11:07:00 adm sendmail[14969]: j4G5709p014969:  ---  334 UGFzc3dvcmQ6
           May 16 11:07:00 adm sendmail[14969]: j4G5709p014969: --- 535 5.7.0 authentication failed
           May 16 11:07:00 adm sendmail[14969]: j4G5709p014969: AUTH failure (LOGIN): authentication failure (-13)
    Если в качестве при отказа AUTH будет что-то типа "No mechanism available" , то значит, механизм LOGIN не поддерживается. Если он вам нужен, то придется скачать исходник и перекомпилировать SASL с поддержкой механизма LOGIN. Для этого в корневой директории исходника запустите:
    # ./configure  --enable-login
    # make
    #make install
    Проверьте куда установился бинарник и соответственно измените запускающий скрипт.

    Вот вроде и все