Настройка Postfix + DKIM / DomainKeys для подписания сообщений через DKIMproxy

Материал из Wiki МИАЦ ВО
Перейти к навигации Перейти к поиску

Статья взята тут. Настраивал все по этой статье + еще немного нашел в инете.

Предпосылки

С постоянно растущим объемом передаваемых спам, многие почтовые сервисы стали использовать более сложные способы проверки подлинности электронной почты. Помимо очевидного - контент - два широко используемых метода (возможно, с некоторыми вариациями), включают Sender Policy Framework (SPF) и DomainKeys Identified Mail (DKIM). Оба эти метода требуют использования DNS записи. SPF- список серверов которым разрешено отправлять почту для домена вводится в DNS. Основное внимание в этой статье будет уделено DKIM.

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

Есть несколько способов реализации DKIM и DomainKeys - один распространенный способ использует Milter для каждого алгоритма. Другим подходом является DKIMproxy, с подписанием модуль прослушивает указанный порт, а также отдельные сообщения электронной почты через прокси подписания модуля. DKIMproxy реализует оба DomainKeys и DKIM спецификации

Установка модулей PERL

DKIMproxy имеет ряд Perl зависимостей.
Запуск через CPAN:
Усли он не установлен, то устанавливаем

urpmi Perl-CPAN

Запускаем CPAN

perl -MCPAN -e shell
install Mail::DKIM

(Зависимости включают: Crypt::OpenSSL::RSA, Digest::SHA, Mail::Address, MIME::Base64, Net::DNS)

install Net::Server
install Error (может не потребоваться)

Установка

После установки зависимостей, загружаем DKIMproxy (текущая версия, на момент написания это 1.4.1).

# cd /usr/local/src
# wget http://downloads.sourceforge.net/dkimproxy/dkimproxy-1.4.1.tar.gz
# tar -xzvf dkimproxy-1.4.1.tar.gz
# cd dkim*
# ./configure --prefix=/usr/local/dkimproxy
# make install

С помощью этих команд мы загрузили программное обеспечение, и установили его в в папку, указанную в параметре prefix.

Теперь создадим пользователя (dkim) для работы DKIMproxy. Нам не нужен каталог пользователя, а для дополнительной безопасности мы также заблокируем пароль (в идеале, мы запрещаем вход с паролем).

# useradd -M -s /bin/false dkim
# passwd -l dkim

Для удаления пароля вообще (если он был установлен), выполните:

# passwd -d dkim

Вы также можете изменить shell после создания учетной записи пользователя, запустив:

# usermod -s /sbin/nologin dkim

Вы можете проверить пользователя и группы, запустив:

# id dkim

Установка Init-Script запуска

Затем мы устанавливаем скрипт инициализации. DKIMproxy поставляется с образцом сценария, но Вам, возможно, потребуется изменить некоторые пути. Следующие команды скопирует сценарий инициализации, сделают его исполняемым и добавляет его в автозапуск.

# cp /usr/loca/src/ dkimproxy-1.4.1/sample-dkim-init-script.sh /etc/init.d/dkimproxy
# cd /etc/init.d
# chmod +x dkimproxy
# chkconfig --add dkimproxy

Некоторые переменные в сценарии инициализации, необходимо поправить:

  • DKIMPROXYUSER (установлено на пользователя, созданного выше)
  • DKIMPROXYGROUP (набор в группу пользователя, созданного выше)
  • PIDDIR (Я установил /var/run/)
  • DKIMPROXY_IN_CFG (путь к dkimproxy_in.conf, может не существовать, если не используется в / корректор скрипта)
  • DKIMPROXY_OUT_CFG (путь к dkimproxy_out.conf, может не существовать, если не используется OUT / подписавшего скрипта)

В сценарий инициализации нет никаких опций, указывающих, используете ли вы IN, OUT, или оба сценария. Это определяется автоматически, на основе того, какие конфигурационные файлы существуют. Сценарий только включает фильтр(ы) с существующими конфигурационными файлами. Таким образом, не создавайте/переименовывайте файлы конфигурации для фильтров, которые вы не хотите.

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

Ключи будем хранить в папке dkimproxy:

cd /usr/local/dkimproxy

Начнем с генерации закрытого ключа. Если вы будете использовать разные ключи для каждого домена (вероятно, хорошая идея), вы можете включить имя домена в имя файла. Кроме того, необходимо указать длину ключа (в битах) - обычно 512, 768 и 1024. Поскольку у некоторых регистраторов есть предел в 256 символов на DNS TXT записи, а закрытый ключ превышает 1024 бит, что может привести к тому, что открытый ключ будет превышать этот предел. UDP обычно имеет предел в 512 байт, который будет ограничивать применение ключей более 4096 бит. Кроме того, более длинные ключи требуют больше обработки электронной почты.
Вы можете проверить существующие ключа RSA, запустив:

#openssl rsa -in domain.priv.key -check

Вы можете найти информацию (например, длину ключа) из существующего ключа RSA, запустив:

#openssl rsa -in domain.priv.key -text -noout

Если вы еще не используете ключ, создать 1024-битный секретный ключ RSA:

#openssl genrsa -out domain.priv.key 1024

Теперь сгенерировать открытый ключ из секретного ключа - уточните имя секретного ключа в качестве входного, и желаемого файла в качестве выхода.

#openssl rsa -in domain.priv.key -pubout -out domain.pub.key

Установите права доступа и владельца ключей:

#chown dkim:dkim *.key
#chmod 400 *.key

Очень удобно генерить ключи на DKIM Wizard. Кроме ключей генерится еще строка для DNS, которую нужно вставит в файл описания зоны DNS. Вводим имя домена, например, volmed.org.ru и селектор, например, mail.

Настройка DKIMproxy-OUT

Для того, чтобы было легко настроить несколько доменов, мы будем использовать sender_map параметр. В связи с этим, мы можем удалить строки (domain, signature, keyfile, selector) из конфигурационного файла, но необходимо добавить путь к файлу sender_map.
Начинаем с копирования файла примера

#cp /usr/local/dkimproxy/etc/dkimproxy_out.conf.example /usr/local/dkimproxy/etc/dkimproxy_out.conf

Редактируем файл /usr/local/dkimproxy/etc/dkimproxy_out.conf:

  • Удаляем или комментируем строки : domain, signature (может быть две), keyfile, selector
  • Из файла по умолчанию, оставить только параметры: listen и relay.
  • Добавляем строку
    sender_map /usr/local/dkimproxy/etc/senders

Создаем файл /usr/local/dkimproxy/etc/senders Формат файла sender_map является:

  • Один домен в одной строке;
  • Параметры (DKIM / DomainKeys) разделены запятыми;
  • Сведения о подписи (например, c, a, s, key) в скобках, рядом с подписью типа, разделены запятыми.
ОБЩИЕ ПАРАМЕТРЫ
Параметр Описание
s Selector (без доменного имени)
d домена подписать для (по умолчанию домена соответствия)
i Идентификатор (по умолчанию отсутствует)
key Полный путь к закрытому ключу
DKIM КОНКРЕТНЫЕ ПАРАМЕТРЫ
Параметр Описание
c Канонизация (simple/relaxed) (по умолчанию simple)
a Алгоритм хеширования (rsa-sha1/rsa-sha256)
DOMAINKEYS КОНКРЕТНЫЕ ПАРАМЕТРЫ
Параметр Описание
c Канонизация (simple/nofws) (по умолчанию simple)
a Алгоритм хеширования (RSA-SHA1)

Примечание: DomainKeys поддерживает только SHA-1 хэш, а также поддерживает DKIM SHA-256. Если вы установите = RSA-SHA256 для DomainKeys, DKIMproxy не запустится с ошибкой (‘signing error: Can’t call method “new” on an undefined value at Signer.pm’)
Пример файла senders

volmed.org.ru dkim(c=relaxed, a=rsa-sha256,s=mail,key=/usr/local/dkimproxy/volmed.org.ru.priv.key), domainkeys(c=nofws,a=rsa-sha1,s=mail,key=/usr/local/dkimproxy/volmed.org.ru.priv.key)

Настройка DNS-записей

Для того чтобы ваш DKIM заработал, необходимо добавить запись TXT в DNS вашего домена.
Надо добавить 2 записи - одна для «policy», другая открытый ключ.

Policy запись
Параметр Название Описание
Название _domainkey
Содержимое o=~; t=y o: исходящие политики:
  • ~ (некоторые электронные письма, подписанные)
  • - (все письма подписаны)
  • ! (Все подписано, нет подписи 3ей стороны)
  • . (Не отправляются письма)

t флаги: n (не тестирование), s (без поддоменов), y (тестовый режим)
n заметки (human readable)
r: отчетность адрес электронной почты (куда сообщать неправильные результаты)

Пример

mail._domainkey.volmed.org.ru. 	TXT "k=rsa\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIVJ2caGXV2a5JD8MSQE+4shPUQ5/PutcFmNq2+fuMulANH62B0h4YM4j8wz7e5gOQwR69pQL5n080AttIGDMEivzdtUrND/d5O9ZmDs8mp1J2rXdbUdulHjsH2EtdNG4ugkbAZ3xjIxKi30szQ3h7YxotNTICdXMcktyCPyLGOwIDAQAB"
_domainkey.volmed.org.ru. 	TXT 	"t=s\; o=~\;"
_adsp._domainkey.volmed.org.ru.	TXT	"dkim=all"

