SPF, DMARC, DKIM & BIMI. Делаем почту правильной и красивой.

Автор: | 25 июля 2022

Сра­зу ска­жу – это не спа­сет Вас от спа­ма как полу­ча­те­ля, но помо­жет отправ­лять свои пись­ма чисто, кра­си­во и с под­твер­жде­ни­ем Вашей под­лин­но­сти.

Введение

Сна­ча­ла рас­шиф­рую эти тер­ми­ны.

SPF – Sender Policy Framework, инфра­струк­ту­ра поли­ти­ки отпра­ви­те­ля. Поз­во­ля­ет под­твер­дить под­лин­ность доме­на отпра­ви­те­ля. Вла­де­лец доме­на с помо­щью TXT запи­си опре­де­ля­ет какие сер­ве­ра могут отправ­лять почту от име­ни это­го само­го доме­на. Полу­ча­те­ли про­ве­ря­ют сер­вер отпра­ви­те­ля с помо­щью обыч­но­го DNS запро­са и на осно­ва­нии полу­чен­ной инфор­ма­ции могут либо при­ни­мать либо откло­нять пись­ма.

DKIM — DomainKeys Identified Mail. Защи­та доме­на отпра­ви­те­ля при помо­щи клю­чей. Потре­бу­ет­ся создать пуб­лич­ный и при­ват­ный клю­чи. При­ват­ный ключ зашиф­ру­ет под­пись к заго­лов­кам пись­ма, а пуб­лич­ный ключ нуж­но будет доба­вить в DNS при помо­щи txt запи­си. Когда Ваше пись­мо при­хо­дит на сер­вер адре­са­та, он обра­ща­ет­ся к DNS запи­сям Ваше­го доме­на, берет пуб­лич­ный ключ и рас­шиф­ро­вы­ва­ет под­пись в пись­ме. Тем самым под­твер­жда­ет­ся под­лин­ность пись­ма и при­над­леж­ность к Ваше­му доме­ну. На теку­щий момент боль­шин­ство поч­то­вых сер­ве­ров будут откло­нять или поме­чать как спам пись­ма без пра­виль­но настро­ен­но­го DKIM.

DMARC — Domain-based Message Authentication, Reporting and Conformance. Это набор пра­вил для писем от Ваше­го доме­на, кото­рые не про­шли про­вер­ку по SPF и DKIM. Обя­за­тель­ное усло­вие перед уста­нов­кой DMARC – пра­виль­но настро­ен­ные SPF и DKIM.

BIMI — Brand Indicators for Message Identification (вишен­ка на тор­те), это опция, кото­рая поз­во­ля­ет отоб­ра­жать лого­тип Ваше­го брен­да в виде икон­ки в спис­ке писем, если пись­мо про­шло все про­вер­ки – SPF, DKIM и DMARC.

Ввод­ные дан­ные:

  • Ubuntu 20.04
  • Postfix 3.4.13
  • Для про­вер­ки я поль­зу­юсь сер­ви­сом mxtoolbox.com

SPF

В интер­фей­се управ­ле­ния DNS запи­ся­ми доме­на нуж­но создать новую запись типа TXT:

v=spf1 a mx ip4:141.8.193.61 ~all

При­мер­но это выгля­дит так:

TXT запись про­то­ко­ла SPF
  • TXT – инди­ка­тор что это запись типа TXT
  • В поле Name впи­сы­ва­ет­ся Ваш домен, или сим­вол @ — для ука­за­ния кор­не­во­го доме­на. Если ука­зы­ва­е­те домен – смот­ри­те как имен­но его нуж­но писать – у раз­ных хосте­ров раз­ные тре­бо­ва­ния. К при­ме­ру Cloudflare – про­сто домен (gurin.ru), а sprinthost – домен с точ­кой на кон­це (gurin.ru.)
  • v=spf1 – инди­ка­тор что это запись SPF и вер­сия исполь­зу­ет­ся SPF1
  • a – озна­ча­ет, что хосту, ука­зан­но­му в запи­си типа A раз­ре­ше­но отправ­лять пись­ма от име­ни доме­на
  • mx – озна­ча­ет, что всем хостам, пере­чис­лен­ным в запи­сях MX,раз­ре­ше­но отправ­лять пись­ма от име­ни доме­на
  • ip4:141.8.193.61 – озна­ча­ет, что ука­зан­но­му IP адре­су (или диа­па­зо­ну), раз­ре­ше­но отправ­лять пись­ма от име­ни доме­на
  • ~all – озна­ча­ет, что элек­трон­ные пись­ма от Ваше­го доме­на долж­ны при­хо­дить толь­ко с хостов, ука­зан­ных в запи­си SPF. Элек­трон­ные пись­ма от дру­гих хостов будут поме­че­ны как нена­деж­ные.

