Настройка DKIM и SPF в Postfix: пошаговое руководство

Зачем нужны DKIM, SPF и DMARC

Электронная почта без аутентификации — как письмо без подписи: любой может отправить сообщение от имени вашего домена. DKIM, SPF и DMARC — три механизма, которые в совокупности защищают ваш домен от подделки (spoofing) и повышают доставляемость легитимной почты.

  • SPF (Sender Policy Framework) — DNS-запись, перечисляющая IP-адреса серверов, имеющих право отправлять почту от имени домена. Получатель проверяет, соответствует ли IP отправителя списку в SPF.
  • DKIM (DomainKeys Identified Mail) — криптографическая подпись заголовков и тела письма. Отправляющий сервер подписывает письмо приватным ключом, получатель проверяет подпись через публичный ключ в DNS.
  • DMARC (Domain-based Message Authentication, Reporting & Conformance) — политика, определяющая, что делать с письмами, не прошедшими SPF/DKIM проверку: ничего (none), карантин (quarantine) или отклонить (reject). Также включает механизм отчётности.

Без этих механизмов ваши письма рискуют попасть в спам даже у крупных провайдеров (Gmail, Outlook.com, Mail.ru). Google с 2024 года требует DKIM + SPF + DMARC для массовых отправителей.

Настройка SPF

SPF — наиболее простой в настройке механизм. Он реализован как TXT-запись в DNS домена.

Создание SPF-записи

SPF-запись перечисляет все легитимные источники почты для домена:

# Базовая SPF-запись для домена с одним почтовым сервером
# DNS TXT запись для corp.local:
v=spf1 ip4:203.0.113.10 mx -all

# Разъяснение:
# v=spf1      — версия SPF
# ip4:...     — разрешённый IP отправителя
# mx          — все MX-серверы домена
# -all        — отклонять всё остальное (hard fail)

# Расширенная SPF-запись
v=spf1 ip4:203.0.113.10 ip4:203.0.113.11 ip6:2001:db8::1 mx include:_spf.google.com ~all

# include: — включение SPF-записей другого домена (для SaaS)
# ~all      — soft fail (рекомендуется на начальном этапе)
# -all      — hard fail (рекомендуется для продакшена)

Проверка SPF-записи:

# Через dig
dig TXT corp.local +short

# Через nslookup
nslookup -type=TXT corp.local

# Онлайн-проверка через mxtoolbox (из командной строки)
curl -s "https://dns.google/resolve?name=corp.local&type=TXT" | python3 -m json.tool

Проверка SPF на стороне Postfix

Для проверки входящей почты на соответствие SPF установите postfix-policyd-spf-python:

# Установка
sudo apt install postfix-policyd-spf-python

# Конфигурация Postfix: /etc/postfix/master.cf
# Добавьте в конец файла:
policyd-spf  unix  -       n       n       -       0       spawn
  user=policyd-spf argv=/usr/bin/policyd-spf

# /etc/postfix/main.cf
# Добавьте в smtpd_recipient_restrictions:
smtpd_recipient_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_unauth_destination,
  check_policy_service unix:private/policyd-spf

# Настройка таймаута
policyd-spf_time_limit = 3600

# Перезагрузка Postfix
sudo systemctl reload postfix

Установка и настройка OpenDKIM

OpenDKIM — наиболее распространённая реализация DKIM для Postfix.

Установка OpenDKIM

Установка пакетов и начальная конфигурация:

# Установка
sudo apt install opendkim opendkim-tools

# Создание директорий
sudo mkdir -p /etc/opendkim/keys
sudo chown -R opendkim:opendkim /etc/opendkim
sudo chmod 700 /etc/opendkim/keys

Генерация DKIM-ключей

Создание пары ключей (приватный + публичный) для каждого домена:

# Создание директории для домена
sudo mkdir -p /etc/opendkim/keys/corp.local

