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

  • 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
    
    Фото автора
    Артем Ведун
    ИТ-специалист, исследователь цифровой гармонии

    Более 15 лет работаю в сфере информационных технологий — от системного администрирования и DevOps до анализа сетевой безопасности. В какой-то момент понял, что цифровые процессы и числа — не только про технологии, но и про закономерности, которые управляют жизнью.

    Так начался мой путь в прикладную нумерологию и изучение того, как числа влияют на решения, инфраструктуру и даже ИТ-проекты.

    В статьях совмещаю строгую логику и символику чисел: от практических гайдов по Linux до разбора цифровых архетипов в бизнесе и киберпространстве.

    Верю, что в мире нет случайных чисел — даже в логах сервера.

    Последние Статьи

    Как выбрать частного SEO‑специалиста в Киеве: практическое руководство

    Как выбрать частного SEO‑специалиста в Киеве: практическое руководство

    В Киеве существует множество SEO‑услуг: крупные агентства, маленькие студии и частники, с разными подходами и ценами. Для бизнеса важно найти того специалиста, который пониманием задач, прозрачностью ..

    Что предлагает KupiFanove.bg? для соц.сетей (smm)

    Что предлагает KupiFanove.bg? для соц.сетей (smm)

    KupiFanove.bg специализируется на предоставлении услуг по увеличению числа подписчиков и лайков в следующих социальных сетях: Instagram: Покупка подписчиков для повышения авторитета и доверия к ваш..

    Почему вам нужен список SEO компаний в Варне?

    Почему вам нужен список SEO компаний в Варне?

    Сегодня Google обрабатывает более 40 000 поисковых запросов каждую секунду! С такими ошеломляющими цифрами выделиться среди жесткой конкуренции требует профессионального опыта от опытной SEO-команды. ..

    Время 02:02 на часах: ангельская нумерология

    Время 02:02 на часах: ангельская нумерология

    Когда вы в очередной раз случайно бросаете взгляд на часы, и там застыли 02:02, это может быть не просто цифра — это тонкий знак от невидимого мира. Такие зеркальные времена не приходят в жизнь без пр..

    Подписаться на рассылку