пятница, 10 декабря 2010 г.

Настройка Postfix+MySQL+Dovecot-POP3+Amavis в ubuntu server 10.04

Раздел 7. Аутентификация SMTP

Как это не грустно, но в любом случае, спамеры будут "склонять к интиму" нашу систему на предмет рассылки Спама, что рано или поздно приведет ваш почтовый сервер к "blacklist`у". Такие релеи (relay), которые не проверяют какие/от кого письма можно отправлять - называются открытыми релаями (open relay). К счастью, Postfix хорошо защищен от возможности стать open relay`ем. За сие отвечает очень важная опция smtp_recipient_restriction (ее мы рассмотрим позже).

А вообще, необходимо начать с того, что определим подсети (подсеть), которым разрешено использовать наш сервер в качестве транспортера. Это задается параметром mynetworks в main.cf. Обычно, это наша локальная сеть, т.е. локальным пользователям нет необходимости "аутентифицироваться" (если в нашей сети несколько подсетей - их можно указать через запятую):


#>postconf -e mynetworks=192.168.10.0/24, 192.168.1.0/24, 192.168.2.0/24

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

Тогда, необходимо найти способ, при котором наш майл-сервер доверял бы такому пользователю. То есть юзеру необходимо посылать свой логин/пароль майл-серверу, что б тот понимал что письма сего юзверя можно релеить (перенаправлять).
Собственно это и есть концепция аутентификации SMTP.

Аутентификация SMTP для Postfix всегда была нетривиальной задачей. Она реализована через библиотеку SASL (Simple Authentification and Sequtity Level), которая есть частью Cyrus маил-сервера. Т.е. отладка и анализ ошибок практически сводятся к нулю из-за бредовости информации, ее перекрестности - такие сообщения только больше вводят в заблуждение.
Но, наконец-то, начиная с Postfix`а версии 2.3 мы можем передать проверку подлинности Dovecot`у. И, раз уж уже сконфигурировали Dovecot, нам остается только добавить в конфиги Postfix`а несколько параметров:
#>postconf -e smtpd_sasl_type=dovecot
#>postconf -e smtpd_sasl_path=private/auth
#>postconf -e smtpd_sasl_auth_enable=yes
#>postconf -e smtpd_recipient_restrictions=check_sender_access hash:/etc/postfix/restricted_senders,
permit_mynetworks,
permit_sasl_authenticated,
reject_unknown_sender_domain,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
reject_unverified_recipient,
reject_unauth_destination 

smtp_sasl_enabled - разрешает SMTP аутентификацию вцелом
smtp_recipient_restriction - определяет права, которые проверяются после того, как удаленный юзвер передает команду "RCPT TO:" во время SMTP диалога, т.е. релей разрешен в следующих случаях:
- check_sender_access hash:/etc/postfix/restricted_senders - проверяем доступность отправителя, т.е. создаем файло /etc/postfix/restricted_senders, где описываем доступность отправителя, такого содержания:
kimo.ua   571   We found it easier just to block you
antre.com.ua 571 We found it easier just to block you
mail.trcgs.com 571 Buzz off!
trcgs.com 571 Buzz off!
*.hinet.net 571 Buzz off!
ukr.net OK
*.ukr.net OK
ezvit.com.ua OK
mail.ezvit.com.ua OK
*.google.com OK
ну и объясним postfix`у о существовании этого файла:


#>postmap /etc/postfix/restricted_senders
!!! причем эту команду необходимо выполнять после каждого изменения файла /etc/postfix/restricted_senders

- permit_mynetworks - пользователь находится в нашей локалке
- permit_sasl_authentificated - юзверь прошел аутентификацию
- reject_unknown_sender_domain - отбрасывать отправителей из неизвестных доменов
- reject_non_fqdn_recipient - отбрасывать, если у получателя нет полного доменного имени
- reject_unknown_recipient_domain - отбрасывать, если у получателя не известный домен
- reject_unverified_recipient - отбрасывать, если получатель непроверен
- reject_unauth_destination - почта предназначена для пользователя НЕ из нашего локального или виртуального домена

Также, необходимо добавить еще несколько дополнительных ограничений:
#>postconf -e disable_vrfy_command = yes
#>postconf -e strict_rfc821_envelopes = yes
#>postconf -e smtpd_helo_required = yes
#>postconf -e smtp_helo_timeout = 500s
#>postconf -e minimal_backoff_time = 300s
#>postconf -e queue_run_delay = 240s
Порежем еще тех, кто не умеет здороваться:
#>postconf -e smtpd_helo_restrictions = reject_invalid_hostname,
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_hostname

Запретим соединение с нашим сервером клиентам, которые находятся в "blacklist`ах":
#>postconf -e smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/restricted_senders,
permit_mynetworks,
reject_unknown_sender_domain,
reject_invalid_hostname,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_unknown_client,
reject_unknown_hostname,
reject_rbl_client sbl-xbl.spamhaus.org,
reject_rbl_client dnsbl.njabl.org,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client dul.ru,
reject_rhsbl_sender dsn.rfc-ignorant.org,
reject_rbl_client opm.blitzed.org,
reject_rbl_client list.dsbl.org,
reject_rbl_client sbl.spamhaus.org,
reject_rbl_client blackholes.mail-abuse.org,
reject_rbl_client dialups.mail-abuse.org,
reject_rbl_client dynablock.njabl.org,
reject_rbl_client combined.njabl.org,
reject_rbl_client dnsbl.sorbs.net,
reject_rhsbl_sender dsn.rfc-ignorant.org

