Postfix SASL Howto


Перевод: Доморадов Алексей. Все права защищены. Copyright © 2008.

Примечание: При размещении данного материала у себя на сайте, просьба указывать ссылку на оригинальный сайт - www.sys-adm.org.ua.

Все замечания и предложения по переводу документации на русский язык, а также найденные ошибки и опечатки присылайте на мой электронный адрес.

Благодарности: Спасибо всем, кто помогал мне переводить эту документацию.

Особенное спасибо: Галинурову Кириллу и Грозаку Михаилу aka RedStalker_Mike.

Special thanks to: Igor Luzanov aka ISKATEL.


ПРЕДУПРЕЖДЕНИЕ

Тем, кому приходится сталкиваться с проблемами при установке Postfix могут ожидать, что Postfix более безопасный, чем некоторые другие MTA.

Библиотека Cyrus SASL содержит большое количество кода. С учетом этого, Postfix безопасен настолько, насколько и другие почтовые системы, которые используют библиотеку Cyrus SASL. Dovecot предоставляет альтернативную реализацию SASL, которую следует принимать во внимание.

Как Postfix использует информацию SASL аутентификации

Поддержка Postfix SASL (RFC 2554) может быть использована для аутентификации удаленных SMTP клиентов на SMTP сервере Postfix, а также для аутентификации SMTP клиента Postfix на удаленном SMTP сервере.

При получении почты, Postfix регистрирует имя пользователя, предоставляемое клиентом, метод аутентификации и адрес отправителя в файле maillog, а также дополнительно предоставляет почтовый доступ через UCE ограничение permit_sasl_authenticated.

При отправке почты, Postfix может просмотреть имя сервера или домен назначения (правая часть адреса) в таблице паролей SASL и если имя пользователя/пароль найдены, он будет использовать эти имя пользователя и пароль для аутентификации на сервере. Что касается версии 2.3, то Postfix может быть настроен для поиска своей таблицы паролей SASL по email адресу отправителя.

Этот документ охватывает следующие темы:

Какие SASL реализации поддерживаются

Данный документ описывает Postfix со следующими SASL реализациями:

Postfix версии 2.3 предоставляет механизм плагинов (plug-in), который обеспечивает поддержку множества SASL реализаций. Для того, чтобы определить какие реализации встроены в Postfix используйте следующие команды:

% postconf -a (Поддержка SASL в SMTP сервере)
% postconf -A (Поддержка SASL в SMTP+LMTP клиентах)

Нет необходимости напоминать, что эти команды недоступны в ранних версиях Postfix.

Сборка Postfix с поддержкой Dovecot SASL

Поддержка SASL протокола Dovecot версии 1 доступна в Postfix 2.3 и более поздних. На момент написания, доступна только серверная часть SASL поддержки, так что вы не можете использовать ее для аутентификации на сервере ISP (ISP - Internet Service Provider). Dovecot использует собственный процесс-демон для аутентификации. Это обеспечивает простой процесс сборки Postfix, потому что нет необходимости подключать дополнительные библиотеки при сборке postfix.

Для генерирования необходимых Makefile'ов, выполните следующее в корневой директории Postfix:

% make makefiles CCARGS='-DUSE_SASL_AUTH -DDEF_SERVER_SASL_TYPE=\"dovecot\"'

После этого, продолжите с "make" как описано в документе УСТАНОВКА.

Примечание:

Сборка библиотеки Cyrus SASL

Postfix работает с cyrus-sasl-1.5.5 или cyrus-sasl-2.1.1, которые доступны по адресу:

ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/

ВАЖНО: если вы установили библиотеку Cyrus SASL в каталог по умолчанию, то вам необходимо будет сделать симлинк /usr/lib/sasl -> /usr/local/lib/sasl для версии 1.5.5 или /usr/lib/sasl2 -> /usr/local/lib/sasl2 для версии 2.1.1.

По сообщениям, Microsoft Internet Explorer версии 5 требует нестандартный метод аутентификации SASL - LOGIN. Для включения этого метода аутентификации, укажите ``./configure --enable-login''.

Сборка Postfix с поддержкой Cyrus SASL

Предполагается, что заголовочные файлы Cyrus SASL находятся в /usr/local/include, а библиотеки Cyrus SASL находятся в /usr/local/lib.

На некоторых системах это генерирует необходимые определения Make файла:

Для Cyrus SASL версии 1.5.5:

% make tidy # если у вас остались файлы от предыдущей сборки
% make makefiles CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL \
    -I/usr/local/include" AUXLIBS="-L/usr/local/lib -lsasl"