Сохра­ня­ем и про­ве­ря­ем. Два вари­ан­та – бра­у­зе­ром через сер­вис mxtoolbox и про­сто dig из кон­со­ли на самой ubuntu.

Про­вер­ка SPF запи­си сер­ви­сом mxtoolbox
Про­вер­ка SPF запи­си коман­дой dig

DKIM

Тут будет поин­те­рес­нее. Уста­нав­ли­ва­ем OpenDKIM и инстру­мен­ты

apt install opendkim opendkim-tools

Доба­вим юзе­ра postfix в груп­пу opendkim

gpasswd -a postfix opendkim

Настройка DKIM

Теперь откры­ва­ем кон­фиг OpenDKIM

nano /etc/opendkim.conf

Нуж­но убрать сим­вол ком­мен­та­рия со сле­ду­ю­щих строк

Canonicalization   simple
Mode               sv
SubDomains         no

Зна­че­ние simple заме­нить на relaxed/simple и доба­вить сле­ду­ю­щие стро­ки сра­зу после SubDomains no

AutoRestart         yes
AutoRestartRate     10/1M
Background          yes
DNSTimeout          5
SignatureAlgorithm  rsa-sha256
Пара­мет­ры opendkim

Теперь в самом кон­це фай­ла, после стро­ки UserID opendkim добав­ля­ем вот эти стро­ки

# путь к файлам ключей для подписи сообщений и таблице доменов
KeyTable           refile:/etc/opendkim/key.table
SigningTable       refile:/etc/opendkim/signing.table
# Список хостов, которые могут отправлять почту через сервер в качестве одного из подписывающих доменов без учетных данных
ExternalIgnoreList  /etc/opendkim/trusted.hosts
# Список хостов, почта которых должна быть подписана, а не проверена
InternalHosts       /etc/opendkim/trusted.hosts

У меня не будет внеш­них хостов, толь­ко сам поч­то­вик, поэто­му путь у этих двух пара­мет­ров оди­на­ко­вый. Вот так это выгля­дит:

Пара­мет­ры opendkim

Сохра­ня­ем и закры­ва­ем. Идем даль­ше. Созда­дим струк­ту­ру папок.

Структура папок и файлов DKIM

mkdir -p /etc/opendkim
mkdir -p /etc/opendkim/keys

Меня­ем вла­дель­ца пап­ки и дела­ем пап­ку клю­чей доступ­ной на чте­ние и запись толь­ко поль­зо­ва­те­лю okendkim

chown -R opendkim:opendkim /etc/opendkim
chmod go-rw /etc/opendkim/keys

Созда­дим файл signing.table

nano /etc/opendkim/signing.table

Добав­ля­ем в этот файл строч­ку

*@gurin.ru    default._domainkey.gurin.ru

Это озна­ча­ет, что DKIM дол­жен под­пи­сать сооб­ще­ния с это­го сер­ве­ра, кото­рые исполь­зу­ют в адре­се @gurin.ru, и под­пи­сы­вать нуж­но закры­тым клю­чом default._domainkey.gurin.ru

Если необ­хо­ди­мо под­пи­сы­вать почту не толь­ко основ­но­го доме­на, но и под­до­ме­нов – строч­ка долж­на выгля­деть так:

*@*.gurin.ru    default._domainkey.gurin.ru

Сохра­ня­ем и закры­ва­ем. Теперь созда­дим файл key.table

nano /etc/opendkim/key.table

Добав­ля­ем стро­ку, в кото­рой ука­зан путь до закры­то­го клю­ча:

default._domainkey.gurin.ru    gurin.ru:default:/etc/opendkim/keys/gurin.ru/default.private

Сохра­ня­ем и закры­ва­ем. Теперь созда­дим файл trusted.hosts

