SASL к sendmail или авторизация по SMTP
В один прекрасный день в нашей конторе кто-то схватил вируса, который
начал безудержно спамить налево и направо через наш почтовик.
Естественно, через пару дней наш почтовый сервер попал во всевозможные
<<черные списки>> и, соответственно, отправлять почту от нас стало
проблематично. С нашим почтовиком (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
Проверьте куда установился бинарник и соответственно измените
запускающий скрипт.
Вот вроде и все
Если что , пишите <>
Горбанев Владимир
Серьезные квестоманские значения игр жанра квесты для скачивания