Подделка обратного адреса — самый дешёвый способ выдать фишинг за письмо от банка или коллеги. Домен без почтовых записей принимает такие письма молча, и получатель видит знакомое имя отправителя. SPF, DKIM и DMARC закрывают разные части проблемы: первый перечисляет серверы, которым разрешено отправлять почту, второй подтверждает целостность письма, третий говорит получателю, что делать с нарушителями. Настроить всё можно за вечер, если идти по шагам и проверять каждую запись до включения строгой политики.
Как три механизма дополняют друг друга
SPF хранится в TXT-записи домена и проверяется по адресу отправителя из конверта SMTP. DKIM добавляет к письму подпись: сервер считает хеш выбранных заголовков и тела, подписывает его закрытым ключом, а получатель достаёт открытый ключ из DNS по имени селектора. DMARC связывает результат обеих проверок с доменом в заголовке From, который видит человек.
Слабое место есть у каждого механизма по отдельности. SPF ломается при пересылке: письмо уходит с чужого сервера, и проверка не проходит. DKIM переживает пересылку лучше, но не мешает подделать адрес в From, если подписан другой домен. DMARC требует, чтобы хотя бы одна проверка прошла и совпала с доменом From, — это и называется выравниванием.
dig +short TXT example.com
dig +short TXT mail._domainkey.example.com
dig +short TXT _dmarc.example.com
dig +short MX example.com
Эти запросы показывают, что уже опубликовано: без TXT с v=spf1 домен не защищён, и письма от его имени может отправить кто угодно.
SPF: синтаксис и лимит в десять запросов
Запись начинается с версии и содержит механизмы, которые проверяются по порядку до первого совпадения. Квалификатор задаёт результат: + — пропустить, - — отклонить, ~ — пометить как подозрительное, ? — нейтральный. Завершать запись принято квалификатором -all, но только когда перечислены все легальные отправители.
v=spf1 mx ip4:203.0.113.10 include:_spf.google.com -all
v=spf1 mx include:spf.protection.outlook.com ~all
v=spf1 -all
Механизм mx разрешает серверы из MX-записей, a — адрес самого домена, include подключает чужую политику, например почтового провайдера. На проверку SPF отводится не более десяти DNS-запросов, причём include, mx, a и redirect считаются каждый. Превышение даёт permerror, и письма начинают отклоняться. Вложенные include у провайдеров съедают лимит незаметно, поэтому после правок пересчитайте цепочку вручную.
Для домена без исходящей почты подойдёт v=spf1 -all: такая запись запрещает любые отправления.
DKIM: ключи, селектор и подпись
DKIM работает на стороне почтового сервера. В Postfix его обычно подключают через OpenDKIM: милтер добавляет подпись к исходящим письмам и проверяет входящие. Ключ создаётся один раз, приватная часть остаётся на сервере, публичная публикуется в DNS.
sudo apt install opendkim opendkim-tools
sudo mkdir -p /etc/dkimkeys
sudo opendkim-genkey -b 2048 -d example.com -s mail -D /etc/dkimkeys
sudo chown opendkim:opendkim /etc/dkimkeys/mail.private
Селектор mail — произвольное имя, по нему строится запись mail._domainkey.example.com. В файле mail.txt лежит готовая TXT-запись: скопируйте её в DNS целиком, включая v=DKIM1; k=rsa; p=.... Длинный ключ провайдер может потребовать разбить на строки по 255 символов — при ручной правке зоны проверьте, что части склеиваются без пробелов.
Конфигурация OpenDKIM минимальна: домен, селектор, файл ключа и сокет. В /etc/opendkim.conf укажите:
Domain example.com
Selector mail
KeyFile /etc/dkimkeys/mail.private
Socket inet:8891@localhost
Canonicalization relaxed/relaxed
Затем в /etc/postfix/main.cf добавьте милтер для исходящей и входящей почты:
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
После перезапуска обоих сервисов проверьте, что ключ и DNS совпадают: sudo opendkim-testkey -d example.com -s mail -vvv. Если тест ругается, подождите обновления зоны: отрицательный кеш DNS может держаться минуты.
DMARC: политика и отчёты
Запись DMARC публикуется в _dmarc.example.com и всегда начинается с v=DMARC1. Политика p задаёт действие для писем, не прошедших проверку: none только собирает статистику, quarantine отправляет в спам, reject отклоняет. Начинать с reject без периода наблюдения опасно — можно потерять легальную рассылку.
v=DMARC1; p=none; rua=mailto:dmarc@example.com; fo=1
v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com; adkim=r; aspf=r
v=DMARC1; p=reject; sp=reject; adkim=s; aspf=s; rua=mailto:dmarc@example.com
Параметр rua указывает адрес для агрегированных отчётов: раз в сутки крупные провайдеры присылают архив с XML, где видно, сколько писем прошло и с каких IP. ruf включает отчёты о единичных сбоях, но присылают их редко. adkim и aspf задают строгость выравнивания: r — расслабленное, s — строгое. sp задаёт политику для поддоменов, иначе они наследуют p.
Отчёты приходят в формате gzip+XML и выглядят нечитаемо. Разобрать их помогает parsedmarc: он собирает статистику по домену, отправителям и результатам проверок.
python3 -m pip install --user parsedmarc
parsedmarc -r ./dmarc-reports -o ./out
gzip -dc ./dmarc-reports/*.xml.gz | head -40
Смотрите и на источники: незнакомый IP с большим объёмом — повод проверить забытый сервис или форму на сайте.
Проверка перед строгой политикой
Самый быстрый способ увидеть все три результата — отправить письмо на диагностический адрес. Ответ обычно приходит в течение нескольких минут и содержит разбор SPF, DKIM и DMARC с причинами сбоя.
swaks --to check-auth@verifier.port25.com --from postmaster@example.com
sudo journalctl -u opendkim -n 50 --no-pager
sudo postfix flush
В Gmail откройте полученное письмо, меню «Показать оригинал» и найдите блок Authentication-Results: там перечислены spf=pass, dkim=pass и dmarc=pass. Если DKIM не проходит, сверьте селектор и домен в подписи с DNS. Если SPF даёт softfail, проверьте, все ли отправители перечислены в записи.
Чек-лист внедрения
- Опубликуйте SPF, уложитесь в десять DNS-запросов и завершите запись квалификатором
-all. - Сгенерируйте ключ DKIM на 2048 бит, опубликуйте TXT и проверьте через
opendkim-testkey. - Запустите DMARC с
p=noneиrua, накапливайте отчёты две-четыре недели. - Убедитесь, что легальные отправители проходят выравнивание, затем переходите к
quarantine, а потом кreject. - Для доменов без почты поставьте
v=spf1 -allиv=DMARC1; p=reject. - Раз в квартал пересматривайте записи: диапазоны сервисов меняются.
Итог
SPF, DKIM и DMARC работают только вместе: первый ограничивает серверы, второй подтверждает подлинность письма, третий превращает проверки в понятную политику. Настройка занимает несколько часов, но требует дисциплины — сначала аудит и наблюдение, потом строгие правила. Домен с корректными записями перестаёт быть удобной мишенью: поддельные письма отклоняются на стороне получателя, а отчёты показывают, кто и откуда пытался отправить почту от вашего имени.