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 описано на странице, посвященной настройке антивируса.

