Главная » 2009 Сентябрь 29 » Postfix+Cyrus-SASL2: механизмы аутентификации
11:11 Postfix+Cyrus-SASL2: механизмы аутентификации |
Введение Думаю, что рано или поздно каждый системный администратор сталкивается с необходимостью настройки аутентификации, которая с одной стороны позволяет бороться со спамом (не позволяет использовать ваш МТА в качестве 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("\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 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("\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 |
|
Всего комментариев: 0 | |