Так же можно у домена прописать ADSP запись (RFC5617) — это позволит принимающему серверу понять, должно ли ваше письмо быть подписано или нет. Запись выгладит таким образом:

_adsp._domainkey.volmed.org.ru. TXT "dkim=all"

Значений dkim= может быть три:

  • all — Все письма должны быть подписаны
  • discardable — Не подписанные письма не должны приниматься
  • unknown — Аналогично отсутствию записи

Добавление SPF записи

Для нормального приема почты еще необходимо добавить SPF запись в DNS запись.
1. Добавляем строки в файл зоны

_SPF 14400 IN TXT "v=spf1 ip4:82.97.229.44"
volmed.org.ru.	 14400 	IN 	TXT 	"v=spf1 include:_SPF.volmed.org.ru ~all"

2. После перезагрузки named, отправляем письмо на gmail.com и смотрим его код и находим строки

 spf=pass (google.com: domain of misha@volmed.org.ru designates 82.97.229.44 as permitted sender) smtp.mail=misha@volmed.org.ru;

Проверка DNS

После перезапуска named, можно проверить все ли у нас правильно с нашим DNS
Проверяем policy запись

$dig +short -ttxt _domainkey.volmed.org.ru
"t=s\; o=~\;"

Проверяем Запись селектора

$ dig +short -ttxt mail._domainkey.volmed.org.ru
"k=rsa\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIVJ2caGXV2a5JD8MSQE+4shPUQ5/PutcFmNq2+fuMulANH62B0h4YM4j8wz7e5gOQwR69pQL5n080AttIGDMEivzdtUrND/d5O9ZmDs8mp1J2rXdbUdulHjsH2EtdNG4ugkbAZ3xjIxKi30szQ3h7YxotNTICdXMcktyCPyLGOwIDAQAB"

Так же можно проверить DNS на сайте. После генерации ключей найдете ссылку для проверки Вашего DNS сервера.

Настройка Postfix

Часть материалов взята тут
Считаем, что у Вас до этого Postfix работал нормально
DKIMproxy получает почту, полученную Postfix, на определенный порт (обычно, представление порта - 587), далее подписывает ее, а затем отправлены обратно в Postfix на порт 25 (типичный порт SMTP) откуда он послан. Любая почта, приходящая на порт 25 не подписана.

Чтобы настроить Postfix, нам необходимо только отредактировать файл master.cf.

  • Затем, в зависимости от того, какие сообщения Вы хотите подписывать, необходимо добавить строку
-O = content_filter dksign:127.0.0.1:10027

Так, например, для подписывания сообщений с 25 порта:

smtp inet n – n – – smtpd
-o content_filter=dksign:127.0.0.1:10027

Если Вы хотите скрипт, созданной почты должен быть подписан:

pickup fifo n – n 40 1 pickup
-o content_filter=dksign:127.0.0.1:10027

Для подписывания сообщений с 587 порта:

submission inet n – n – – smtpd
-o smtpd_etrn_restrictions=reject
-o smtpd_sasl_auth_enable=yes
-o content_filter=dksign:[127.0.0.1]:10027
-o receive_override_options=no_address_mappings
-o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject

Для того что бы работала подписка почты и от клиента и с рассылки php, я добавил все 3 варианта.

Нам нужно добавить еще два блока (в конец файла) для завершения конфигурации. Первый блок нужен для указанных выше параметров и передает сообщения фильтру

dksign    unix  -       -       n       -       4       smtp
-o smtp_send_xforward_command=yes
-o smtp_discard_ehlo_keywords=8bitmime,starttls

Второй блок настраивает слушателя SMTP для приема сообщений, которые были подписаны:

127.0.0.1:10028 инет N - N - 10 SMTPD
-O = content_filter
-O = receive_override_options no_unknown_recipient_checks, no_header_body_checks
-O = smtpd_helo_restrictions
-O = smtpd_client_restrictions
-O = smtpd_sender_restrictions
-O = smtpd_recipient_restrictions permit_mynetworks, отклонить
-О mynetworks = 127.0.0.0 / 8
-О smtpd_authorized_xforward_hosts = 127.0.0.0 / 8

Чтобы закончить настройку, мы запускаем DKIMproxy и перезагружаем Postfix:

service dkimproxy start
service postfix reload

Проверка

Для проверки отсылаем письмо на gmal.com (Создайте там ящик и отправьте письмо себе).
Если письмо не вернулось, то вероятнее всего все работает нормально. Получаем отправленное письмо и смотрим его код.
Там должны быть следующие строки.

Authentication-Results: mx.google.com;
       spf=pass (google.com: domain of misha@volmed.org.ru designates 82.97.229.44 as permitted sender) smtp.mail=misha@volmed.org.ru;
       dkim=pass header.i=@volmed.org.ru

Что говорит, что и SPF и DKIM прошли нормально.