# Генерация ключей (2048 бит, селектор "mail")
sudo opendkim-genkey -b 2048 -d corp.local -D /etc/opendkim/keys/corp.local -s mail -v

# Результат: два файла
# mail.private — приватный ключ (хранить на сервере)
# mail.txt — публичный ключ (добавить в DNS)

# Установка прав
sudo chown opendkim:opendkim /etc/opendkim/keys/corp.local/mail.private
sudo chmod 600 /etc/opendkim/keys/corp.local/mail.private

# Просмотр публичного ключа для DNS
sudo cat /etc/opendkim/keys/corp.local/mail.txt

Файл mail.txt содержит DNS-запись, которую нужно добавить. Формат:

mail._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; "
  "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..." )

Конфигурация OpenDKIM

Основной файл конфигурации — /etc/opendkim.conf:

# /etc/opendkim.conf
AutoRestart             Yes
AutoRestartRate         10/1h
Syslog                  Yes
SyslogSuccess           Yes
LogWhy                  Yes

Canonicalization        relaxed/simple
Mode                    sv
SubDomains              no
OversignHeaders         From

# Ключи и таблицы
KeyTable                refile:/etc/opendkim/key.table
SigningTable            refile:/etc/opendkim/signing.table
ExternalIgnoreList      /etc/opendkim/trusted.hosts
InternalHosts           /etc/opendkim/trusted.hosts

# Сокет для связи с Postfix
Socket                  local:/run/opendkim/opendkim.sock
PidFile                 /run/opendkim/opendkim.pid

UMask                   007
UserID                  opendkim:opendkim

# Алгоритм подписи
SignatureAlgorithm      rsa-sha256

Создание вспомогательных файлов:

# /etc/opendkim/key.table
# Формат: имя_ключа домен:селектор:/путь/к/приватному/ключу
mail._domainkey.corp.local corp.local:mail:/etc/opendkim/keys/corp.local/mail.private

# /etc/opendkim/signing.table
# Формат: паттерн_отправителя имя_ключа
*@corp.local    mail._domainkey.corp.local

# /etc/opendkim/trusted.hosts
# Хосты, чья почта подписывается
127.0.0.1
::1
localhost
*.corp.local
10.0.0.0/24

Интеграция OpenDKIM с Postfix

Postfix взаимодействует с OpenDKIM через milter (mail filter) интерфейс:

# /etc/postfix/main.cf

# Настройка milter для OpenDKIM
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:/run/opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
# Добавление пользователя postfix в группу opendkim
sudo usermod -aG opendkim postfix

# Создание директории для сокета
sudo mkdir -p /run/opendkim
sudo chown opendkim:opendkim /run/opendkim

# Запуск OpenDKIM
sudo systemctl enable opendkim
sudo systemctl restart opendkim

# Перезагрузка Postfix
sudo systemctl restart postfix

# Проверка, что сокет создан
ls -la /run/opendkim/opendkim.sock

Проверка подписи

Отправьте тестовое письмо и проверьте наличие DKIM-подписи:

# Отправка тестового письма
echo "DKIM test" | mail -s "DKIM Test $(date)" test@gmail.com

# Проверка логов
sudo tail -f /var/log/mail.log | grep -i dkim
# Должно быть: DKIM-Signature field added

# Проверка через командную строку
opendkim-testkey -d corp.local -s mail -vvv

# Результат должен содержать:
# opendkim-testkey: key OK

В заголовках полученного письма должна быть строка Authentication-Results с dkim=pass.

Настройка DMARC

DMARC объединяет SPF и DKIM, определяя политику обработки писем, не прошедших проверку:

# DNS TXT запись для _dmarc.corp.local
_dmarc.corp.local. IN TXT "v=DMARC1; p=none; sp=none; rua=mailto:dmarc-reports@corp.local; ruf=mailto:dmarc-forensic@corp.local; fo=1; adkim=r; aspf=r; pct=100; ri=86400"

