OpenSMTPD + UW IMAP как альтернатива тяжелым почтовым системам

157a8ef6ef7048c2bf5c70919068668e.jpgПочти каждому, у кого есть сервера с привязанными к ним доменами, так или иначе приходится решать вопрос с почтой, как минимум с доступностью адресов вида webmaster/postmaster/abuse@domain.Кто-то учит M4 и настраивает встроенный sendmail, кто-то использует сторонние сервисы (например от Google), кто-то — поднимает стандартную связку postfix+courier-imap+mysql (ну или аналоги).Мне первое было делать лениво, второе — не хотелось по идеологическим причинам, а третье — слишком избыточно. Поэтому я нашел свой «срединный путь», о чем и хочу рассказать в этой статье.

PrerequirementsПри написании этого руководства я предполагал, что пользователь способен взаимодействовать с *nix-системами посредством консоли, умеет устанавливать пакеты своего дистрибутива и владеет как минимум одним текстовым редактором для редактирования конфигов. В качестве примера я буду устанавливать пакеты на Arch Linux, поскольку это мой домашний дистрибутив.Постановка задачи Прежде чем что-то делать нужно понять, зачем это делать. Описываемая конфигурация имеет смысл в том случае, если: Количество локальных пользователей невелико и для них допустимо создать записи в /etc/passwd Количество обслуживаемых доменов > 1, иначе нас спасает «sendmail по-умолчанию» ИЛИ Нужны какие-то дополнительные вещи, например SSL/TLS или аутентификация ИЛИ Конфигурация сервера недостаточна, чтоб запускать там тяжелые MTA В моем случае совпали все пункты: небольшая виртуалка, на которой я паркую десяток доменов для друзей и знакомых.Установка UW IMAP — опциональная часть. Я не ставил его до тех пор, пока у меня не появилось дополнительных пользователей в системе, поскольку сам я без проблем заходил по ssh и делал mutt.

Установка и первичная настройка OpenSMTPD В Arch Linux установка занимает секунд 5:-)abf8f904537642149d4f716ee042f1e8.pngКонфигурация состоит из одного файла smtpd.conf и опциональных файлов с таблицами. Мой первоначальный конфиг выглядит так:

smtpd.conf # разрешаем работу только по ipv4 limit mta inet4 # слушаем порт 25 на all, представляемся как server.com listen on 0.0.0.0 port 25 hostname server.com # таблицы можно вынести в отдельные файлы. Сейчас они маленькие и умещаются в тексте конфига table aliases { root = kreon, abuse = kreon, postmaster = kreon, webmaster = kreon } table domains { server.com, domain1.ru, domain2.net, domain3.in } # Принимаем почту для указанных алиасов этих доменов и доставляем в локальный почтовый ящик (mbox) accept from any for domain alias deliver to mbox # Пересылаем почту, полученную от локальных пользователей (отправленную командой mail например) accept from local for any relay # Все остальное — не принимаем reject from any for any Как видите — ничего сложно, любая почта проходит по всем цепочкам reject/accept до тех пор, пока не попадет под какое-либо правило.Проверка работоспособности Теперь можно проверить, работает ли почта. Запускаем smtpd -n для проверки конфига и smtpd -d для запуска в foreground с логами в stdin: 9df8c118e66645599d15e37d40630593.pngПытаемся отправить почту на root@domain1.ru…361fd03976b1464f96a9b9a04f00b7d7.pngИ смотрим в вывод сервера82626e1af68d47b08bb7a985571557da.png Mutt подтверждает — почта доставлена! 3cc010d739eb4082a202845e7d857334.pngЭтой минимальной конфигурации вполне достаточно для приема технической почты для десятка-другого доменов.SMTPS/TLS, аутентификация и внешняя фильтрация В opensmtpd аутентифицированный пользователь становится local. Аутентификация включается ключевым словом auth (или auth-optional) в строке с listen, но предварительно надо настроить smtps/tls. Дверенный сертификат и можно получить в разных местах, например у StartSSL. В любом случае предполагаем, что у вас есть 3 файла в формате PEM: server.crt — сертификат сервера server.key — приватный ключ от сертификата cachain.crt — цепочтка подтверждающих сертификатов Теперь мы можем включить smtps/tls и аутентификацию: smtpd.conf # указываем где лежит сертификат, ключ и ca pki server certificate »/etc/ssl/certs/server.crt» pki server key »/etc/ssl/private/server.key» pki server ca »/etc/ssl/certs/cachain.crt»

