Защита от почтового спуфигна и спама. DKIM и SPF

Как известно современный протокол передачи электронной почты не защищён от спуфинга. То есть, практически, кто угодно может оправлять сообщения от вашего имени. Для понимания давайте рассмотрим пример сессии передачи письма.


S:220 mail.server.com ESMTP Postfix
C:EHLO mysite
S:250-PIPELINING
S:250-SIZE 10240000
S:250-VRFY
S:250-ETRN
S:250-STARTTLS
S:250-AUTH LOGIN CRAM-MD5
S:250-ENHANCEDSTATUSCODES
S:250-8BITMIME
S:250 DSN
C:MAIL FROM:
S:250 someusername@mysite.ru sender accepted
C:RCPT TO:
S:250 user@server.com ok
C:DATA
S:354 Enter mail, end with "." on a line by itself
C:from: someusername@mysite.ru
C:to: user@server.com
C:subject: Hello
C:
C:Hi!
C:.
S:250 769947 message accepted for delivery
C:QUIT
S:221 mail.server.com ESMTP Postfix closing connection

S — сообщения сервера, С — сообщения клиента.
Текст самого письма находиться между командой DATA и пустой строкой с точкой (это именно то что придёт получателю письма).
Как видно, никакой проверки того кто передаёт это письмо нету. Даже более того, в команде MAIL FROM можно указать один почтовый адрес, а в поле письма from другой. Можно конечно посмотреть с какого сервера было отправлено письмо, но если доменное имя сервера не совпадает именем домена отправителя, то это ещё не значит что оно не было отправлено владельцем почтового ящика. Для верификации сервера который передаёт письмо серверу получателя была разработана запись SPF. SPF — это метод с помощью которого в записи DNS можно описать политику при которой письмо будет считаться отправленным от сервера отправителя, а в каких злоумышленником. В DNS домена просто добавляется запись типа TXT, в которой описана эта политика. После того как письмо приходит почтовая система делает DNS запрос записи TXT домена отправителя письма и проверяет удовлетворяет ли заданной политике хост с которого пришло письмо. О формате этой записи очень хорошо расписано в интернете и в rfc4408. Также можете почитать информацию о синтаксисе на сайте проекта. DKIM используется практически для таких же целей, но в отличии от SPF он заверяет содержимое письма, а не узел с которого он отправлен. DKIM использует методику асимметричного шифрования для цифровой подписи. Публичный ключ добавляется в DNS запись, он используется для проверки подписи при получении письма с цифровой подписью (если письмо без цифровой подписи никакой проверки не производиться). Приватный ключ остаётся на почтовой системе, он используется для подписи письма на сервере перед отправкой. Подпись записывается в дополнительный хеадер письма DKIM-Signature. Публичных ключей может быть несколько, таким образом можно к примеру организовать разные подписи на разных почтовых серверах. К примеру если вы используете Google Apps и включили функцию DKIM, то письма отправленные через гугл будут иметь одну подпись, а для отправки писем через другой сервер (к примеру сервер где работает ваш сайт) будет использоваться другая подпись (или не будет использоваться вообще :) ). Для этого каждый DKIM ключ имеет ещё и имя, и в цифровой подписи указанно какой ключ использовался для подписи. Некоторое программное обеспечение в случае если письмо имеет подпись DKIM отображает информацию об этом. К примеру на Яндекс почте отображается такая иконка:
DKIM icon
К сожаление и SPF и DKIM имеют один недостаток — один пользователь одного почтового сервера может выдать себя за другого пользователя это-го же пользователя. Для этого почтовый сервер должен проверять хеадер from письма, и если он не совпадает с пользователем который отправляет письмо заменить его на него. Так делают далеко не все почтовые серверы. Поэтому если вы хотите действительно убедиться что письмо отправил именно тот человек нужно использовать S/MIME или PGP.

Запись опубликована в рубрике Без рубрики с метками . Добавьте в закладки постоянную ссылку.

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

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

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>