nano /etc/opendkim/trusted.hosts

Добав­ля­ем сле­ду­ю­щие строч­ки в этот файл.

127.0.0.1
localhost
*.gurin.ru

Это озна­ча­ет, что если пись­мо при­шло с локал­хо­ста или из это­го же доме­на – DKIM дол­жен под­пи­сать эти пись­ма, а не про­ве­рять. Сохра­ня­ем и закры­ва­ем.

Ключи DKIM

Созда­ем пару клю­чей – пуб­лич­ный и закры­тый. Для под­пи­си исхо­дя­щих сооб­ще­ний будет исполь­зо­вать­ся закры­тый ключ, а для про­вер­ки вхо­дя­щих – пуб­лич­ный ключ. Пуб­лич­ный ключ будет про­пи­сан в TXT запись для доме­на.

Созда­дим пап­ку для доме­на:

mkdir -p /etc/opendkim/keys/gurin.ru

Гене­ри­ру­ем ключ, исполь­зуя opendkim-genkey

opendkim-genkey -b 2048 -d gurin.ru -D /etc/opendkim/keys/gurin.ru -s default -v

Этак коман­да создаст 2048 бит­ный ключ. ‑d (domain) – ука­зы­ва­ет для како­го доме­на. ‑D (path) ука­зы­ва­ет в какую дирек­то­рию сохра­нить клю­чи. ‑s default – с каким име­нем сохра­нить фай­лы клю­чей.  После выпол­не­ния коман­ды в нашей пап­ке будет два фай­ла: default.private – закры­тый ключ и default.txt – пуб­лич­ный ключ.

Теперь сме­ним вла­дель­ца закры­то­го клю­ча на opendkim:

chown opendkim:opendkim /etc/opendkim/keys/gurin.ru/default.private

И сме­ним пра­ва на файл, что бы читать и писать его мог толь­ко opendkim поль­зо­ва­тель.

chmod 600 /etc/opendkim/keys/gurin.ru/default.private

Теперь нуж­но опуб­ли­ко­вать пуб­лич­ный ключ как запись TXT в DNS

cat /etc/opendkim/keys/gurin.ru/default.txt

Все что рас­по­ло­же­но после p= и есть наш пуб­лич­ный ключ. Нуж­но ско­пи­ро­вать его и вста­вить в поле зна­че­ние (value) тек­сто­вой запи­си. Добав­ля­ем запись типа TXT, в поле имя (name) нуж­но ука­зать default._domainkey , а в поле зна­че­ние (value) нуж­но вста­вить

v=DKIM1; k=rsa; p=…..

Обя­за­тель­но нуж­но уда­лить все кавыч­ки и про­бе­лы из клю­ча, ина­че будет ошиб­ка.

Про­ве­ря­ем ключ сле­ду­ю­щей коман­дой:

opendkim-testkey -d gurin.ru -s default -vvv

Если все пра­виль­но – будет при­мер­но такая кар­ти­на

opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: checking key 'default._domainkey.gurin.ru'
opendkim-testkey: key secure
opendkim-testkey: key OK

Глав­ное тут для нас – Key OK. Если Вы исполь­зу­е­те cloudflare, то в тре­тьей тро­ке у Вас будет key not secure – пусть Вас это не пуга­ет, это нор­маль­но.

Про­вер­ка клю­ча DKIM в кон­со­ли

И про­ве­рим через mxtoolbox, долж­но быть при­мер­но так:

Про­вер­ка клю­ча DKIM через mxtoolbox

Postfix и OpenDKIM

Postfix может общать­ся с OpenDKIM посред­ством Unix-socket фай­ла. По умол­ча­нию OpenDKIM исполь­зу­ет сокет файл /var/run/opendkim/opendkim.sock ука­зан­ный в кон­фи­ге /etc/opendkim.conf. Но SMTP демон Postfix в Ubuntu рабо­та­ет в режи­ме chroot, и поэто­му демон SMTP опре­де­ля­ет все пути к фай­лам отно­си­тель­но дирек­то­рии оче­ре­ди Postfix — /var/spool/postfix. Поэто­му нуж­но создать новый сокет файл и поме­нять в кон­фи­ге пути. Созда­ем пап­ку и меня­ем вла­дель­ца – user будет opendkim, group – postfix:

mkdir -p /var/spool/postfix/opendkim
chown opendkim:postfix /var/spool/postfix/opendkim

Теперь меня­ем путь в кон­фиг фай­ле

nano /etc/opendkim.conf

Нуж­но най­ти стро­ку

Socket    local:/run/opendkim/opendkim.sock

И заме­нить на

Socket    local:/var/spool/postfix/opendkim/opendkim.sock
Новый путь до соке­та

Сохра­ня­ем и закры­вам. Сле­ду­ю­щий файл:

nano /etc/default/opendkim

Нахо­дим стро­ку

SOCKET=local:$RUNDIR/opendkim.sock

И меня­ем ее на:

SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"
Новый путь до соке­та

Сохра­ня­ем и закры­ва­ем.

Настройка Postfix:

nano /etc/postfix/main.cf

Добав­ля­ем сле­ду­ю­щие стро­ки, что бы Postfix мог вызы­вать OpenDKIM посред­ством про­то­ко­ла milter:

# DKIM
# -----------------------
milter_protocol = 6
milter_default_action = accept
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
DKIM & Postfix
Настрой­ки Postfix

Сохра­ня­ем и закры­ва­ем. Пере­за­пус­ка­ем OpenDKIM и Postfix и про­ве­ря­ем.

systemctl restart opendkim postfix

Проверка DKIM

Для про­вер­ки мож­но отпра­вить пись­мо с наше­го поч­то­во­го сер­ве­ра на акка­унт Gmail и посмот­реть слу­жеб­ные заго­лов­ки. В полу­чен­ном пись­ме в интер­фей­се Gmail откры­ва­ем меню и нажи­ма­ем «пока­зать ори­ги­нал»

Про­вер­ка DKIM через Gmail
SPF, DKIM, DMARC - проверки пройдены!
Про­вер­ки прой­де­ны!

DMARC

DMARC мож­но настра­и­вать толь­ко после того, как убе­ди­лись, что SPF и DKIM пра­виль­но настро­е­ны и рабо­та­ют. Для нача­ла необ­хо­ди­мо про­ве­рить, что три поля в заго­лов­ках ука­зы­ва­ют на один и тот же домен – домен отпра­ви­те­ля. Поля такие: Return-Path, d=domain в под­пи­си DKIM и FROM

Настройка DMARC
Про­вер­ка сов­па­де­ния доме­на в заго­лов­ках

Если все сов­па­да­ет – созда­ем запись типа TXT для наше­го доме­на. В поле name пишем _dmarc в зна­че­ние пишем:

v=DMARC1; p=none; pct=100; rua=mailto:support@gurin.ru
  • v=DMARC1 – вер­сия про­то­ко­ла DMARC1
  • p=none – поли­ти­ка дей­ствия для наше­го доме­на
  • pct=100 – сколь­ко про­цен­тов писем обра­ба­ты­вать
  • rua=mailto: – адрес, на кото­рый будут при­хо­дить отче­ты о сра­ба­ты­ва­нии

Поли­ти­ку дей­ствий мож­но выбрать одну из трех:

  • none – сооб­ща­ет поч­то­вым сер­ве­рам, что они не долж­ны выпол­нять ниче­го осо­бен­но­го если про­вер­ка DMARC не про­шла
  • quarantine – сооб­ща­ет сер­ве­ру полу­ча­те­лю, что необ­хо­ди­мо поме­стить пись­мо в каран­тин, если про­вер­ка DMARC не про­шла
  • reject – сооб­ща­ет сер­ве­ру полу­ча­те­лю, что необ­хо­ди­мо откло­нить пись­мо, если про­вер­ка DMARC не про­шла.

Я не буду в этот раз опи­сы­вать подроб­но­сти рабо­ты DMARC – луч­ше опи­шу в отдель­ной ста­тье. Хочу лишь заме­тить, что если пла­ни­ру­ет­ся исполь­зо­вать BIMI – то поли­ти­ка дей­ствий не может быть none, толь­ко quarantine или reject.

Про­ве­рить пра­виль­ность запи­си DMARC мож­но тоже через mxtoolbox или через кон­соль с помо­щью dig.

