Настройка SASL И TLS в Postfix

Настройка SASL И TLS в Postfix


http://www.sys-adm.org.ua/postfix/SASL_README.html

Прежде всего хочу отметить очень хороший сайт по настройке postifx ( http://postfixwiki.org/). Подобрать себе нужное HOW-TO там можно без проблем. В моём случае пришлось пользоваться несколькими документами по настройке сабжа и немного погуглить. Цель была построить почтовый рилей + POP3/IMAP сервер для клиентов с повышеной безопасностью. А для почтового сервиса это практически означает криптование всего что только можно криптануть :) . Не буду писать про настройку связки с базой и прочей приевшейся документации, а просто обращу Ваше внимание на несколько моментов. Также я не буду писать полное HOW-TO для ленивых :) Итак, что мы будем криптовать:

  • пароли в базе;
  • всю авторизацию клиентов (как SMTP так и POP3/IMAP);
  • обмен данными клиент-сервер и сервер-сервер;

Первым делом настроим сам postfix на предмет работы с SSL. Прежде всего он должен был скомпилирован с поддержкой SSL. Для каждой платформы проверять надо по разному. Потом надо сгенерировать ключ, как это сделать тоже много статей и описаний. По быстрому так:

# mkdir /postfix/configs_dir/ssl

# cd /postfix/configs_dir/ssl

# openssl req -new -x509 -nodes -out smtpd.pem -keyout smtpd.pem -days 3650

Следующим шагом будет настройка postfix (добавляем в main.cf):

smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /postfix/configs_dir/ssl/smtpd.pem
smtpd_tls_cert_file = /postfix/configs_dir/ssl/smtpd.pem
smtpd_tls_CAfile = /postfix/configs_dir/ssl/smtpd.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

После этого получаем криптование при отправки и приёме почты на рилее. Потом ещё добавляем авторизацию через SASL для клиентов, чтоб могли с любого места пользоваться своим рилеем. Подразумевается что SASL тоже стоит в системе и postfix умеет с ним работать. Так как в нашем случае в качестве POP3/IMAP сервера выбран Courier-IMAP, то и авторизовать SMTP нам надо через него. Следовательно используем Courier-authlib, с которой умеет работать SASL. В postfix это выглядит так:

broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_auth_enable = yes

В SASL, (lib/sasl2/smtpd.conf)

pwcheck_method: authdaemond
log_level: 7
mech_list: PLAIN LOGIN
authdaemond_path:/var/run/authdaemond/socket

Получаем такую цепочку:

postfix <-> sasl <-> courier-authlib <-> sql-backend

Теперь о граблях… точнее об одной. В postfix есть такая опция smtpd_sasl_local_domain, она мешает ему авторизовать клиента. Глубоко не копал, просто погуглил и нашёл что такая бага есть, а всё остальное заработало гладко.

Настройка SASL аутентификации для Postfix

Статья о том как сделать sasl на postfix’е и убедиться в его работоспособности.

Задача:

Установить sasl и postfix и сделать авторизацию вида:

1) отправлять письма могут только пользователи системы (/etc/passwd).

2) все остальные не пропускать.

Система: FreeBSD 7.0

Установка:

создаем и редактируем /usr/local/lib/sasl2/smtpd.conf:

pwcheck_method: saslauthd

mech_list: plain login

теперь мини-рабочий конфиг постфикса:

/usr/local/etc/postfix/main.cf

queue_directory = /var/spool/postfix

command_directory = /usr/local/sbin

daemon_directory = /usr/local/libexec/postfix

mail_owner = postfix

myhostname = host.domain.ru

mydomain = domain.ru

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

smtpd_sasl_auth_enable = yes

smtpd_security_options = noanonymous

smtpd_client_restrictions =

permit_sasl_authenticated,

reject_plaintext_session

smtpd_sender_restrictions =

permit_sasl_authenticated,

reject_plaintext_session

(!!! Внимание, господа, эта статья требует чтобы в конфиге postfix не было упоминаний mynetworks)

Теперь просто в консоли из под рута

newaliases

эта команда создаст файл /etc/aliases.db необходимый для постфикса

Для тестирования желательно иметь php на машинке потому как sasl механизм

login и plain используют

технологию шифрования base64 и для обработки «руками» логина и пароля нужно будет написать скриптик:

<?php

print base64_encode(«логин»);

print «\n»;

print base64_encode(«пароль»);

print «\n»;

?>