# Разъяснение параметров:
# v=DMARC1    — версия
# p=none      — политика: none (мониторинг), quarantine, reject
# sp=none     — политика для поддоменов
# rua=        — адрес для агрегированных отчётов
# ruf=        — адрес для forensic-отчётов
# fo=1        — генерировать отчёт при любом failure
# adkim=r     — выравнивание DKIM: r(relaxed) или s(strict)
# aspf=r      — выравнивание SPF: r(relaxed) или s(strict)
# pct=100     — процент писем, к которым применяется политика
# ri=86400    — интервал отчётов (секунды, 86400 = 1 день)

Рекомендуемый порядок ужесточения DMARC

Не устанавливайте сразу политику reject — это может заблокировать легитимную почту:

  1. Неделя 1-4: p=none — только мониторинг, собирайте отчёты
  2. Неделя 5-8: p=quarantine; pct=10 — карантин для 10% писем
  3. Неделя 9-12: p=quarantine; pct=50 — карантин для 50%
  4. Неделя 13-16: p=quarantine; pct=100 — карантин для всех
  5. После анализа: p=reject; pct=100 — полная защита

На каждом этапе анализируйте DMARC-отчёты. Если обнаружите легитимные источники почты, не прошедшие проверку — добавьте их в SPF или настройте DKIM.

Поддержка нескольких доменов

Если Postfix обслуживает несколько доменов, настройте DKIM для каждого:

# Генерация ключей для каждого домена
sudo mkdir -p /etc/opendkim/keys/example.com
sudo opendkim-genkey -b 2048 -d example.com \
  -D /etc/opendkim/keys/example.com -s mail -v
sudo chown -R opendkim:opendkim /etc/opendkim/keys/example.com

# /etc/opendkim/key.table (добавьте строку)
mail._domainkey.example.com example.com:mail:/etc/opendkim/keys/example.com/mail.private

# /etc/opendkim/signing.table (добавьте строку)
*@example.com    mail._domainkey.example.com

# Перезапуск
sudo systemctl restart opendkim

Для каждого домена добавьте соответствующие DNS-записи: SPF (TXT), DKIM (TXT для mail._domainkey), DMARC (TXT для _dmarc).

Диагностика проблем

Типичные проблемы и методы диагностики:

DKIM не подписывает письма

Проверяйте в следующем порядке:

# 1. Проверка статуса OpenDKIM
sudo systemctl status opendkim

# 2. Проверка сокета
ls -la /run/opendkim/opendkim.sock
# Пользователь postfix должен иметь доступ

# 3. Проверка логов
sudo grep opendkim /var/log/mail.log | tail -20
sudo journalctl -u opendkim -n 50

# 4. Проверка конфигурации
opendkim -n  # парсинг конфигурации без запуска

# 5. Проверка прав на приватный ключ
ls -la /etc/opendkim/keys/corp.local/mail.private
# Должно быть: -rw------- opendkim opendkim

# 6. Проверка signing.table
# Убедитесь, что домен отправителя совпадает с паттерном

SPF fail при отправке

Если получатели видят SPF fail в заголовках:

# Проверка SPF-записи
dig TXT corp.local +short

# Проверка, с какого IP отправляется почта
# Посмотрите Received-заголовки письма — IP должен быть в SPF

# Проверка через spfquery
sudo apt install libmail-spf-query-perl
spfquery -ip 203.0.113.10 -sender user@corp.local -helo mail.corp.local

# Частые ошибки:
# - IP сервера не указан в SPF
# - Превышен лимит DNS-запросов (максимум 10 include/redirect)
# - Отправка через relay, не указанный в SPF
# - Опечатка в SPF-записи

Комплексная проверка

Используйте внешние сервисы для полной проверки настроек:

# Отправка на специальные адреса для проверки
# Gmail: посмотрите заголовки через "Show original"
# Должно быть: SPF: PASS, DKIM: PASS, DMARC: PASS