# разрешаем работу только по ipv4 limit mta inet4

# слушаем порт 25 на all, представляемся как server.com, разрешаем startssl и аутентификацию по желанию listen on 0.0.0.0 port 25 tls pki server hostname server.com auth-optional # слушаем порт 465 на all, представляемся как server.com, требуем ssl и аутентификацию, прячем в заголовках ip отправителя listen on 0.0.0.0 port 465 smtps pki server hostname server.com auth mask-source

# таблицы можно вынести в отдельные файлы. Сейчас они маленькие и умещаются в тексте конфига table aliases { root = kreon, abuse = kreon, postmaster = kreon, webmaster = kreon } table domains { server.com, domain1.ru, domain2.net, domain3.in } # Принимаем почту для указанных алиасов этих доменов и доставляем в локальный почтовый ящик (mbox) accept from any for domain alias deliver to mbox # Пересылаем почту, полученную от локальных пользователей (отправленную командой mail например) accept from local for any relay # Все остальное — не принимаем reject from any for any Теперь клиенты могут отправлять почту наружу с ssl и аутентификацией.

Тестируем Настраиваем smtp-сервер: 289bd3908fd449618adfc60eb95dc1e9.pngОтправляем письмо: 05efb8d5d6754a619ffad4a699d328c4.pngСмотрим на output сервера: 39ced89234c04ac69be026dd6c66024a.png Mutt (обратите внимание на Received заголовок): 17aa9ac8a89b49a194be407a9b18b5e2.pngАнтиспам и прочее Например, можно добавить антиспам через spampd.

smtpd.conf # указываем где лежит сертификат, ключ и ca pki server certificate »/etc/ssl/certs/server.crt» pki server key »/etc/ssl/private/server.key» pki server ca »/etc/ssl/certs/cachain.crt»

# разрешаем работу только по ipv4 limit mta inet4

# слушаем порт 25 на all, представляемся как server.com, разрешаем startssl и аутентификацию по желанию listen on 0.0.0.0 port 25 tls pki server hostname server.com auth-optional # слушаем порт 465 на all, представляемся как server.com, требуем ssl и аутентификацию, прячем в заголовках ip отправителя listen on 0.0.0.0 port 465 smtps pki server hostname server.com auth mask-source # На этом порту мы получаем почту от spampd — уже фильтрованную listen on 127.0.0.1 port 10026 tag Filtered

# таблицы можно вынести в отдельные файлы. Сейчас они маленькие и умещаются в тексте конфига table aliases { root = kreon, abuse = kreon, postmaster = kreon, webmaster = kreon } table domains { server.com, domain1.ru, domain2.net, domain3.in }

# Принимаем уже отфильтрованную почту и доставляем в mbox accept tagged Filtered for domain alias deliver to mbox

# Принимаем почту для указанных алиасов этих доменов и отправляем ее к spampd accept from any for domain relay via «smtp://127.0.0.1:10025»

# Остальное по тегу Filtered удаляем — чтоб антиспам случайно кому-то чего-то не послал reject tagged Filtered

# Пересылаем почту, полученную от локальных пользователей (отправленную командой mail например) accept from local for any relay

# Все остальное — не принимаем reject from any for any И снова ничего сложного, легко настраивается по аналогии с фаерволом или другим поточным фильтром.Установка и настройка UW IMAP Как я уже писал, это часть опциональна, если на сервере один пользователь-сисадмин, то скорее всего imap там и не нужен.Установка: c71b0d25000a4777bf059441fc8fe77b.png

Настройка: 8634dfa7fab449d08b2ff1149a158bda.pngСначала из ключа, сертификата сервера и сертификатов CA создаем PEM-файл для imapd (его имя фиксированно), потом создаем xinetd-unit для xinetd и запускаем xinetd соответственно. Все, ура :-)

Тестируем Настраиваем почтовый клиент для работы с IMAPc4805059d69a427c9ba55314cb2a92d5.pngПроверяем почту и сравниваем с тем, что было в MUTT1eb6d9d0ba11472bb7b8893618f050e4.png Итого Мы получили полноценную почтовую систему, с SSL/TLS и аутентификацией, способную работать даже на микроволновке и не требующую при этом часов вдумчивого чтения манов. По желанию можно расширить ее дальше, добавив например DKIM, backup MX, Greylisting и многое другое. В качестве бонуса: OpenSMTPD делает команда OpenBSD, а значит шанс на наличие там критической уязвимости очень и очень мал.Спасибо за внимание.

© Habrahabr.ru