Postfix+Cyrus-SASL2: механизмы аутентификации

Думаю, что рано или поздно каждый системный администратор сталкивается с необходимостью настройки аутентификации, которая с одной стороны позволяет бороться со спамом (не позволяет использовать ваш МТА в качестве open relay), а с другой обеспечивает некоторый уровень безопасности. Пожалуй, наиболее распространенным ПО для решения данной задачи является библиотека Cyrus-SASL2.
Аутентификация - проверка логина и пароля по некоторому алгоритму (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.
# 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.
Как видно аутентификация прошла успешно и письмо мы отправили. Посмотрим что у нас в логах
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("\0test\0password")'
AHRlc3QAcGFzc3dvcmQ=
Если пароль у пользователя начинается с цифры, то его необходимо экранировать с помощью 3х нолей, а не одного. Например, команда генерации ответа для пользователя test с паролем 123 будет выглядеть так:
# perl -MMIME::Base64 -e 'print encode_base64("\0test\000123")'
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
# 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.
Как видно аутентификация прошла успешно и письмо мы отправили. Посмотрим что у нас в логах
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("\0alex\@vmware\.local\0001234567")'
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