dig txt +short _dmarc.gurin.ru
DMARC - проверка из консоли
Про­вер­ка DMARC в кон­со­ли
Про­вер­ка DMARC через mxtoolbox

BIMI

Этой вишен­ки нет у боль­шин­ства доме­нов в интер­не­те. Дол­го искал для при­ме­ра сре­ди извест­ных, и толь­ко у paypal нашел пол­но­стью настро­ен­ный. На нем и пока­жу.

Итак, для нача­ла нуж­но создать лого­тип, кото­рый хочет­ся отоб­ра­жать в каче­стве икон­ки пись­ма. Тре­бо­ва­ния к лого­ти­пу:

  • SVG файл, пара­метр baseProfile дол­жен быть уста­нов­лен tiny-ps
  • Пара­метр version дол­жен быть уста­нов­лен 1.2
  • Эле­мент title дол­жен отра­жать назва­ние ком­па­нии, но чет­ких тре­бо­ва­ний к нему нет

Созда­ем SVG файл, выкла­ды­ва­ем его в дирек­то­рию, доступ­ную для все­го интер­не­та и добав­ля­ем запись типа TXT в DNS.

v=BIMI1; l=https://www.paypalobjects.com/marketing/web/logos/paypal.svg; a=https://www.paypalobjects.com/marketing/web/logos/paypal_com.pem
  • v=BIMI1 – вер­сия про­то­ко­ла
  • l= путь к фай­лу лого­ти­па
  • a= путь к фай­лу сер­ти­фи­ка­ту

Вот с сер­ти­фи­ка­том все не про­сто. На теку­щий момент его мож­но полу­чить толь­ко в двух сер­ти­фи­ка­ци­он­ных цен­трах:

Нуж­но полу­чить, так назы­ва­е­мый, VMC сер­ти­фи­кат, почи­тать мож­но тут — DigiCert Verified Mark Certificates (VMC) for BIMI

После всех этих мани­пу­ля­ций Вашим пись­мам мож­но будет дове­рять и они будут выгля­деть гораз­до сим­па­тич­ней дру­гих отпра­ви­те­лей. К при­ме­ру как пись­ма от paypal

Так работает BIMI
Так выгля­дит BIMI

Заключение

Чуть поз­же рас­ска­жу, как мож­но отсле­жи­вать кто пыта­ет­ся отправ­лять почту от име­ни Ваше­го доме­на, как это ана­ли­зи­ро­вать и что с этим делать (DMARC).

Ста­тья полу­чи­лась боль­шой, все раз­мыш­лял делить ее на части или нет. Решил оста­вить так, доба­вив оглав­ле­ние.

Полезные материалы

SPF, DMARC, DKIM & BIMI. Делаем почту правильной и красивой.: 3 комментария

  1. Олег

    Доб­рый день.
    Под­ска­жи­те, а запись PTR в насто­я­щее вре­мя так ли силь­но нуж­на для пра­виль­ной спам-оцен­ки пись­ма? Напри­мер на моем ip про­вай­де­ром в PTR уста­нов­ле­на стан­дарт­ная запись, не сов­па­да­ю­щая с моим доме­ном и поме­нять нель­зя. Мне­ния в ине­те раз­нят­ся от “совсем не важ­но” до “никто вашу почту не при­мет”.

    1. Алексей Автор записи

      Ну я могу отве­тить за себя толь­ко. При настрой­ке поч­то­во­го сер­ве­ра я все­гда добав­ляю про­вер­ку обрат­ной зоны. И если она не соот­вет­ству­ет — выдаю ошиб­ку и не при­ни­маю почту от тако­го сер­ве­ра. И с уче­том огром­но­го коли­че­ства спа­ма, мне кажет­ся так дела­ют мно­гие на сво­их поч­то­вых сер­ве­рах.

  2. geek

    Wow, this guide was a total lifesaver! I’ve been struggling to get SPF, DKIM, and DMARC properly configured on my mail server, and your step-by-step breakdown made everything so much clearer. The way you explained the DNS records, especially the TXT entries, really helped me understand how they all work together.

    Before finding this, I kept running into issues with email deliverability, and my mails were constantly landing in spam. Now, thanks to this article, I’ve got everything set up correctly, and my emails are finally getting through. Huge thanks for this!

    Really appreciate the effort that went into this post—love it!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*