POSTFIX+CYRUS-SASL2: МЕХАНИЗМЫ АУТЕНТИФИКАЦИИ


СОДЕРЖАНИЕ
" Введение
" Postfix+Cyrus-SASL2+saslauthd (системные пользователи)
" Postfix+Cyrus-SASL2+sasldb (виртуальные пользователи)
" Послесловие
ПРИМЕЧАНИЕ
При размещении данного материала у себя на сайте, просьба указывать ссылку на оригинальный сайт - www.sys-adm.org.ua.
ВВЕДЕНИЕ
Думаю, что рано или поздно каждый системный администратор сталкивается с необходимостью настройки аутентификации, которая с одной стороны позволяет бороться со спамом (не позволяет использовать ваш МТА в качестве open relay), а с другой обеспечивает некоторый уровень безопасности. Пожалуй, наиболее распространенным ПО для решения данной задачи является библиотека Cyrus-SASL2.
АУТЕНТИФИКАЦИЯ VS АВТОРИЗАЦИЯ
Многие путают или не понимают разницу между аутентификацией и авторизацией, хоть это и взаимосвязанные понятия, все таки надо понимать их отличия.

Аутентификация - проверка логина и пароля по некоторому алгоритму (PLAIN, LOGIN, CRAM-MD5, etc)

Авторизация - разграничение прав пользователей, которые прошли аутентификацию.
В сетях всемирной паутины вы найдете много статей, в которых описывается процесс настройки Postfix+Cyrus-SASL2. Но, как правило, все они используют СУБД для хранения информации о пользователях и почтовых ящиках. В этом есть свои преимущества, например для управления почтовыми ящиками можно использовать postfixadmin. Но что делать, если у вас уже есть 5-10 системных пользователей и у вас нет желания/возможности установить СУБД? В этой статье я и попытаюсь ответить на этот вопрос.
Итак, у нас имеется следующая система:
# uname -r
2.6.18-53.1.4.el5

# cat /etc/redhat-release
CentOS release 5 (Final)

# postconf | grep ^mail_version
mail_version = 2.3.3
POSTFIX+CYRUS-SASL2+SASLAUTHD (СИСТЕМНЫЕ ПОЛЬЗОВАТЕЛИ)
Итак, создаем для тестовых целей пользователя test и задаем ему пароль - password.
# useradd -s /bin/false test
# passwd test
Changing password for user test.
New UNIX password: *******
Retype new UNIX password: *******
passwd: all authentication tokens updated successfully.
Теперь нам необходимо проверить поддерживает ли saslauthd необходимый механизм аутентификации. В нашем случае - pam
# saslauthd -v
saslauthd 2.1.22
authentication mechanisms: getpwent kerberos5 pam rimap shadow ldap
Как видно из вывода команды - все нормально, если же среди механизмов нет pam, то вам придется пересобрать cyrus-sasl2 с поддержкой pam.
УСТАНОВКА SASLAUTHD НА FREEBSD
В данной операционной системе saslauthd не устанавливается при установке cyrus-sasl2, как в linux системах. Для установки данного демона необходимо устанавить порт:
# cd /usr/ports/security-cyrus-sasl2-saslauthd
# make install clean

# saslauthd -v
saslauthd 2.1.22
authentication mechanisms: sasldb getpwent kerberos5 pam rimap
Как видно, список поддерживаемых механизмов немного отличается от CentOS, но необходимый нам механизм pam присутствует.
Теперь настраиваем запуск демона saslauthd вместе с системой и указываем необходимый механизм аутентификации.
#
# /etc/sysconfig/saslauthd
#

# Директория, в которой располагается сокет saslauthd, pid файл и т.п.
# Данная директория должна уже существовать.
SOCKETDIR=/var/run/saslauthd

# Механизм, используемый для проверки пароля. Список поддерживаемых механизмов
# можно получить выполнив команду saslauthd -v
MECH=pam

