Инструменты пользователя

Инструменты сайта


mail:postfix-cyrus-sasl2

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

mail:postfix-cyrus-sasl2 [2012/05/19 19:39] (текущий)
Строка 1: Строка 1:
 +====== Postfix+Cyrus-SASL2:​ механизмы аутентификации ======
  
 +===== Введение =====
 +
 +Думаю, что рано или поздно каждый системный администратор сталкивается с необходимостью настройки аутентификации,​ которая с одной стороны позволяет бороться со спамом (не позволяет использовать ваш МТА в качестве open relay), а с другой обеспечивает некоторый уровень безопасности. Пожалуй,​ наиболее распространенным ПО для решения данной задачи является библиотека Cyrus-SASL2.
 +Аутентификация vs Авторизация
 +Многие путают или не понимают разницу между аутентификацией и авторизацией,​ хоть это и взаимосвязанные понятия,​ все таки надо понимать их отличия.
 +
 +<note tip>
 +<color #​990000>​** Аутентификация **</​color>​ - проверка логина и пароля по некоторому алгоритму (PLAIN, LOGIN, CRAM-MD5, etc)
 +\\ <color #​990000>​** Авторизация **</​color>​ - разграничение прав пользователей,​ которые прошли аутентификацию.
 +</​note>​
 +
 +В сетях всемирной паутины вы найдете много статей,​ в которых описывается процесс настройки Postfix+Cyrus-SASL2. Но, как правило,​ все они используют СУБД для хранения информации о пользователях и почтовых ящиках. В этом есть свои преимущества,​ например для управления почтовыми ящиками можно использовать postfixadmin. Но что делать,​ если у вас уже есть 5-10 системных пользователей и у вас нет желания/​возможности установить СУБД? В этой статье я и попытаюсь ответить на этот вопрос.
 +
 +Итак, у нас имеется следующая система:​
 +<cli>
 +# 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
 +</​cli>​
 +
 +===== Postfix+Cyrus-SASL2+saslauthd (системные пользователи) =====
 +
 +Итак, создаем для тестовых целей пользователя test и задаем ему пароль - password.
 +
 +<cli>
 +# 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.
 +</​cli>​
 +
 +Теперь нам необходимо проверить поддерживает ли saslauthd необходимый механизм аутентификации. В нашем случае - pam
 +
 +<cli>
 +# saslauthd -v
 +saslauthd 2.1.22
 +authentication mechanisms: getpwent kerberos5 pam rimap shadow ldap
 +</​cli>​
 +
 +Как видно из вывода команды - все нормально,​ если же среди механизмов нет pam, то вам придется пересобрать cyrus-sasl2 с поддержкой pam.
 +
 +===== Установка saslauthd на FreeBSD =====
 +
 +В данной операционной системе saslauthd не устанавливается при установке cyrus-sasl2,​ как в linux системах. Для установки данного демона необходимо устанавить порт:
 +
 +<cli>
 +# cd /​usr/​ports/​security-cyrus-sasl2-saslauthd
 +# make install clean
 +
 +# saslauthd -v
 +saslauthd 2.1.22
 +authentication mechanisms: sasldb getpwent kerberos5 pam rimap
 +</​cli>​
 +
 +Как видно, список поддерживаемых механизмов немного отличается от CentOS, но необходимый нам механизм pam присутствует.
 +
 +Теперь настраиваем запуск демона saslauthd вместе с системой и указываем необходимый механизм аутентификации.
 +
 +<​code>​
 +#
 +# /​etc/​sysconfig/​saslauthd
 +#
 +
 +# Директория,​ в которой располагается сокет saslauthd, pid файл и т.п.
 +# Данная директория должна уже существовать.
 +SOCKETDIR=/​var/​run/​saslauthd
 +
 +# Механизм,​ используемый для проверки пароля. Список поддерживаемых механизмов
 +# можно получить выполнив команду saslauthd -v
 +MECH=pam
 +
 +# Дополнительные флаги, передаваемые демону saslauthd. Например,​ вы можете
 +# запустить saslauthd в режиме отладки,​ указав флаг '​-d'​.
 +# Для списка флагов смотрите страницу руководства saslauthd(8).
 +FLAGS=
 +</​code>​
 +
 +<cli>
 +# chkconfig --level 35 saslauthd on
 +# service saslauthd start
 +Starting saslauthd: ​                                       [  OK  ]
 +</​cli>​
 +
 +После этого вы можете проверить работу saslauthd. Для этого необходимо выполнить следующую команду:​
 +
 +<cli>
 +# testsaslauthd -u test -p password -s smtp
 +0: OK "​Success."​
 +</​cli>​
 +
 +smtp - имя конфигурационного файла PAM (службы),​ который располагается в папке /etc/pam.d/
 +
 +Если у вас такой же ответ - поздравляю,​ половину работы мы сделали. Итак, подготовительную часть работы мы выполнили. теперь осталось включить поддержку cyrus-sasl в postfix. Этим мы и займемся.
 +
 +Для этого создаем файл /​usr/​lib/​sasl2/​smtpd.conf,​ если его нет, и заполняем таким содержимым:​
 +
 +<cli>
 +# cat /​usr/​lib/​sasl2/​smtpd.conf
 +pwcheck_method:​ saslauthd
 +mech_list: plain login
 +</​cli>​
 +
 +По умолчанию именно из этого файла postfix считывает настройки sasl аутентификации. Имя файла можно изменить с помощью параметра smtpd_sasl_path.
 +
 +Теперь включаем поддержку sasl в postfix, для этого необходимо добавить всего одну строку в основной конфигурационный файл postfix main.cf, а именно - smtpd_sasl_auth_enable=yes.
 +
 +<cli>
 +# postconf -n
 +inet_interfaces = all
 +mydestination = $myhostname,​ localhost.$mydomain,​ localhost, $mydomain
 +mydomain = sys-adm.local
 +myhostname = centos5.sys-adm.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
 +</​cli>​
 +
 +Здесь я привел минимально необходимые параметры для работы и проверки аутентификации/​авторизации. Если вас интересует более полное описание настроек,​ прочтите мою статью.
 +
 +Теперь у нас все готово для проверки,​ запускаем postfix
 +
 +<cli>
 +# service postfix start
 +Starting postfix: ​                                       [  OK  ]
 +</​cli>​
 +
 +И проверяем аутентификацию
 +
 +<cli>
 +# telnet localhost 25
 +Trying 127.0.0.1...
 +Connected to localhost.localdomain (127.0.0.1).
 +Escape character is '​^]'​.
 +220 centos5.sys-adm.local ESMTP Postfix
 +EHLO localhost
 +250-centos5.sys-adm.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@sys-adm.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.
 +</​cli>​
 +
 +Как видно аутентификация прошла успешно и письмо мы отправили. Посмотрим что у нас в логах
 +
 +<cli>
 +# cat maillog | grep 00A3060027
 +Jan 17 01:38:55 centos5 postfix/​smtpd[5001]:​ 00A3060027: client=centos5.sys-adm.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.sys-adm.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@sys-adm.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
 +</​cli>​
 +
 +Чтобы сгенерировать ответ для PLAIN аутентификации,​ необходимо выполнить следующую команду:​
 +
 +<cli>
 +# perl -MMIME::​Base64 -e  'print encode_base64("​\0test\0password"​)'​
 +AHRlc3QAcGFzc3dvcmQ=
 +</​cli>​
 +
 +Если пароль у пользователя начинается с цифры, то его необходимо экранировать с помощью 3х нолей, а не одного. Например,​ команда генерации ответа для пользователя test с паролем 123 будет выглядеть так:
 +
 +<cli>
 +# perl -MMIME::​Base64 -e  'print encode_base64("​\0test\000123"​)'​
 +AHRlc3QAMTIz
 +</​cli>​
 +
 +На этом настройку можно считать завершенной. Теперь переходим к виртуальным пользователям.
 +
 +===== Postfix+Cyrus-SASL2+sasldb (виртуальные пользователи) =====
 +
 +
 +Использование системных пользователей является не очень удобным в плане поддержки,​ а также представляет некоторый риск в плане безопасности всей системы. Кроме того, использование системных пользователей накладывает следующие ограничения:​
 +
 +    * неудобство использования двух одинаковых пользователей (если ваш МТА обслуживает несколько доменов),​ например alex@domain1.com и alex@domain2.com,​ т.к. системный пользователь alex может быть только один;
 +    * вы не можете использовать maildir, только mailbox;
 +    * невозможность использования квот;
 +    * имя пользователя не может содержать больше 32 символов (при использовании алиасов,​ содержащих полное имя и фамилию 32 символов может не хватать)
 +
 +Эти, а также другие неудобства и недостатки решаются с использованием виртуальных пользователей.
 +
 +Cyrus-sasl предоставляет собственную базу данных для хранения паролей пользователей - sasldb. Все имена пользователей,​ а также их пароли хранятся в файле /​etc/​sasldb2. Именно ее настройкой мы и займемся.
 +
 +Первое что нам потребуется - это создать пользователя и задать ему пароль. Для этого выполняем следующую команду:​
 +
 +<cli>
 +# saslpasswd2 -c -u sys-adm.local alex
 +Password: *******
 +Again (for verification):​ *******
 +</​cli>​
 +
 +После успешного создания пользователя мы можем просмотреть нашу базу данных с помощью следующей команды:​
 +
 +<cli>
 +# sasldblistusers2
 +alex@sys-adm.local:​ userPassword
 +</​cli>​
 +
 +Теперь нам необходимо изменить файл smtpd.conf и указать,​ что теперь мы будем использовать sasldb:
 +
 +<cli>
 +# cat /​usr/​lib/​sasl2/​smtpd.conf
 +pwcheck_method:​ auxprop
 +auxprop_plugin:​ sasldb
 +mech_list: plain login
 +</​cli>​
 +
 +Вот собственно и вся настройка. Единственное что, это надо изменить права на файл /​etc/​sasldb2,​ иначе postfix не сможет прочитать данные из данного файла.
 +
 +<cli>
 +# chown root:​postfix /​etc/​sasldb2
 +# ls -la /​etc/​sasldb2
 +-rw-r----- 1 root postfix 12288 Jan 17 10:37 /​etc/​sasldb2
 +</​cli>​
 +
 +FreeBSD: sasldb
 +Если вы обратили внимание на список механизмов,​ поддерживаемых saslauthd, на FreeBSD, то среди них есть механизм sasldb. Это именно тот метод, который мы используем на linux. Т.е. для аутентификации пользователей с помощью sasldb вам достаточно добавить в rc.conf следующую строку:​
 +
 +<cli>
 +# echo '​saslauthd_flags="​-a sasldb"'​ >> /​etc/​rc.conf
 +</​cli>​
 +
 +При этом нет необходимости менять содержимое файла smtpd.conf, он остается таким же, как и для аутентификации системных пользователей.
 +
 +Но вам по-прежнему никто не мешает использовать метод auxprop и плагин sasldb.
 +
 +Так как пользователи у нас виртуальные,​ то в postfix нам необходимо будет указать,​ где будет храниться их почта:
 +
 +<cli>
 +# 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 = sys-adm.local
 +virtual_mailbox_maps = hash:/​etc/​postfix/​virtual_user
 +virtual_uid_maps = static:1981
 +</​cli>​
 +
 +Как и раньше,​ я привел лишь минимальный набор параметров,​ достаточный для проверки аутентификации. Файлы virtual_user и virtual_alias надо создать самому и заполнить примерно таким содержимым:​
 +
 +<cli>
 +# cat virtual_alias
 +Domoradov.Alex@sys-adm.local alex@sys-adm.local
 +
 +# cat virtual_user
 +alex@sys-adm.local sys-adm.local/​alex@sys-adm.local/​
 +</​cli>​
 +
 +При такой настройке,​ почта для пользователя alex@sys-adm.local будет сохраняться в папке /​var/​spool/​mail/​sys-adm.local/​alex@sys-adm.local/​. В формате maildir, о чем свидетельствует символ / в конце пути почтового ящика в файле virtual_user.
 +
 +После этого создаем сами базы и пользователя virtual:
 +
 +<cli>
 +# 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/​
 +</​cli>​
 +
 +Теперь у нас все готово для проверки,​ запускаем postfix
 +
 +<cli>
 +# service postfix start
 +Starting postfix: ​                                       [  OK  ]
 +</​cli>​
 +
 +И проверяем аутентификацию
 +
 +<cli>
 +# telnet localhost 25
 +Trying 127.0.0.1...
 +Connected to localhost.localdomain (127.0.0.1).
 +Escape character is '​^]'​.
 +220 centos5.sys-adm.local ESMTP Postfix
 +EHLO localhost
 +250-centos5.sys-adm.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@sys-adm.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.
 +</​cli>​
 +
 +Как видно аутентификация прошла успешно и письмо мы отправили. Посмотрим что у нас в логах
 +
 +<cli>
 +# cat /​var/​log/​maillog | grep 498086003F
 +Jan 17 13:16:07 centos5 postfix/​smtpd[16254]:​ 498086003F: client=centos5.sys-adm.local[127.0.0.1],​ sasl_method=plain,​ sasl_username=alex@sys-adm.local
 +Jan 17 13:16:11 centos5 postfix/​cleanup[16257]:​ 498086003F: message-id=<​20080117111607.498086003F@centos5.sys-adm.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@sys-adm.local>,​ orig_to=<​Domoradov.Alex@sys-adm>,​ 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
 +</​cli>​
 +
 +Как и раньше,​ чтобы сгенерировать ответ для PLAIN аутентификации,​ необходимо выполнить следующую команду:​
 +
 +<cli>
 +# perl -MMIME::​Base64 -e  'print encode_base64("​\0alex\@sys-adm\.local\0001234567"​)'​
 +AGFsZXhAdm13YXJlLmxvY2FsADEyMzQ1Njc=
 +</​cli>​
 +
 +Обратите внимание,​ что для виртуальных пользователей надо указывать и домен, в отличие от системных,​ где мы указывали только имя пользователя.
 +
 +На этом настройку можно считать завершенной.
 +
 +===== Послесловие =====
 +
 +Вы также можете использовать оба механизма аутентификации одновременно. Например,​ в домене domain1.com пользователи будут системные и аутентифицироваться с помощью saslauthd и механизма pam. А для домена domain2.com пользователи будут виртуальными и аутентифицироваться через sasldb.
 +
 +При таком способе наш smtpd.conf файл будет выглядеть следующим образом:​
 +
 +<cli>
 +# cat /​usr/​lib/​sasl2/​smtpd.conf
 +pwcheck_method:​ auxprop saslauthd
 +auxprop_plugin:​ sasldb
 +mech_list: plain login
 +</​cli>​
 +
 +На FreeBSD данная задача решается еще проще. Достаточно добавить следующую строку в rc.conf:
 +
 +<cli>
 +# echo '​saslauthd_flags="​-a sasldb pam"'​ >> /​etc/​rc.conf
 +</​cli>​
 +
 +При этом файл smtpd.conf будет иметь следующий вид:
 +
 +<cli>
 +# cat /​usr/​lib/​sasl2/​smtpd.conf
 +pwcheck_method:​ saslauthd
 +mech_list: plain login
 +</​cli>​
mail/postfix-cyrus-sasl2.txt · Последние изменения: 2012/05/19 19:39 (внешнее изменение)