Sendmail

Материал из Wiki Open Book.

Перейти к: навигация, поиск
Пользовательского поиска

Содержание

[править] Введение

Sendmail — это старейший почтовый сервер. Многие боятся его использовать, считая, что его конфигурационный файл не для простых смертных, а настройка sendmail представляет из себя что-то ужасное. Действительно, если посмотреть содержимое основного конфигурационного файла /etc/mail/sendmail.cf строке этак на 600-й, то действительно становится понятно, что это — тихий ужас.

# strip group: syntax (not inside angle brackets!) and trailing semicolon
R$*                     $: $1 <@>                       mark addresses
R$* < $* > $* <@>       $: $1 < $2 > $3                 unmark <addr>
R@ $* <@>               $: @ $1                         unmark @host:...
R$* [ IPv6 : $+ ] <@>   $: $1 [ IPv6 : $2 ]             unmark IPv6 addr
R$* :: $* <@>           $: $1 :: $2                     unmark node::addr
R:include: $* <@>       $: :include: $1                 unmark :include:...
R$* : $* [ $* ]         $: $1 : $2 [ $3 ] <@>           remark if leading colon
R$* : $* <@>            $: $2                           strip colon if marked
R$* <@> 

Жуть!

Но! Кто сказал, что вы будете править этот файл руками? Дело в том, что он не предназначен для ручного редактирования. Я лично знаком только с двумя людьми, которые знают формат этого файла и могут что-нибудь в нём поправить. Мысленно снимаю перед ними шляпу! Я сам ничего не понимаю в sendmail.cf, да и не нужен мне его формат. Файл создавался для быстрого чтения его программой, а не человеком. Поэтому мы и не будем его редактировать.

Для создания файла sendmail.cf используются специальные скрипты препроцессора m4. Набор этих скриптов в Slackware Linux находится в пакете n/sendmail-cf. Также нам потребуется препроцессор m4, пакет d/m4. После установки пакета sendmail-cf в директории /usr/share/sendmail появится директория cf.

# ls /usr/share/sendmail/cf
README        cf/      feature/  m4/      ostype/  siteconfig/
README.linux  domain/  hack/     mailer/  sh/
#

В ней находится несколько директорий и два файла. На досуге почитайте файлик README. В нём находится описание всех макросов и конфигурационных параметров, которые мы можем использовать при создании файла sendmail.cf.

[править] Создание mc файла

[править] Формат mc файла

[править] Включение макросов

[править] Макрос VERSIONID

[править] Макрос OSTYPE

[править] Макрос FEATURE(use_cw_file)

[править] FEATURE(access_db)

[править] FEATURE(blacklist_recipients)

[править] FEATURE(local_procmail)

[править] FEATURE(always_add_domain)

[править] Макрос MAILER

[править] Создание файла sendmail.cf

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

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

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

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

[править] База доступа access

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

Connect:192.168.0 RELAY

Этот способ рабочий, но далеко не самый лучший. Да, все Ваши внутренние клиенты смогут отправлять почту через сервер, но... Есть несколько «но».

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

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

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

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

TRUST_AUTH_MECH(`LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl

При помощи макроса TRUST_AUTH_MECH мы определяем доверенные способы аутентификации.

define(`confAUTH_OPTIONS', `A p y')dnl

Оператор define определяет значение переменной confAUTH_OPTIONS. Параметры:

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

Если эту переменную не определить, механизм аутентификации включаться не будет.

Еще одна переменная — confAUTH_MECHANISMS, определяет какие механизмы аутентификации будут обрабатываться sendmail.

define(`confAUTH_MECHANISMS', `LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl

Для нормальной работы почтовых клиентов 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.

В результате содержимое файла my.mc станет таким:

include(`../m4/cf.m4')
VERSIONID(`My mega server')dnl
OSTYPE(linux)dnl
FEATURE(`use_cw_file')dnl
FEATURE(`access_db', `hash -T<TMPF> /etc/mail/access')dnl
FEATURE(`blacklist_recipients')dnl
FEATURE(`local_procmail',`',`procmail -t -Y -a $h -d $u')dnl
FEATURE(`always_add_domain')dnl
define(`confAUTH_OPTIONS', `A p y')dnl
define(`confAUTH_MECHANISMS', `LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl
TRUST_AUTH_MECH(`LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl
FEATURE(`no_default_msa')dnl
DAEMON_OPTIONS(`Port=smtp, Name=MTA')dnl
DAEMON_OPTIONS(`Port=smtps, Name=MSA-SSL, M=E')dnl
MAILER(local)dnl
MAILER(smtp)dnl
MAILER(procmail)dnl

Пока все прекрасно, но кроме включения собственно механизма аутентификации, потребуется настроить дополнительную программу, позволяющую sendmail осуществлять аутентификацию, и TLS.

[править] SASL

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

У этого способа есть один неприятный момент — Вам прийдется заносить всех пользователей, которые должны получать почту, в специальную базу данных. (Поправьте меня, я так и не понял как в Slackware заставить брать информацию о пользователях из /etc/passwd) Делается это следующим образом:


---Поправлено---- Для того что бы в slackware пароли брались из shadow без создания баз :

в каталоге /etc/sasl2 создаем файл Sendmail.conf в него вписываем:
 
 
     pwcheck_method: saslauthd
     mech_list: plain login

создаем два линка (я просто не проверял откуда конкретно читается Sendmail.conf )

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

пересобираем пакет cyrus-sasl с доп настройками в файле cyrus-sasl.SlackBuild добавляем опции компиляции для того что бы sasl понимал не шифрованые пароли, керберос нам не нужен!

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

запускать демона /usr/sbin/saslauthd -a shadow


Конец поправки =)



# saslpasswd2 -a sendmail -u kryukov.ru artur
#

Программа saslpasswd2 позволяет управлять этой базой. В приведенном примере мы добавили пользователя artur из домена kryukov.ru (-u kryukov.ru). Пользоваться этой информацией сможет программа sendmail (-f sendmail).

Для смены пароля пользователя программа вызывается аналогичным образом. Для удаления пользователя добавьте параметр -d.

Программа sasldblistusers2 позволяет посмотреть какие пользователи находятся в базе данных.

# sasldblistusers2
artur@kryukov.ru: userPassword
artur@kryukov.ru: cmusaslsecretOTP
#
Внимание! При конфигурации почтового клиента в разделе отправление почты в качестве логина пользователя необходимо указывать логин и домен. Для приведенного выше примера это будет выглядеть так: artur@kryukov.ru.

[править] TLS

Последнее, что осталось сделать — включить TLS. Это делается не сложно, достаточно добавить четыре параметра в файл my.mc и создать все необходимые ключи и сертификаты.

Что бы не генерировать все снова, возьмем ключи и сертификаты, которые мы использовали при конфигурации сервера OpenVPN (см. OpenVPN). Или сгенерируйте их самостоятельно, подробности смотрите тут: Создание ключей и сертификатов.

В my.mc добавляем следующие строки:

define(`confCACERT_PATH', `/etc/openvpn/keys/')dnl
define(`confCACERT', `/etc/openvpn/keys/ca.crt')dnl
define(`confSERVER_CERT', `/etc/openvpn/keys/kryukov.ru.crt')dnl
define(`confSERVER_KEY', `/etc/openvpn/keys/kryukov.ru.key')dnl

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

[править] Безопасность

[править] Конфигурационные параметры

[править] Подключение антивирусов

Подключение антивируса ClamAV описано на странице, посвященной настройке антивируса.

[править] Перевод документации

Sendmail:README

Личные инструменты