P.S. (Кому интересно plain это base64_encode(«логин\0логин\0пароль»);)

тоже самое на Perl:

perl -e ‘use MIME::Base64; print encode_base64(«логин») . «\n» .encode_base64(«пароль»). «\n»‘

Перезагружаем postfix

Тестирование SASL.

1) тестирование «руками»:

telnet айпиадрес 25

оно оветит:

220 host.domain.ru ESMTP Postfix

говорим ему:

ehlo host

(где host -имя машины)

оно ответит:

220 host.domain.ru ESMTP Postfix

250-host.domain.ru

250-PIPELINING

250-SIZE 10240000

250-VRFY

250-ETRN

250-AUTH LOGIN PLAIN

250-ENHANCEDSTATUSCODES

250-8BITMIME

250 DSN

если есть строка 250-AUTH LOGIN PLAIN – то значит есть вероятность успеха.

теперь заходим без авторизации и смотрим как наше сообщение не проходит:

mail from: user@domain.ru

оно:

250 2.1.0 Ok

мы:

rcpt to: user2@domain.ru

оно:

554 5.7.1 <user2@domain.ru>: Relay access denied

- значит все отлично нас не пустили просто так.

напечатайте

quit

и теперь идем с регистрацией:

telnet айпиадрес 25

220 host.domain.ru ESMTP Postfix

ehlo host

250-host.domain.ru

250-PIPELINING

250-SIZE 10240000

250-VRFY

250-ETRN

250-AUTH LOGIN PLAIN

250-ENHANCEDSTATUSCODES

250-8BITMIME

250 DSN

теперь вводим:

auth login

оно скажет нам сообщение вида:

334 VXNlcm5hbWU6

теперь запускаем, предварительно заполнив, тот скриптик который был указан выше

и вводим наш логин зашифрованный base64 в ответ на последнее сообщение.

у меня это:

cGVuc2U=

на что сервер ответил

334 UGFzc3dvcmQ6

теперь пароль в том же виде:

cnZpZGlh

на что оно нам ответит если все было правильно:

235 2.0.0 Authentication successful

вот оно – авторизация пройдена.

теперь соответственно

mail from:

rcpt to:

data

hello world

.

quit

все. письмо отправлено.

Настройка Postfix + TLS

Озаботился на днях установки почтового сервера с поддержкой протокола TLS (Transport Layer Security) и SMTP-аутентификации. Ставил на CentOS 5. Итак, начал естественно с

yum install postfix
service saslauthd start

Теперь пойдем по шагам:

  • Генерим сертификаты для TLS:

mkdir /etc/postfix/ssl
cd /etc/postfix/ssl/
openssl req -new -newkey rsa:2048 -x509 -nodes -keyout cakey.pem -out cacert.pem -days 3650

Сертификат сроком на 10 лет. Опция -nodes означает не шифровать ключ. Если вы параноик, можете убрать.

chmod 600 smtpd.key

Далее генерируем запрос на подпись клиентского сертификата

openssl req -new -newkey rsa:1024 -nodes -keyout smtpd.key -out smtpd.csr

Подписываем его корневым сертификатом

openssl x509 -req -CA cacert.pem -CAkey cakey.pem -days 730 -in smtpd.csr -out smtpd.crt -CAcreateserial

В результате имеем:
Корневой сертификат cacert.pem
Ключ корневого сертификата cakey.pem
Клиентский сертификат smtpd.crt
Ключ клиентского сертификата smtpd.key

Ключи должны быть доступны только администратору, особенно корневой. Им же нужно подписывать дополнительные сертификаты для клиентов

  • Конфигурируем Postfix. Для того, чтобы подключить SMTP-AUTH и TLS пропишите следующие строки в конфиг /etc/postfix/main.cf:

mynetworks = 127.0.0.0/8
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
alias_maps = hash:/etc/aliases
smtpd_tls_auth_only = yes
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

  • Завершение конфигурации и проверка.

mv -f /etc/pam.d/smtp.postfix /etc/pam.d/smtp
/etc/init.d/postfix restart

Проверьте, что postfix стартанул без ошибок и попробуйте telnet localhost 25. Чтобы убедиться в работоспособности SMTP-AUTH и TLS выполните:

telnet localhost 25

после установки соединения…
ehlo localhost

Если postfix выдаст строки 250-STARTTLS и 250-AUTH – вы успешно все настроили.

Данная статья ещё не закончена

Метки: , ,

Рубрики: LINUX

Comments are closed.