# Проверка DNS-записей
dig TXT corp.local +short               # SPF
dig TXT mail._domainkey.corp.local +short  # DKIM
dig TXT _dmarc.corp.local +short          # DMARC

# Проверка DKIM-ключа
opendkim-testkey -d corp.local -s mail -vvv

# Проверка через mail-tester.com
# Отправьте письмо на адрес, указанный на сайте mail-tester.com
# Сервис выставит оценку от 1 до 10 и покажет все проблемы

Ротация DKIM-ключей

Регулярная ротация DKIM-ключей — лучшая практика безопасности. Рекомендуемый период — каждые 6-12 месяцев:

# Шаг 1: Генерация нового ключа с новым селектором
sudo opendkim-genkey -b 2048 -d corp.local \
  -D /etc/opendkim/keys/corp.local -s mail202604 -v
sudo chown opendkim:opendkim /etc/opendkim/keys/corp.local/mail202604.private

# Шаг 2: Добавление нового ключа в DNS (не удаляя старый!)
# mail202604._domainkey.corp.local IN TXT "v=DKIM1; h=sha256; k=rsa; p=..."

# Шаг 3: Обновление key.table и signing.table
# /etc/opendkim/key.table:
mail202604._domainkey.corp.local corp.local:mail202604:/etc/opendkim/keys/corp.local/mail202604.private

# /etc/opendkim/signing.table:
*@corp.local    mail202604._domainkey.corp.local

# Шаг 4: Перезапуск OpenDKIM
sudo systemctl restart opendkim

# Шаг 5: Через 1-2 недели (после истечения кэша DNS) удалите старый ключ из DNS
# Удалите запись mail._domainkey.corp.local

Важно: не удаляйте старый DNS-ключ сразу — письма с старой подписью могут находиться в очередях получателей до нескольких дней.

Часто задаваемые вопросы

Технически да, но рекомендуется настраивать оба механизма вместе с DMARC. SPF проверяет только IP-адрес отправителя, DKIM — подлинность содержимого письма. Они дополняют друг друга. Gmail, Outlook.com и другие крупные провайдеры проверяют оба механизма и ожидают их наличие. DMARC не работает без хотя бы одного из них.

Минимум 1024 бит, рекомендуется 2048 бит. Ключи 1024 бит считаются слабыми и могут быть взломаны. Ключи 4096 бит обеспечивают максимальную безопасность, но могут не помещаться в одну DNS TXT-запись (максимум 255 символов на строку) и потребуют разбиения. 2048 бит — оптимальный баланс безопасности и совместимости.

RFC 7208 ограничивает количество DNS-запросов при проверке SPF до 10. Каждый механизм include:, a:, mx:, redirect= вызывает DNS-запрос. Чтобы уложиться в лимит: заменяйте include: на конкретные ip4:/ip6: адреса, объединяйте записи, используйте сервисы flat SPF (например, dmarcian). Механизмы ip4: и ip6: не считаются как DNS lookup.

DKIM для входящей почты проверяется автоматически большинством MTA (Postfix проверяет через OpenDKIM в режиме verify). Это полезно для фильтрации спама — письма с валидной DKIM-подписью от известных доменов имеют больший вес при оценке. Для проверки входящих достаточно режима Mode sv (sign + verify) в OpenDKIM, который включён по умолчанию в нашей конфигурации.

DMARC Aggregate Reports приходят в формате XML на адрес, указанный в rua=. Читать XML вручную неудобно, используйте специализированные инструменты: parsedmarc (open source, парсит отчёты и загружает в Elasticsearch), dmarcian.com, Postmark DMARC (бесплатный), или EasyDMARC. Анализируйте отчёты для обнаружения: легитимных серверов, не включённых в SPF, попыток подделки вашего домена, проблем с DKIM-подписями.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#DKIM Postfix#SPF настройка#DMARC#OpenDKIM#email authentication#настройка почтового сервера#Postfix DKIM подпись#антиспам SPF DKIM
Комментарии 0

Оставить комментарий

загрузка...