Для Cyrus SASL версии 2.1.1:

% make tidy # если у вас остались файлы от предыдущей сборки
% make makefiles CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL \
    -I/usr/local/include/sasl" AUXLIBS="-L/usr/local/lib -lsasl2"

На Solaris 2.x вам необходимо указать информацию для динамической сборки, иначе ld.so не сможет найти динамическую библиотеку SASL:

Для Cyrus SASL версии 1.5.5:

% make tidy # если у вас остались файлы от предыдущей сборки
% make makefiles CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL \
    -I/usr/local/include" AUXLIBS="-L/usr/local/lib \
    -R/usr/local/lib -lsasl"

Для Cyrus SASL версии 2.1.1:

% make tidy # если у вас остались файлы от предыдущей сборки
% make makefiles CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL \
    -I/usr/local/include/sasl" AUXLIBS="-L/usr/local/lib \
    -R/usr/local/lib -lsasl2"

Включение SASL аутентификации в SMTP сервере Postfix

Чтобы включить SASL поддержку в SMTP сервере:

/etc/postfix/main.cf:
    smtpd_sasl_auth_enable = yes

Чтобы разрешить пересылку почты клиентам, прошедшим аутентификацию:

/etc/postfix/main.cf:
    smtpd_recipient_restrictions =
        permit_mynetworks permit_sasl_authenticated ...

Для отображения SASL login имен в получаемых заголовках сообщений (Postfix версии 2.3 и более поздние):

/etc/postfix/main.cf:
    smtpd_sasl_authenticated_header = yes

Примечание: SASL login имена будут общедоступны.

Более ранние SMTP клиенты Microsoft используют нестандартную версию синтаксиса AUTH протокола, и ожидали, что SMTP сервер ответит на EHLO "250 AUTH=stuff" вместо "250 AUTH stuff". Для поддержки подобных клиентов (наряду с нормальными) используйте следующее:

/etc/postfix/main.cf:
    broken_sasl_auth_clients = yes

Конфигурация Dovecot SASL для SMTP сервера Postfix

Поддержка Dovecot SASL доступна в Postfix 2.3 и более поздних. На стороне Postfix вам необходимо указать расположение сокета демона аутентификации Dovecot. Мы используем путь относительно директории очереди Postfix, поэтому это будет работать независимо от того, запущен Postfix в chroot или нет:

/etc/postfix/main.cf:
    smtpd_sasl_type = dovecot
    smtpd_sasl_path = private/auth

На стороне Dovecot вам также нужно указать расположение сокета демона аутентификации Dovecot. В данном случае мы указываем абсолютный путь. В примере мы предполагаем, что директория очереди Postfix располагается в /var/spool/postfix/.

/some/where/dovecot.conf:
    auth default {
      mechanisms = plain login
      passdb pam {
      }
      userdb passwd {
      }
      socket listen {
        client {
          path = /var/spool/postfix/private/auth
          mode = 0660
          user = postfix
          group = postfix
        }
      }
    }

Смотрите документацию Dovecot для того, чтобы узнать, как настроить и управлять сервером аутентификации Dovecot.

Конфигурация Cyrus SASL для SMTP сервера Postfix

В /usr/local/lib/sasl/smtpd.conf (Cyrus SASL версия 1.5.5) или /usr/local/lib/sasl2/smtpd.conf (Cyrus SASL версия 2.1.1) вам необходимо указать, как сервер должен проверять пароль клиента.

Примечание: некоторые сборки Postfix модифицированы и ищут файл smtpd.conf в /etc/postfix.

Примечание: некоторые сборки Cyrus SASL ищут файл smtpd.conf в /etc/sasl2.

(Cyrus SASL version 1.5.5)

/usr/local/lib/sasl/smtpd.conf:
    pwcheck_method: pwcheck

(Cyrus SASL version 2.1.1)

/usr/local/lib/sasl2/smtpd.conf:
    pwcheck_method: pwcheck

Название файла в /usr/local/lib/sasl (Cyrus SASL версия 1.5.5) или /usr/local/lib/sasl2 (Cyrus SASL версия 2.1.1), используемое SASL библиотекой для настройки, может быть установлено с помощью:

/etc/postfix/main.cf:
    smtpd_sasl_application_name = smtpd (Postfix < 2.3)
    smtpd_sasl_path = smtpd (Postfix 2.3 и более поздние)

Демон pwcheck содержится в исходных кодах cyrus-sasl.

