Настройка 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 – вы успешно все настроили.
Данная статья ещё не закончена