# Дополнительные флаги, передаваемые демону saslauthd. Например, вы можете
# запустить saslauthd в режиме отладки, указав флаг '-d'.
# Для списка флагов смотрите страницу руководства saslauthd(8).
FLAGS=
# chkconfig --level 35 saslauthd on
# service saslauthd start
Starting saslauthd: [ OK ]
После этого вы можете проверить работу saslauthd. Для этого необходимо выполнить следующую команду:
# testsaslauthd -u test -p password -s smtp
0: OK "Success."
smtp - имя конфигурационного файла PAM (службы), который располагается в папке /etc/pam.d/
Если у вас такой же ответ - поздравляю, половину работы мы сделали. Итак, подготовительную часть работы мы выполнили. теперь осталось включить поддержку cyrus-sasl в postfix. Этим мы и займемся.
Для этого создаем файл /usr/lib/sasl2/smtpd.conf, если его нет, и заполняем таким содержимым:
# cat /usr/lib/sasl2/smtpd.conf
pwcheck_method: saslauthd
mech_list: plain login
По умолчанию именно из этого файла postfix считывает настройки sasl аутентификации. Имя файла можно изменить с помощью параметра smtpd_sasl_path.
Теперь включаем поддержку sasl в postfix, для этого необходимо добавить всего одну строку в основной конфигурационный файл postfix main.cf, а именно - smtpd_sasl_auth_enable=yes.
# postconf -n
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mydomain = vmware.local
myhostname = centos5.vmware.local
mynetworks = 127.0.0.0/8
myorigin = $mydomain
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_auth_enable = yes
Здесь я привел минимально необходимые параметры для работы и проверки аутентификации/авторизации. Если вас интересует более полное описание настроек, прочтите мою статью.
Теперь у нас все готово для проверки, запускаем postfix
# service postfix start
Starting postfix: [ OK ]
И проверяем аутентификацию
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 centos5.vmware.local ESMTP Postfix
EHLO localhost
250-centos5.vmware.local
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN
334
AHRlc3QAcGFzc3dvcmQ=
235 2.0.0 Authentication successful
mail from:<>
250 2.1.0 Ok
rcpt to:<test@vmware.local>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Hello world!!!
.
250 2.0.0 Ok: queued as 00A3060027
quit
221 2.0.0 Bye
Connection closed by foreign host.
Как видно аутентификация прошла успешно и письмо мы отправили. Посмотрим что у нас в логах
# cat maillog | grep 00A3060027
Jan 17 01:38:55 centos5 postfix/smtpd[5001]: 00A3060027: client=centos5.vmware.local[127.0.0.1], sasl_method=plain, sasl_username=test
Jan 17 01:39:42 centos5 postfix/cleanup[9916]: 00A3060027: message-id=<20080116233855.00A3060027@centos5.vmware.local>
Jan 17 01:39:42 centos5 postfix/qmgr[2813]: 00A3060027: from=<>, size=378, nrcpt=1 (queue active)
Jan 17 01:39:42 centos5 postfix/local[13589]: 00A3060027: to=<test@vmware.local>, relay=local, delay=73, delays=73/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox)
Jan 17 01:39:42 centos5 postfix/qmgr[2813]: 00A3060027: removed
Чтобы сгенерировать ответ для PLAIN аутентификации, необходимо выполнить следующую команду:
# perl -MMIME::Base64 -e 'print encode_base64("testpassword")'
AHRlc3QAcGFzc3dvcmQ=
Если пароль у пользователя начинается с цифры, то его необходимо экранировать с помощью 3х нолей, а не одного. Например, команда генерации ответа для пользователя test с паролем 123 будет выглядеть так:
# perl -MMIME::Base64 -e 'print encode_base64("test00123")'
AHRlc3QAMTIz
На этом настройку можно считать завершенной. Теперь переходим к виртуальным пользователям.
POSTFIX+CYRUS-SASL2+SASLDB (ВИРТУАЛЬНЫЕ ПОЛЬЗОВАТЕЛИ)
Использование системных пользователей является не очень удобным в плане поддержки, а также представляет некоторый риск в плане безопасности всей системы. Кроме того, использование системных пользователей накладывает следующие ограничения:
" неудобство использования двух одинаковых пользователей (если ваш МТА обслуживает несколько доменов), например alex@domain1.com и alex@domain2.com, т.к. системный пользователь alex может быть только один;
" вы не можете использовать maildir, только mailbox;
" невозможность использования квот;
" имя пользователя не может содержать больше 32 символов (при использовании алиасов, содержащих полное имя и фамилию 32 символов может не хватать)
Эти, а также другие неудобства и недостатки решаются с использованием виртуальных пользователей.
Cyrus-sasl предоставляет собственную базу данных для хранения паролей пользователей - sasldb. Все имена пользователей, а также их пароли хранятся в файле /etc/sasldb2. Именно ее настройкой мы и займемся.
Первое что нам потребуется - это создать пользователя и задать ему пароль. Для этого выполняем следующую команду:
# saslpasswd2 -c -u vmware.local alex
Password: *******
Again (for verification): *******
После успешного создания пользователя мы можем просмотреть нашу базу данных с помощью следующей команды:
# sasldblistusers2
alex@vmware.local: userPassword
Теперь нам необходимо изменить файл smtpd.conf и указать, что теперь мы будем использовать sasldb:
# cat /usr/lib/sasl2/smtpd.conf
pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: plain login
Вот собственно и вся настройка. Единственное что, это надо изменить права на файл /etc/sasldb2, иначе postfix не сможет прочитать данные из данного файла.
# chown root:postfix /etc/sasldb2
# ls -la /etc/sasldb2
-rw-r----- 1 root postfix 12288 Jan 17 10:37 /etc/sasldb2
FREEBSD: SASLDB
Если вы обратили внимание на список механизмов, поддерживаемых saslauthd, на FreeBSD, то среди них есть механизм sasldb. Это именно тот метод, который мы используем на linux. Т.е. для аутентификации пользователей с помощью sasldb вам достаточно добавить в rc.conf следующую строку:
# echo 'saslauthd_flags="-a sasldb"' >> /etc/rc.conf
При этом нет необходимости менять содержимое файла smtpd.conf, он остается таким же, как и для аутентификации системных пользователей.

