RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Перевод выполнен Алексеем Паутовым в рамках некоммерческого проекта RussianLDP (http://www.rldp.ru/). Именно на этом сайте и надлежит искать новые версии, если таковые будут.

55. Поддержка DKIM (Domain Keys Identified Mail), RFC4871

Итак, с версии 4.70 пакет Exim по умолчанию собирается с поддержкой DKIM (Domain Keys Identified Mail или почты, идентифицированной доменными ключами). Эта возможность может быть блокирована параметром в Local/Makefile:
DISABLE_DKIM=yes

Реализация DKIM в Exim позволяет:

  1. Подписывать исходящую почту: эта функция реализована в SMTP-транспорте. Она может сосуществовать с другими средствами Exim, включая транспортные фильтры.
  2. Проверять сигнатуры во входящей почте: это реализовано с помощью дополнительной ACL (acl_smtp_dkim), которая может быть вызвана несколько раз для одного сообщения (один раз для каждой из подписей).

В обычном стиле Exim реализация проверки DKIM не содержит политики по умолчанию. Вместо этого Exim позволяет Вам создать собственную политику из стандартных элементов конфигурирования.

Учтите, что проверка DKIM-подписей во входящей почте включена по умолчанию в целях протоколирования. Для каждой подписи во входящей почте exim пишет строку, в которую помещает наиболее важные детали сигнатуры и ее статус. Например:
2009-09-09 10:22:28 1MlIRf-0003LU-U3 DKIM: d=facebookmail.com s=q1-2009b
c=relaxed/relaxed a=rsa-sha1 i=@facebookmail.com t=1252484542
[verification succeeded]

Вы можете пожелать отключить проверку DKIM целиком на внутреннем источнике почты или почтовом релее. Для этого Вы должны установить модификатор поведения ACL dkim_disable_verify. Модификатор должен быть в RCPT ACL, а также в местах, где Вы принимаете почту от почтовых релеев (внутренние узлы или аутентифицированные отправители).

55.1. Подпись исходящих сообщений

Подпись реализована с помощью установки особых опций транспорта SMTP. Эти опции принимают раскрываемые строки в качестве аргументов.
ОпцияИспользование ТипЗначение по умолчанию
dkim_domainsmtpstring не задана

Имя домена, которое нужно подписать. Результат раскрытия этой строки помещается в раскрываемую переменную $dkim_domain.
ОпцияИспользование ТипЗначение по умолчанию
dkim_selector smtpstringне задана

Этот параметр содержит ключевую строку выбора. Вы можете использовать раскрываемую опцию $dkim_domain для поиска соответствующего селектора. Результат помещается в раскрываемую переменную $dkim_selector, которая может использоваться в $dkim_private_key вместе с $dkim_domain.
ОпцияИспользование ТипЗначение по умолчанию
dkim_private_keysmtp stringне задана

Устанавливает используемый закрытый (private) ключ. Вы можете использовать переменные $dkim_domain и $dkim_selector для определения используемого ключа. Результат может быть любым из следующих:

  • Корректным частным ключом RSA в ASCII-представлении, включая концы строк.
  • Начинаться со слэша, в этом случае он обрабатывается как файл, содержащий закрытый ключ.
  • 0, false или пустая строка, в этом случае сообщение не будет подписано. Этот случай не приводит к ошибке, даже если dkim_strict установлена.
ОпцияИспользование ТипЗначение по умолчанию
dkim_canonsmtp stringне задана

Параметр необязателен. Опция задаёт канонический метод при подписывании сообщения. DKIM RFC на текущий момент определяет два метода: simple и relaxed. Если опция не задана, метод по умолчанию relaxed. Заметьте: текущая реализация поддерживает использование только одинакового канонического метода для заголовков и тела сообщения.
ОпцияИспользование ТипЗначение по умолчанию
dkim_strictsmtp stringне задана

Параметр необязателен. Эта опция определяет, как Exim ведёт себя в ситуациях, когда сообщение необходимо подписать, но подпись неудачна по какой-либо причине. Если результат раскрытия значения 1 или true, exim отложит доставку. В противном случае, Exim отправит письмо без подписи. Вы можете использовать раскрываемые переменные $dkim_domain и $dkim_selector.
ОпцияИспользование ТипЗначение по умолчанию
dkim_sign_headerssmtp stringне задана

Параметр необязателен. Когда задан, опция должна быть раскрыта (или быть задана) как разделённый двоеточиями список имён заголовков. Заголовки с этими именами будут включены в подпись. Если параметр не задан, будут использоваться рекомендованные RFC4871 имена заголовков.

55.2. Верификация DKIM-сигнатур во входящей почте

Верификация DKIM-сигнатур во входящей почте реализована с помощью ACL acl_smtp_dkim. По умолчанию эта ACL вызывается один раз для каждой синтаксически правильной подписи во входящих данных.

Для оценки подписи в ACL большое число раскрываемых переменных содержится в статусе подписи. Соответсвующие подробности устанавливаются в ходе выполнения ACL. Вызова ACL только для существующих подписей недостаточно, чтобы построить более продвинутую политику. По этой причине имеются глобальные опция dkim_verify_signers и раскрываемая переменная $dkim_signers. Глобальная опция dkim_verify_signers может быть задана разделённым двоеточиями списком DKIM-доменов или псевдонимов, для которых вызывается ACL acl_smtp_dkim. Эта ACL раскрывается, когда сообщение было получено. На этом этапе раскрытие переменной $dkim_signers уже содержит разделённый двоеточиями список подписанных доменов и псевдонимов для сообщения. Когда dkim_verify_signers не задана в главной конфигурации, используется значение по умолчанию:
dkim_verify_signers = $dkim_signers

Это проводит к поведению по умолчанию: вызову acl_smtp_dkim для каждой DKIM-подписи в сообщении. Текущие DKIM-верификаторы могут требовать явного вызова ACL для известных доменов или псевдонимов. Это может быть достигнуто следующим образом:
dkim_verify_signers = paypal.com:ebay.com:$dkim_signers

Это приведёт к тому, что acl_smtp_dkim всегда будет вызван для paypal.com и ebay.com, а также для всех доменов и псевдонимов, которые имеют подписи в сообщении. Вы также можете построить правило иначе. Например:
dkim_verify_signers = $sender_address_domain:$dkim_signers

Если домен или его псевдоним указан несколько раз в раскрытом значении dkim_verify_signers, ACL вызывается только однажды. В acl_smtp_dkim следующие раскрываемые переменные доступны:

  • $dkim_cur_signer
    Подписавшийся, значение вычисляется при запуске ACL. Это может быть домен или его псевдоним. Это один из элементов списка с раскрытием главной опции dkim_verify_signers (см. выше).
  • $dkim_verify_status
    Строка, описывающая общий статус подписи. Одно из:
    • none: Сообщение не содержит подписи для текущего домена (как это задано $dkim_cur_signer).
    • invalid: Подпись не может быть проверена из-за ошибок при обработке. Дополнительные детали содержатся в $dkim_verify_reason.
    • fail: Проверка подписи завершилась ошибкой. Дополнительная информация в $dkim_verify_reason.
    • pass: Подпись прошла проверку и является действующей.
  • $dkim_verify_reason
    Строка даёт немного больше деталей, когда $dkim_verify_status имеет значение fail или invalid. Одно из:
    • pubkey_unavailable (когда $dkim_verify_status=invalid): Публичный ключ домена не может быть получен. Это может быть временной проблемой.
    • pubkey_syntax (когда $dkim_verify_status=invalid): Публичный ключ домена синтаксически некорректен.
    • bodyhash_mismatch (когда $dkim_verify_status=fail): Вычисленный хэш тела письма не соответствует указанному в заголовке подписи. Это означает, что тело сообщения было модифицировано при передаче.
    • signature_incorrect (когда $dkim_verify_status=fail): Подпись не может быть проверена. Возможно, чтобы заголовки были модифицированы, перезаписаны или изменены путём, который несовместим с методикой проверки, используемой для DKIM. Это, конечно, также может означать, что подпись была подделана.
  • $dkim_domain
    Подписанный домен. ВАЖНО: Эта переменная заполняется только, если есть актуальная подпись в сообщении для текущего домена или удостоверения личности (как это задано в $dkim_cur_signer). Это список, и сообщения будут подписаны для каждого элемента в списке (кроме дубликатов, конечно).
  • $dkim_identity
    Подписанная личность, если таковая имеется. Заметьте: эта переменная заполняется только, если есть актуальная подпись в сообщении для текущего домена или удостоверения личности (как это задано $dkim_cur_signer).
  • $dkim_selector
    Ключевая строка выбора.
  • $dkim_algo
    Используемый алгоритм: rsa-sha1 или rsa-sha256.
  • $dkim_canon_body
    Метод канонизации тела: relax или simple.
  • $dkim_canon_headers
    Метод канонизации заголовка: relax или simple.
  • $dkim_copiedheaders
    Транскрипция заголовков и их значений, которые включены в подпись (скопировано с тэга z= подписи).
  • $dkim_bodylength
    Количество подписанных байт тела. Если 0, тело не подписано. Если подписавший не установил лимит, то возвращается 9999999999999. Это гарантирует, что переменная всегда раскрывается в целое число.
  • $dkim_created
    Штамп времени Unix, отражающий дату и время, когда была создана подпись. 0 возвращается, если отправителем не задано другое значение.
  • $dkim_expires
    Штамп времени Unix, который отображает дату и времени, после которой подписавший желает, чтобы подпись рассматривалась как просроченная (expired). Когда это не задано подписавшим, возвращается 9999999999999. Это делает возможным сравнение целых чисел со значением этой переменной.
  • $dkim_headernames
    Разделённый двоеточиями список имён заголовков, включённых в подпись.
  • $dkim_key_testing
    1, если ключ имеет установленный флаг testing, 0 в противном случае.
  • $dkim_key_nosubdomaining
    1, если ключ запрещает субдомены, 0 если разрешает.
  • $dkim_key_srvtype
    Значение тэга "тип сервиса" (s=) ключа. По умолчанию *, если не указано в ключе.
  • $dkim_key_granularity
    Степень гранулярности ключа (key granularity, тэг g=) ключа. По умолчанию *, если не указано в ключе.
  • $dkim_key_notes
    Примечания из тела ключа (тэг n=).

Кроме того, предусмотрены два ACL-условия:

  • dkim_signers
    Условие ACL, которое проверяет список доменов или их псевдонимов (разделяются двоеточиями) на соответствие домену, который ACL проверяет сейчас (отражено в $dkim_cur_signer). Это обычно используется, чтобы ограничить действие ACL группой доменов, например:
    # Warn when message apparently from GMail has no signature at all
    warn log_message = GMail sender without DKIM signature
    sender_domains = gmail.com
    dkim_signers = gmail.com
    dkim_status = none
    

  • dkim_status
    Условие ACL, которое соотносит список разделённых двоеточиями результатов проверки DKIM с текущим результатом проверки. Обычно это используется для того, чтобы ограничить дейсвие ACL определённым списком результатов проверки, например:
    deny message = Сообщение от Paypal с недопустимой или недостающей подписью
    sender_domains = paypal.com:paypal.de
    dkim_signers = paypal.com:paypal.de
    dkim_status = none:invalid:fail
    

Возможные ключевые слова статуса: none, invalid, fail и pass. Пожалуйста, обратитесь к документации о раскрываемой переменной $dkim_verify_status выше для получения более детальной информации о том, что они означают.

Поиск

 

Найди своих коллег!