Sendmail+SASL+TLS/SSL

From wiki.habital.lv
Revision as of 05:48, 2 February 2023 by Admin (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Ограничение пересылки почты (RELAY)

По умолчанию sendmail позволяет отправлять почту только тем пользователям, которые работают непосредственно на машине, на которой запущен sendmail. То есть, если письмо для отправки прийдет с другой машины в сети, sendmail его не перешлет.

В сети Интернет существуют dnsbl сервера, на которых хранится информация о спаммерах и о почтовых серверах с открытой пересылкой почты (open relay). Многие почтовые сервера пользуются информацией, хранящейся в dnsbl для ограничения приема почты. Если открыть пересылку на своем сервере (open relay), то многие сервера перестанут принимать почту от этого сервера. Именно по этому, по умолчанию в sendmail запрещена пересылка почты.

Для разрешения пересылки существует много разных способов. Один из них — это воспользоваться базой доступа access.db.

База доступа access

Предположим, что необходимо разрешить пересылку почты из внутренней сети 192.168.0.0/24. В файл "/etc/mail/access" следует добавить строку:

192.168.0.0 RELAY

Этот рабочий способ. Но...

  • Пользователи смогут отправлять почту только из внутренней сети. Если есть мобильные пользователи, которым необходимо получить доступ к серверу из любой точки Интернет, для которого невозможнр заранее знать IP адрес машины или сети, откуда будет подключение.

Аутентификация пользователя

Наиболее предпочтительным способом разрешения пересылки почты является аутентификация пользователя.

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

TRUST_AUTH_MECH(`LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl
define(`confAUTH_MECHANISMS', `LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl
define(`confAUTH_OPTIONS', `A p y')dnl

Здесь "TRUST_AUTH_MECH" определяет доверенные способы аутентификации. Оператор "define" определяет значение переменной "confAUTH_OPTIONS". Леременная "confAUTH_MECHANISMS" определяет какие механизмы аутентификации будут обрабатываться sendmail.

Параметры:

  • А — включает механизм аутентификации;
  • p — начинает «доверять» PLAIN аутентификации только после того как соединение будет зашифровано при помощи TLS;
  • y — запрещает анонимные логины.

Для нормальной работы почтовых клиентов Windows необходимо определить два механизма аутентификации: login и plain. Но так как они небезопасны, то они работают только в TLS/SSL-режиме.

В большинстве дистрибутивов кроме самого почтового сервера, слушающего запросы на 25 порту, запускается дополнительный процесс sendmail — MSA (Агент подачи почты). Он предназначен для предварительной проверки и изменений в заголовках письма. По умолчанию он слушает запросы на 587 порту и, естественно, никакой аутентификации не поддерживает. Поэтому мы сначала запретим значения параметров по умолчанию:

FEATURE(`no_default_msa')dnl

Затем, при помощи макроса "DAEMON_OPTIONS", определяем используемые сервером порты и некоторые дополнительные параметры.

DAEMON_OPTIONS(`Port=smtp, Name=MTA')dnl
DAEMON_OPTIONS(`Port=smtps, Name=MSA-SSL, M=E')dnl

Основной процесс sendmail (MTA — Mail Transfer Agent) будет слушать запросы на 25 порту (smtp). А агент подачи почты на 465 порту (smtps). Кроме того, параметр M=E говорит, что не будет использоваться команда ETRN, протокола SMTP.

Проверка аутентикации на сервере

Проверку настроек TLS можно выполнить с помощью команды telnet:

# telnet localhost smtp
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.domail.org ESMTP Sendmail 8.13.1/8.13.1; Wed, 17 Nov 2004 13:42:08 +0200 (EET)
EHLO localhost
250-mail.domain.org Hello root@localhost.domain.org [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH PLAIN
250-STARTTLS
250-DELIVERBY
250 HELP
QUIT

Должа появиться строчка "250-AUTH" с возможными видами аутентикации. В случае, если предусматривается TLS-соединение, то проверку надо произвести восользовавшись командой "openssl":

# openssl s_client -connect localhost:smtps
...
SSL handshake has read 7592 bytes and written 331 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
   Protocol  : TLSv1
   Cipher    : DHE-RSA-AES256-SHA
   Session-ID: 9DDA35E50ED7DBD42A65630A31631AC77ADA4C32CF7BE70440DC4E6DA9FD94BD
   Session-ID-ctx: 
   Master-Key: F4507C23186CBE7802B6A85D21DBCC7D6AC6DD4B64D0865145906C27F047F87120F19935619F72A35FE236B32682A2FA
   Key-Arg   : None
   Start Time: 1356006457
   Timeout   : 300 (sec)
   Verify return code: 19 (self signed certificate in certificate chain)
---
220 mail.domain.org ESMTP Sendmail 8.14.4/8.14.4; Thu, 20 Dec 2012 14:27:37 +0200
EHLO localhost
250-mail.domain.org Hello localhost [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-AUTH LOGIN PLAIN
250-DELIVERBY
250 HELP
QUIT

SASL

Sendmail сам не производит аутентификацию пользователей, для этого он пользуется SASL механизмом. В системе должна быть установлена библиотека, реализующая этот механизм. В подавляющем большинстве дистрибутивов используется пакет Cyrus-sasl, с которым поставляются необходимые библиотеки. При сборке пакета должны были быть включены следующие опции:

  --enable-plain \
  --disable-krb4 \

Далее надо создать файл "/etc/sasl2/Sendmail.conf":

pwcheck_method: saslauthd
mech_list: plain login

Создаём линк:

ln -sf /etc/sasl2/Sendmail.conf /usr/lib/sasl2/Sendmail.conf

Информация о пользователях заносится в sasl-базу данных:

# saslpasswd2 -a sendmail -u domain.dom userlogin

То есть для программы sendmail создаётся пользователь userlogin с почтовым доменом domain.dom.

При помощи программы sasldblistusers2 можно посмотреть содержимое sasl-базы данных.

Примечание: в клиентских прораммах в качестве логина надо указывать "userlogin@domain.dom".

sendmail-client

В файле "/etc/mail/authinfo" записать строчку для аутентикации:

AuthInfo: "U:userlogin@domain.com" "P:saslpasswd", т.е. логин и пароль должны совпадать с sasl-аутентикацией на сервере.

Или вместо пароля в чистом виде (PLAIN) можно вписать BASE64-кодированный пароль:

AuthInfo: "U:userlogin@domain.com" "P=BASE64-hash-password"

TLS/SSL

Сервер

Включение TLS. Для этого достаточно добавить четыре параметра в файл sendmail.mc и создать все необходимые ключи и сертификаты:

define(`CERT_DIR', `/etc/mail/certs')dnl
define(`confCACERT_PATH', `CERT_DIR')
define(`confCACERT', `CERT_DIR/CA.cert.pem')
define(`confSERVER_CERT', `CERT_DIR/smtp.cert.pem')
define(`confSERVER_KEY', `CERT_DIR/smtp.key.pem')
define(`confCRL', `CERT_DIR/revocation.list')

В каталог "/etc/mail/certs" добавляем CA-сертификат[ы] CA.cert.pem, серверный сертификат smtp.cert.pem и ключ (открытый) к серверному сертификату smtp.key.pem. Обратите внимание на права к файлу smtp.key.pem - 0600. Необходимо проверить возможность использования сертификата на стороне сервера ("SSL server") или на стороне клиента ("SSL client"):

# openssl x509 -purpose -in /etc/mail/cert/smtp.cert.pem
Certificate purposes:
SSL client : Yes <--- на стороне клиента
SSL client CA : No
SSL server : Yes <--- на стороне сервера
SSL server CA : No
Netscape SSL server : Yes
Netscape SSL server CA : No
S/MIME signing : Yes
S/MIME signing CA : No
S/MIME encryption : Yes
S/MIME encryption CA : No
CRL signing : Yes
CRL signing CA : No
Any Purpose : Yes
Any Purpose CA : Yes
OCSP helper : Yes
OCSP helper CA : No

Далее, необходимо добавить в файл "/etc/mail/access" описание сертификатов: напр.:

CERTIssuer:/C=AU/O=Company+20Ltd./OU=Certificate+20Issuer RELAY

или

CERTIssuer:/C=AU/O=Cert+20Company+20Ltd/OU=Certificate+20Issuer SUBJECT
CERTSubject:/C=AU/O=My+20Company+20Ltd/CN=host.domain.com RELAY

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

Клиент

Включение TLS. Для этого в файл sendmail.mc надо добавить четыре параметра и добавить необходимые ключи и сертификаты:

define(`CERT_DIR', `/etc/mail/certs')dnl
define(`confCACERT_PATH', `CERT_DIR')
define(`confCACERT', `CERT_DIR/CA.cert.pem')
define(`confCLIENT_CERT', `CERT_DIR/smtp.cert.pem')
define(`confCLIENT_KEY', `CERT_DIR/smtp.key.pem')