ВАЖНО: процессы postfix должны иметь разрешение чтение+выполнение для группы на директорию /var/pwcheck, иначе попытки аутентификации потерпят неудачу.

  • В качестве альтернативной возможности, в Cyrus SASL 1.5.26 и более поздние (включая 2.1.1), попробуйте следующее:

    (Cyrus SASL версия 1.5.26)

    /usr/local/lib/sasl/smtpd.conf:
        pwcheck_method: saslauthd
    

    (Cyrus SASL версия 2.1.1)

    /usr/local/lib/sasl2/smtpd.conf:
        pwcheck_method: saslauthd
    

    Демон saslauthd также содержится в исходных кодах cyrus-sasl. Он более гибкий, чем демон pwcheck, в том смысле, что может аутентифицировать через PAM, а также множество других источников. Для использования PAM, запустите saslauthd с ключом "-a pam".

  • Для аутентификации через собственную базу данных паролей Cyrus SASL:

  • (Cyrus SASL версия 1.5.5)

    /usr/local/lib/sasl/smtpd.conf:
        pwcheck_method:  sasldb
    

    (Cyrus SASL версия 2.1.1)

    /usr/local/lib/sasl2/smtpd.conf:
        pwcheck_method:  auxprop
    

    Этот метод будет использовать файл паролей Cyrus SASL (по умолчанию: /etc/sasldb в версии 1.5.5, или /etc/sasldb2 в версии 2.1.1), который поддерживается с помощью команд saslpasswd или saslpasswd2 соответственно (являющихся частью ПО Cyrus SASL). На некоторых системах с недостаточной технической поддержкой команду saslpasswd необходимо запускать несколько раз для нормальной работы. SMTP серверу Postfix необходим доступ чтения на файл sasldb - вы можете поиграться с правами группового доступа. С механизмом аутентификации OTP, SMTP серверу также необходим доступ на ЗАПИСЬ в /etc/sasldb2 или /etc/sasldb (или базу данных SQL, если она используется).

    ВАЖНО: Для запуска sasldb, убедитесь, что вы установили SASL realm в полностью квалифицированное доменное имя (FQDN).

    ПРИМЕР:

    (Cyrus SASL version 1.5.5)

    % saslpasswd -c -u `postconf -h myhostname` exampleuser
    

    (Cyrus SASL version 2.1.1)

    % saslpasswd2 -c -u `postconf -h myhostname` exampleuser
    

    Вы можете получить представление о том, как SASL хранит данные о пространствах имён (realms) пользователей в sasldb с помощью sasldblistusers (Cyrus SASL версия 1.5.5) или sasldblistusers2 (Cyrus SASL версия 2.1.1).

    На стороне Postfix, вы можете использовать только одно пространство имён (realm) для каждого экземпляра демона smtpd, и только пользователи принадлежащие этому пространству смогут аутентифицироваться. Параметр smtpd_sasl_local_domain управляет пространством, используемым smtpd:

    /etc/postfix/main.cf:
        smtpd_sasl_local_domain = $myhostname
    

    ВАЖНО: все пользователи должны иметь возможность аутентифицироваться используя ВСЕ механизмы аутентификации, предоставляемые Postfix, иначе сеанс может закончится с ошибкой - неподдерживаемый механизм, а аутентификация потерпит неудачу. Например, если вы настроили SASL использовать saslauthd для аутентификации через PAM (подключаемые модули аутентификации), то только PLAIN и LOGIN механизмы поддерживаются и дают возможность успешной аутентификации, кроме того библиотека SASL будет также предоставлять другие механизмы, такие как DIGEST-MD5. Это происходит потому, что эти механизмы становятся доступны через другие плагины, и библиотека SASL не имеет возможности узнать, что ваш единственный действительный источник аутентфикации - PAM. Следовательно вы должны ограничить список механизмов, предоставляемых Postfix.

    /usr/local/lib/sasl2/smtpd.conf:
        mech_list: plain login
    

    По этим же причинам вы можете захотеть ограничить список плагинов, используемых для аутентификации.

    /usr/local/lib/sasl2/smtpd.conf:
        pwcheck_method:  auxprop
        auxprop_plugin:  sql
    

    Запуска ПО в chroot с поддержкой SASL инетресное упражнение. Хотя может оказаться хлопотным занятием.

    Тестирование SASL аутентификации в SMTP сервере Postfix

    Для тестирование серверной части, подключитесь к SMTP серверу, при этом у вас должен установиться сеанс приведенный ниже. Информация, посылаемая клиентом выделена жирным шрифтом.

    220 server.example.com ESMTP Postfix
    EHLO client.example.com
    250-server.example.com
    250-PIPELINING
    250-SIZE 10240000
    250-ETRN
    250-AUTH DIGEST-MD5 PLAIN CRAM-MD5
    250 8BITMIME
    AUTH PLAIN dGVzdAB0ZXN0AHRlc3RwYXNz
    235 Authentication successful
    

    Вместо dGVzdAB0ZXN0AHRlc3RwYXNz, укажите закодированную base64 форму username\0username\0password (\0 - нулевой байт). Пример выше для пользователя с именем 'test' и паролем 'testpass'.

    Для генерирования base64 закодированной аутентификационной информации вы можете использовать одну из следующих команд:

    % printf 'username\0username\0password' | mmencode
    
    % perl -MMIME::Base64 -e \
        'print encode_base64("username\0username\0password");'
    

    Команда mmencode является частью ПО metamail. MIME::Base64 доступен на http://www.cpan.org/.

    Предостережение: когда размещаете логи SASL сеансов в общедоступных списках, пожайлуста помните, что имя пользователя и пароль очень легко восстановить из base64 закодированной формы.

    Решение внутренних проблем SASL

    В исходных кодах Cyrus SASL вы найдете папку, названную "sample". Выполните в ней make, "su" для пользователя postfix (или любого другого, который задан в директиве mail_owner):

    % su postfix
    

    затем запустите получившийся в результате сборки сервер и клиент на разных терминалах. Для сервера выполните strace/ktrace/truss для того, чтобы увидеть что ему не нравится и исправьте проблему. Повторяйте предыдущий шаг до тех пор, пока вы сможете успешно аутентифицироваться с помощью простого клиента. Только тогда возращайтесь обратно к Postfix.

    Включение SASL аутентификации в SMTP клиенте Postfix

    Включите клиентскую часть SASL аутентификации, и укажите таблицу с парами следующего вида: левая часть содержит хост или следующий пункт назначения (next-hop destination), а правая часть пару вида - имя_пользователя:пароль. Сначала Postfix ищет в таблице запись с именем хоста сервера; если ни одной таковой записи не было найдено, тогда Postfix ищет в таблице запись с пунктом следующего назначения (next-hop destination). Обычно, это правая часть почтового адреса, но это также может быть информация, указанная с помощью параметра relayhost или с помощью таблицы transport(5)

    /etc/postfix/main.cf:
        smtp_sasl_auth_enable = yes
        smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
        smtp_sasl_type = cyrus
    
    /etc/postfix/sasl_passwd:
        foo.com                     username:password
        bar.com                     username
        [mail.myisp.net]            username:password
        [mail.myisp.net]:submission username:password
    

    Postfix версии 2.3 поддерживает SASL пароли для каждого отправителя индивидуально. Для поиска SASL пароля по отправителю перед поиском по пункту назначения укажите:

    /etc/postfix/main.cf:
        smtp_sender_dependent_authentication = yes
        smtp_sasl_auth_enable = yes
        smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
    
    /etc/postfix/sasl_passwd:
        user@example.com            username:password
        bar.com                     username
        [mail.myisp.net]            username:password
        [mail.myisp.net]:submission username:password
    

    Примечание: некоторые SMTP сервера поддерживаниют только PLAIN и LOGIN методы аутентификации. По умолчанию, SMTP клиент Postfix не использует методов, которые посылают пароли в открытом виде, и отклоняет доставку со следующим сообщением об ошибке: "Authentication failed: cannot SASL authenticate to server". Чтобы сделать возможной plaintext аутентификацию, укажите следующее:

    /etc/postfix/main.cf:
        smtp_sasl_security_options = noanonymous
    

    Файл с паролями SASL клиентов открывается до смены корневого каталога SMTP-сервера, если она используется (помещение в chroot jail), т.е. вы можете оставить этот файл в /etc/postfix.

    Примечание: Некоторые SMTP-сервера поддерживают механизмы аутентификации, которые, несмотря на то, что доступны на клиентских системах, на самом деле могут не работать или не обладать достаточными данными, для успешной аутентификации на сервере. С помощью параметра smtp_sasl_mechanism_filter можно ограничить список доступных на сервере механизмов для клиента smtp(8):

    /etc/postfix/main.cf:
        smtp_sasl_mechanism_filter = !gssapi, !external, static:all
    

    В приведённом выше примере Postfix не будет использовать механизмы, требующие специальной инфраструктуры - наподобие Кербероса.

    SMTP клиент Postfix отбратно совместим c SMTP серверами, использующими нестандартный синтаксис команды "AUTH=method..." в ответ на команду EHLO; никакой дополнительной конфигурации для нормальной работы клиента с такими серверами не требуется.


    Дата последнего обновления: 30.10.2008. Postfix version: 2.3.4.