Рассмотрим как настроить DKIM подпись для почтового сервера на основе Postfix. DKIM является подпись, которой подписываются все письма, отправляемые с сервера с определенного домена. Наличие DKIM снижает возможность подделки отправителя, а соответственно и вероятность попадания писем в спам на стороне получателя.
Включение DKIM представляет собой генерирование публичной и приватной записей, размещение публичной в DNS, приватной на сервере и настройку соответствующим образом почтового сервера.
Устанавливаем пакеты (используем Debian)
apt-get install opendkim opendkim-tools postfix-policyd-spf-python postfix-pcre
Добавляем пользователя postfix в группу opendkim
adduser postfix opendkim
Открываем основной конфигурационный файл пакета и приводим его к представленному ниже виду:
mcedit /etc/opendkim.conf
# This is a basic configuration that can easily be adapted to suit a standard # installation. For more advanced options, see opendkim.conf(5) and/or # /usr/share/doc/opendkim/examples/opendkim.conf.sample. # Log to syslog Syslog yes # Required to use local socket with MTAs that access the socket as a non- # privileged user (e.g. Postfix) UMask 002 # OpenDKIM user # Remember to add user postfix to group opendkim UserID opendkim # Map domains in From addresses to keys used to sign messages KeyTable /etc/opendkim/key.table SigningTable refile:/etc/opendkim/signing.table # Hosts to ignore when verifying signatures ExternalIgnoreList /etc/opendkim/trusted.hosts InternalHosts /etc/opendkim/trusted.hosts # Commonly-used options; the commented-out versions show the defaults. Canonicalization relaxed/simple Mode sv SubDomains no #ADSPAction continue AutoRestart yes AutoRestartRate 10/1M Background yes DNSTimeout 5 SignatureAlgorithm rsa-sha256 # Always oversign From (sign using actual From and a null From to prevent # malicious signatures header fields (From and/or others) between the signer # and the verifier. From is oversigned by default in the Debian package # because it is often the identity key used by reputation systems and thus # somewhat security sensitive. OversignHeaders From
Устанавливаем на файл права
chmod 644 /etc/openfkim.conf
Создаем необходимые каталоги
mkdir/etc/opendkim
mkdir /etc/opendkim/keys
Рекурсивно меняем владельца и указываем нужные права доступа
chown -R opendkim: /etc/opendkim
chmod 600 /etc/opendkim/keys
Далее необходимо создать файлы которые будут проверяться opendkim
mcedit /etc/opendkim/signing.table
*@example.com example
example.com — используемое доменное имя
example — короткая версия доменного имени без указания зоны
Создаем еще один файл и помещаем в него приведенную ниже строку
mcedit /etc/opendkim/key.table
example example.com:YYYYMM:/etc/opendkim/keys/example.private
example и example.com заменяются по тому же принципу, что и в предыдущем случае. YYYYMM замещается текущим годом и месяцем, например 201707 — это селектор который используется при запросе к DNS. Третья секция — путь к ключу для домена на сервере (ключ может размещаться в другом месте файловой системы)
Создаем /etc/opendkim/trusted.hosts в котором перечисляем список хостов
27.0.0.1
::1
localhost
myhostname
myhostname.example.com
example.com
В качестве myhostname указываем имя сервера — можно узнать выполнив в консоли одноименную команду.
Проверяем права и при необходимости корректируем (пользователь opendkim должен владеть всеми файлами, а каталоги с ключами должны быть доступны только владельцу):
chown -R opendkim: /etc/opendkim
chmod -R go-rwx /etc/opendkim/keys
Генерируем ключ
opendkim-genkey -b 2048 -h rsa-sha256 -r -s YYYYMM -d example.com -v
В результате получаются 2 файла: YYYYMM.private с приватным ключем (переименовываем в example.private и помещаем в /etc/opendkim/keys/) и YYYYMM.txt (переименовываем в example.txt и помещаем запись в DNS — тип записи TXT)
Ключ генерируется свой для каждого домена если подписывать письма нужно несколькими ключами
chown -R opendkim: /etc/opendkim
chmod -R 600 /etc/opendkim/keys
Перезапускаем Opendkim и убеждаемся в том, что ошибок нет
/etc/init.d/opendkim restart
Добавляем публичный ключ DKIM в DNS, по нему будет проверяться подпись
Прежде всего откроем полученный ранее файл example.txt
cat example.txt
201510._domainkey IN TXT ( "**v=DKIM1; h=rsa-sha256; k=rsa; s=email; " "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu5oIUrFDWZ......**" ) ; ----- DKIM key 201510 for example.com
Ключ возьмем отсюда — скопировать нужно все начиная с кавычки перед v=DKIM1 (не включая квычку) до закрывающей кавычки.
Также заменяем в записи h=rsa-sha256 на h=sha256 и убираем кавычки и пробелы в середине записи — ключ должен идти беспрерывно.
Кавычки в начале и конце записи в некоторых случая потребуется сохранить , но обычно кавычки не требуются. Всё требуется от редактора DNS провайдера DNS.
Должно получиться примерно так:
201707._domainkey | IN TXT | v=DKIM1; h=sha256; k=rsa; s=email; p=MIIBIjANBgkqhkiG9w0BAQEF5sxepsy….. |
Здесь YYYYMM_domainkey — имя записи для домена
Проверяем- нулевой вывод будет означать, что все получилось
opendkim-testkey -d example.com -s YYYYMM
Стоит учитывать, что данные обновляются не сразу (это может занимать до 72 часов и зависит от TTL у провайдера)
Подключаем настроенный Opendkim к Postfix
Создаем рабочую директорию и задаем права для того чтобы мог создаться сокет
mkdir /var/spool/postfix/opendkim
chown opendkim:postfix /var/spool/postfix/opendkim
Далее указываем сокет непосредственно в конфигурационном файле Postfix
mcedit /etc/default/opendkim
# Command-line options specified here will override the contents of # /etc/opendkim.conf. See opendkim(8) for a complete list of options. #DAEMON_OPTS="" # # Uncomment to specify an alternate socket # Note that setting this will override any Socket value in opendkim.conf SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock" #SOCKET="inet:54321" # listen on all interfaces on port 54321 #SOCKET="inet:12345@localhost" # listen on loopback on port 12345 #SOCKET="inet:[email protected]" # listen on 192.0.2.1 on port 12345
Значение имеет только незакомментированная строка SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"
— сокета по данному пути пока нет — он создастся после перезапуска сервисов
Редактируем /etc/postfix/main.cf и добавляем поддержку демона Opendkim
Приведенные строки обычно добавляют после директивы smtpd_recipient_restrictions
# Milter configuration # OpenDKIM milter_default_action = accept # Postfix ≥ 2.6 milter_protocol = 6, Postfix ≤ 2.5 milter_protocol = 2 milter_protocol = 6 smtpd_milters = local:/opendkim/opendkim.sock non_smtpd_milters = local:/opendkim/opendkim.sock
Если на сервере используется антиспам система — участок конфигурационного файла может выглядеть иначе:
mailbox_command = smtpd_recipient_restrictions = permit_mynetworks,reject_unauth_destination,check_policy_service unix:private/policyd-spf smtpd_mailters = local:/opendkim/opendkim.sock #smtpd_mailters = local:/opendkim/opendkim.sock, unix:/clamav/clamav-mailter.ctl, unix:/spamass/spamass.sock non_smtpd_milters = local:/opendkim/opendkim.sock #check_policy_service inet:127.0.0.1:10023
Теперь перезапускаем сервисы и проверяем результат
/etc/init.d/opendkim restart
/etc/init.d/postfix restart
Проверяем отправляя письмо на ящик на стороннем сервере и просматривая служебные заголовки — в них должно содержаться указание на то, что письмо подписывается
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=example.com;
s=201707; t=1499711674;
bh=N7ZdhdALx/4YZRLPhhJ+6x7c4DNpo8MD4N3sjFXCGDc=;
h=To:Subject:Date:From:From;
b=aTchm7PJN3la1DnmYRzs+AHIneRuVT0rYeilvp2Ls8IFgY+moLsBVIP8y9Owhy4mP
…
g1KcO5YibzZQA==
Вопрос о том как настроить DKIM подпись на сервере выполнен.
Читайте также про SPF запись DNS. Проверить DKIM и SPF можно используя сервис.
Он предлагает адрес для отправки письма, после отправки проверяет заголовки и выводит результат.