Но вам по-прежнему никто не мешает использовать метод auxprop и плагин sasldb.
Так как пользователи у нас виртуальные, то в postfix нам необходимо будет указать, где будет храниться их почта:
# postconf -n
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_auth_enable = yes
virtual_alias_maps = hash:/etc/postfix/virtual_alias
virtual_gid_maps = static:1981
virtual_mailbox_base = /var/spool/mail
virtual_mailbox_domains = vmware.local
virtual_mailbox_maps = hash:/etc/postfix/virtual_user
virtual_uid_maps = static:1981
Как и раньше, я привел лишь минимальный набор параметров, достаточный для проверки аутентификации. Файлы virtual_user и virtual_alias надо создать самому и заполнить примерно таким содержимым:
# cat virtual_alias
Domoradov.Alex@vmware.local alex@vmware.local

# cat virtual_user
alex@vmware.local vmware.local/alex@vmware.local/
При такой настройке, почта для пользователя alex@vmware.local будет сохраняться в папке /var/spool/mail/vmware.local/alex@vmware.local/. В формате maildir, о чем свидетельствует символ / в конце пути почтового ящика в файле virtual_user.
После этого создаем сами базы и пользователя virtual:
# postmap virtual_user
# postmap virtual_alias
# groupadd -g 1981 virtual
# useradd virtual -s /bin/false -g virtual -u 1981
# chown virtual:virtual /var/spool/mail/
Теперь у нас все готово для проверки, запускаем postfix
# service postfix start
Starting postfix: [ OK ]
И проверяем аутентификацию
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 centos5.vmware.local ESMTP Postfix
EHLO localhost
250-centos5.vmware.local
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN
334
AGFsZXhAdm13YXJlLmxvY2FsADEyMzQ1Njc=
235 2.0.0 Authentication successful
MAIL FROM:<>
250 2.1.0 Ok
RCPT TO:<Domoradov.Alex@vmware.local>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Hello
.
250 2.0.0 Ok: queued as 498086003F
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
Как видно аутентификация прошла успешно и письмо мы отправили. Посмотрим что у нас в логах
# cat /var/log/maillog | grep 498086003F
Jan 17 13:16:07 centos5 postfix/smtpd[16254]: 498086003F: client=centos5.vmware.local[127.0.0.1], sasl_method=plain, sasl_username=alex@vmware.local
Jan 17 13:16:11 centos5 postfix/cleanup[16257]: 498086003F: message-id=<20080117111607.498086003F@centos5.vmware.local>
Jan 17 13:16:11 centos5 postfix/qmgr[16251]: 498086003F: from=<>, size=364, nrcpt=1 (queue active)
Jan 17 13:16:11 centos5 postfix/virtual[16258]: 498086003F: to=<alex@vmware.local>, orig_to=<Domoradov.Alex@vmware.local>, relay=virtual, delay=14, delays=14/0/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
Jan 17 13:16:11 centos5 postfix/qmgr[16251]: 498086003F: removed
Как и раньше, чтобы сгенерировать ответ для PLAIN аутентификации, необходимо выполнить следующую команду:
# perl -MMIME::Base64 -e 'print encode_base64("alex@vmware.local001234567")'
AGFsZXhAdm13YXJlLmxvY2FsADEyMzQ1Njc=
Обратите внимание, что для виртуальных пользователей надо указывать и домен, в отличие от системных, где мы указывали только имя пользователя.
На этом настройку можно считать завершенной.
ПОСЛЕСЛОВИЕ
Вы также можете использовать оба механизма аутентификации одновременно. Например, в домене domain1.com пользователи будут системные и аутентифицироваться с помощью saslauthd и механизма pam. А для домена domain2.com пользователи будут виртуальными и аутентифицироваться через sasldb.
При таком способе наш smtpd.conf файл будет выглядеть следующим образом:
# cat /usr/lib/sasl2/smtpd.conf
pwcheck_method: auxprop saslauthd
auxprop_plugin: sasldb
mech_list: plain login
На FreeBSD данная задача решается еще проще. Достаточно добавить следующую строку в rc.conf:
# echo 'saslauthd_flags="-a sasldb pam"' >> /etc/rc.conf
При этом файл smtpd.conf будет иметь следующий вид:
# cat /usr/lib/sasl2/smtpd.conf
pwcheck_method: saslauthd
mech_list: plain login

Обновлено: 13.03.2015