Sendmail+SASL+TLS/SSL
Ограничение пересылки почты (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-аутентикацией на сервере.
Или в качестве пароля в чистом виде можно вписать 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')