Ну и, наконец, подограничим на предмет содержания письма:
#>postconf -e smtpd_data_restrictions = permit_mynetworks
reject_unauth_pipelining,
reject_multi_recipient_bounce,
permit
Пробуем аутентифицироваться в SMTP сессии:
#>telnet localhost smtp 
Сервер нас пустил:
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mailtest ESMTP Postfix (Ubuntu) 
Здороваемся:
ehlo example.com 
Postfix выдает нам список особенностей, допустимых в процессе SMTP диалога:
250-mailtest
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN 
Засылаем строку аутентификации c Base64-кодированным паролем:
auth plain am9obkBleGFtcGxlLmNvbQBqb2huQGV4YW1wbGUuY29tAGpob24=
Сервер должен принять аутентификацию:
235 2.0.0 Authentication successful 
Отключаемся от Postfix`а:
quit 
Он тоже прощается):
221 2.0.0 Bye 

Отлично! Аутентификация работает.
Внимание! Если в качестве пароля для jhon@exemple.com был выбран пароль отличный от "jhon", выбранный пароль необходимо перекодировать:
$>perl -MMIME::Base64 -e 'print encode_base64("john\@example.com\0john\@example.com\0password")';

Теперь можно потестить отправку мыла с включенной аутентификацией SMTP. Для этого временно уберем нашу локалку из доверительных сетей:

#>postconf -e mynetworks=
#>postfix reload 
Перезагрузить Postfix можно также можно и командой /etc/init.d/postfix restart. Запускаем почтового клиента и смотрим логи (tail /var/log/mail/mail.log) во время отсылки письма во внешний (интернет) домен. Можно послать мыло, например, на devnull@workaround.org. Если все гуд - в логе будет:
postfix/smtpd[4032]: 1234567890: client=..., sasl_method=PLAIN, sasl_username=john@example.com
postfix/cleanup[4040]: 2EAE8379CB: message-id=<...>
postfix/qmgr[3963]: 1234567890: from=john@example.com, size=830, nrcpt=1 (queue active)
postfix/smtpd[4032]: disconnect from ... 
postfix/smtp[4041]: 1234567890: to=devnull@workaround.org,     
relay=torf.workaround.org[212.12.58.129]:25, delay=6, 
delays=0.09/0.08/5.6/0.23, dsn=2.0.0, status=sent
(250 OK id=1HsPC3-0008UJ-O5)
postfix/qmgr[3963]: 2EAE8379CB: removed 
В случае ошибки в логе будет что похожее на:
postfix/smtpd[4032]: connect from ...[10.20.30.40]
postfix/smtpd[4032]: warning: ...[10.20.30.40]: SASL PLAIN authentication failed:
postfix/smtpd[4032]: lost connection after AUTH from ...[10.20.30.40]
postfix/smtpd[4032]: disconnect from ...[10.20.30.40] 
Не забываем вернуть нашу локалку в доверительные сети:
#>postconf -e mynetworks=192.168.10.0/24, 192.168.1.0/24, 192.168.2.0/24
#>postfix reload 

На этом все! Настройка завершена. Теперь проверим отсекаются ли попытки внешнего релея:
#>telnet relay-test-abuse.org

Ждем пока пройдет проверка... Если в конце мы увидим что то вроде:
"System appeared to reject relay attempts"
значит все ОК.
Жопиздан (с) Job Is Done

Комментариев нет:

Отправить комментарий