FreeBSD: DKIM верификация средствами Amavisd-new и SpamAssassin

DKIM В отличие от DKIM подписания, задача DKIM верификации пока еще не имеет сбалансированного решения. Именно поэтому данная статья является поверхностным обзором четырех опробованных мной способов DKIM верификации, два из которых в дополнение к статическим правилам используют данные о репутации отправителей, получаемые с сервера DKIM-Reputation Open Data Project.

Постановка задачи

Применение DKIM верификации упрощает идентификацию легитимных сообщений и блокировку маскируемого под них СПАМа. Последние версии Amavisd-new и SpamAssassin имеют в своем составе средства DKIM верификации, которые могут использоваться как по отдельности, так и совместно. Также DKIM-Reputation Open Data Project и Mark Martinec предлагают альтернативные плагины DKIM верификации для SpamAssassin, обеспечивающие использование данных о репутации отправителей, получаемых с сервера DKIM-Reputation Open Data Project. Ниже рассмотрена интеграции всех перечисленных способов DKIM верификации в существующую систему защиты от СПАМа.

Исходные данные

Имеется сервер с FreeBSD, на котором кроме всего прочего развернута почтовая система, имеющая примерно такую же подсистему защиты от СПАМа, как Почтовая система среднего офиса на базе Postfix. Все программное обеспечение установлено из портов, альтернативные модули DKIM загружены с сайтов разработчиков. Во избежание возможных недоразумений отмечу, что я использовал FreeBSD 7.2, Amavisd-new 2.6.4_2,1 и SpamAssassin 3.2.5_4. Все имена папок и файлов соответствуют стандартным значениям, используемым по умолчанию при установке программного обеспечения из портов.

DKIM верификация средствами Amavisd-new

Для того, чтобы Amavisd-new выполнял DKIM верификацию сообщений, необходимо добавить в файл /usr/local/etc/amavisd.conf строку:

$enable_dkim_verification = 1;

В зависимости от принадлежности отправителей сообщений, содержащих успешно проверенные сигнатуры DKIM, к тем или иным доменам Amavisd-new позволяет использовать различные банки политик, определяющие процесс обработки сообщений. Например, для отправителей, имеющих безупречную репутацию, можно отключить все проверки (я не рекомендую отключать проверку на вирусы), для относительно надежных отправителей можно определить значения репутаций, которые будут влиять на итоговые оценки, выставляемые сообщениям по результатам проверки на принадлежность к СПАМу, все остальные сообщения можно по-прежнему проверять согласно банку политики по умолчанию. Для понимания сказанного рассмотрим пример, приведенный в документе amavisd-new-2.6.4 release notes:

$policy_bank{'WHITELIST'} = {
  bypass_spam_checks_maps => [1],
  spam_lovers_maps => [1],
};
$policy_bank{'MILD_WHITELIST'} = {
  score_sender_maps => [ { '.' => [-1.8] } ],
};
$policy_bank{'NOBANNEDCHECK'} = {
  bypass_banned_checks_maps => [1],
  banned_files_lovers_maps  => [1],
};
@author_to_policy_bank_maps = ( {
# 'friends.example.net'     => 'WHITELIST,NOBANNEDCHECK',
# 'user1@cust.example.net'  => 'WHITELIST,NOBANNEDCHECK',
  '.ebay.com'               => 'WHITELIST',
  '.ebay.co.uk'             => 'WHITELIST',
  'ebay.at'                 => 'WHITELIST',
  'ebay.ca'                 => 'WHITELIST',
  'ebay.de'                 => 'WHITELIST',
  'ebay.fr'                 => 'WHITELIST',
  '.paypal.co.uk'           => 'WHITELIST',
  '.paypal.com'             => 'WHITELIST',  # author domain signatures
  './@paypal.com'           => 'WHITELIST',  # 3rd-party sign. by paypal.com
  'alert.bankofamerica.com' => 'WHITELIST',
  'amazon.com'              => 'WHITELIST',
  'cisco.com'               => 'WHITELIST',
  '.cnn.com'                => 'WHITELIST',
  'skype.net'               => 'WHITELIST',
  'welcome.skype.com'       => 'WHITELIST',
  'cc.yahoo-inc.com'        => 'WHITELIST',
  'cc.yahoo-inc.com/@yahoo-inc.com' => 'WHITELIST',
  '.linkedin.com'           => 'MILD_WHITELIST',
  'google.com'              => 'MILD_WHITELIST',
  'googlemail.com'          => 'MILD_WHITELIST',
  './@googlegroups.com'     => 'MILD_WHITELIST',
  './@yahoogroups.com'      => 'MILD_WHITELIST',
  './@yahoogroups.co.uk'    => 'MILD_WHITELIST',
  './@yahoogroupes.fr'      => 'MILD_WHITELIST',
  'yousendit.com'           => 'MILD_WHITELIST',
  'meetup.com'              => 'MILD_WHITELIST',
  'dailyhoroscope@astrology.com' => 'MILD_WHITELIST',
} );

Строки 1-4 определяют банк политики WHITELIST (отменяет проверку сообщений на принадлежность к СПАМу); строки 5-7 — банк политики MILD_WHITELIST (уменьшает итоговую оценку сообщений на 1.8); строки 8-11 — банк политики NOBANNEDCHECK (отменяет проверку на наличие запрещенных по умолчанию типов файлов); строки 12-42 задают соответствие между отправителями сообщений и банками политик. Определения отправителей в списке @author_to_policy_bank_maps должны иметь следующий синтаксис: user@company.com — пользователь user домена company.com; company.com — любой пользователь домена company.com; .company.com — любой пользователь любого субдомена домена company.com, при этом сообщение подписано в субдомене пользователя;.company.com/@company.com — любой пользователь любого субдомена домена company.com, при этом сообщение подписано в родительском домене company.com; ./@company.com — любой пользователь любого домена, при этом сообщение подписано в домене company.com. Список репутаций относительно надежных отправителей может иметь следующий вид (полный список, рекомендуемый разработчиком Amavisd-new, имеется в документе amavisd-new-2.6.4 release notes):

@signer_reputation_maps = ( {
  'ebay.com'                 =>  -8.03,
  'ebay.co.uk'               =>  -8.59,
  'ebay.at'                  =>  -3.59,
  'ebay.ca'                  =>  -9.57,
  'ebay.de'                  =>  -3.38,
  'ebay.fr'                  => -10.95,
  'email.paypal.co.uk'       =>  -0.67,
  'paypal.com'               =>  -6.66,
  'alert.bankofamerica.com'  =>   1.35,
  'amazon.com'               =>   0.09,
  'cisco.com'                =>  -4.95,
  'mail.cnn.com'             =>   4.12,
  'skype.net'                =>  -1.50,
  'welcome.skype.com'        =>  -0.34,
  'yahoo-inc.com'            =>  -1.57,
  'google.com'               =>   1.47,
  'googlemail.com'           =>   3.42,
  'googlegroups.com'         =>  -3.10,
  'yahoogroups.com'          =>  -1.76,
  'yousendit.com'            =>  -4.70,
  'meetup.com'               =>  -1.94,
} );

Изменение оценок вычисляется с учетом значения $reputation_factor (может меняться от 0 до 1, по умолчанию 0.2) следующим способом:

adjusted_spam_score = reputation_factor * signer_reputation + (1 - reputation_factor) * spam_score

На этом настройка DKIM верификации средствами Amavisd-new заканчивается (не забудьте перезапустить Amavisd-new командой amavisd reload). Теперь в заголовки сообщений, которые содержат DKIM сигнатуры, будут добавляться поля Authentication-Results; для сообщений, отправители которых содержатся в списке @author_to_policy_bank_maps не будут выполняться проверки, отключенные в соответствующих банках политики; у сообщений, для отправителей которых тем или иным способом заданы изменения оценок, в поле X-Spam-Status появится еще одна оценка AM:BOOST, рассчитанная как описано выше. Естественно, предложенные значение параметров придется расширять и/или уточнять экспериментальным путем. На мой взгляд, следует очень внимательно отнестись к этому вопросу, т.к. DKIM верификация средствами Amavisd-new наиболее эффективна с точки зрения экономии системных ресурсов и соответствующего повышения пропускной способности почтовой системы, ведь она позволяет обойтись без выполнения проверок SpamAssassin для значительной части сообщений.

DKIM верификация средствами SpamAssassin

Настройку DKIM верификация средствами SpamAssassin следует начать с пересборки SpamAssassin c поддержкой DKIM верификации:

cd /usr/ports/mail/p5-Mail-SpamAssassin
make deinstall
make WITH_DKIM=true reinstall clean

По умолчанию плагин Mail::SpamAssassin::Plugin::DKIM отключен. Для его активации необходимо раскомментировать строку loadplugin Mail::SpamAssassin::Plugin::DKIM в файле /usr/local/etc/mail/spamassassin/v312.pre, а также закомментировать строку loadplugin Mail::SpamAssassin::Plugin::DomainKeys в файле /usr/local/etc/mail/spamassassin/v310.pre, если она была раскомментирована ранее.
При обработке сообщений, содержащих сигнатуры DKIM, SpamAssassin использует следующие правила (в скобках указаны соответствующие оценки по умолчанию): DKIM_SIGNED (0.001) — сообщение содержит сигнатуру DKIM, DKIM_VERIFIED (-0.001) — сигнатура DKIM проверена, DKIM_POLICY_TESTING (0.001) — DKIM подписание в домене отправителя работает в тестовом режиме (ключ DKIM, который был использован для подписания сообщения, имеет дополнительный параметр 't' со значением 'y'), DKIM_POLICY_SIGNSOME (0.001) / DKIM_POLICY_SIGNALL (0.001) — DKIM ADSP в домене отправителя разрешает / запрещает отправку неподписанных сообщений, USER_IN_DKIM_WHITELIST (-100.000) / USER_IN_DEF_DKIM_WL (-7.500) — адрес отправителя содержится в пользовательском / входящем в поставку SpamAssassin белом списке DKIM. Если адрес отправителя в полях Envelope-From: и From: содержится в пользовательском белом списке DKIM, срабатывает дополнительное правило ENV_AND_HDR_DKIM_MATCH, по умолчанию выставляющее оценку -7.500. Использование перечисленных правил можно рассмотреть на примере, приведенном в разделе Putting DKIM verification to good use in SpamAssassin документа amavisd-new documentation bits and pieces:

score DKIM_VERIFIED -0.1
score DKIM_SIGNED   0
score DKIM_POLICY_SIGNALL  0
score DKIM_POLICY_SIGNSOME 0
score DKIM_POLICY_TESTING  0
score USER_IN_DKIM_WHITELIST -8.0
score USER_IN_DEF_DKIM_WL    -1.5
score ENV_AND_HDR_DKIM_MATCH -0.1
whitelist_from_dkim *@ebay.com
whitelist_from_dkim *@*.ebay.com
whitelist_from_dkim *@ebay.co.uk
whitelist_from_dkim *@*.ebay.co.uk
whitelist_from_dkim *@ebay.at
whitelist_from_dkim *@ebay.ca
whitelist_from_dkim *@ebay.de
whitelist_from_dkim *@ebay.fr
whitelist_from_dkim *@*.paypal.com
whitelist_from_dkim *@paypal.com
whitelist_from_dkim *@* paypal.com
whitelist_from_dkim *@*.paypal.be
whitelist_from_dkim *@cern.ch
whitelist_from_dkim *@amazon.com
whitelist_from_dkim *@springer.delivery.net
whitelist_from_dkim *@cisco.com
whitelist_from_dkim *@alert.bankofamerica.com
whitelist_from_dkim *@bankofamerica.com
whitelist_from_dkim *@cnn.com
whitelist_from_dkim *@*.cnn.com
whitelist_from_dkim *@skype.net
whitelist_from_dkim service@youtube.com
whitelist_from_dkim *@welcome.skype.com
whitelist_from_dkim *@cc.yahoo-inc.com  yahoo-inc.com
whitelist_from_dkim *@cc.yahoo-inc.com
whitelist_from_dkim rcapotenoy@yahoo.com
whitelist_from_dkim googlealerts-noreply@google.com
def_whitelist_from_dkim *@google.com
def_whitelist_from_dkim *@googlemail.com
def_whitelist_from_dkim *@* googlegroups.com
def_whitelist_from_dkim *@* yahoogroups.com
def_whitelist_from_dkim *@* yahoogroups.co.uk
def_whitelist_from_dkim *@* yahoogroupes.fr
def_whitelist_from_dkim *@yousendit.com
def_whitelist_from_dkim *@meetup.com
def_whitelist_from_dkim dailyhoroscope@astrology.com

Строка 1 меняет оценку, выставляемую правилом DKIM_VERIFIED; строка 2 отключает правило DKIM_SIGNED, т.к. наличие сигнатуры DKIM не является критерием валидности сообщения; строки 3-5 отключают правила, проверяющие ADSP, т.к., во-первых, не многие задают ADSP, а, во-вторых, пока не существует правила, позволяющего идентифицировать ADSP discardable (разработчики обещают исправить этот момент); строки 6-8 меняют оценки, выставляемые правилами USER_IN_DKIM_WHITELIST, USER_IN_DEF_DKIM_WL и ENV_AND_HDR_DKIM_MATCH, на менее гуманные; строки 9-35 и 36-44 определяют белые списки DKIM. При определении белых списков DKIM используется следующий синтаксис: user@company.com – пользователь user домена company.com; *@company.com – любой пользователь домена company.com; *@*.company.com – любой пользователь любого субдомена домена company.com, при этом сообщение подписано в субдомене пользователя; *@*.company.com company.com – любой пользователь любого субдомена домена company.com, при этом сообщение подписано в родительском домене company.com; *@* company.com – любой пользователь любого домена, при этом сообщение подписано в домене company.com. SpamAssassin позволяет использовать гораздо более сложные правила, предположим, идентифицировать неподписанные сообщения, якобы отправленные из доменов, всегда выполняющих подписание. Рассмотрим пример, приведенный в вышеназванном документе:

header   __ML1          Precedence =~ m{\b(list|bulk)\b}i
header   __ML2          exists:List-Id
header   __ML3          exists:List-Post
header   __ML4          exists:Mailing-List
header   __ML5          Return-Path:addr =~ m{^([^\@]+-(request|bounces|admin|owner)|owner-[^\@]+)(\@|\z)}mi
meta     __VIA_ML       __ML1 || __ML2 || __ML3 || __ML4 || __ML5
describe __VIA_ML       Mail from a mailing list
header   __AUTH_YAHOO1  From:addr =~ m{[\@.]yahoo\.com$}mi
header   __AUTH_YAHOO2  From:addr =~ m{\@yahoo\.com\.(ar|au|br|cn|hk|mx|my|ph|sg|tw)$}mi
header   __AUTH_YAHOO3  From:addr =~ m{\@yahoo\.co\.(id|in|jp|nz|th|uk)$}mi
header   __AUTH_YAHOO4  From:addr =~ m{\@yahoo\.(ca|cn|de|dk|es|fr|gr|ie|it|no|pl|se)$}mi
meta     __AUTH_YAHOO   __AUTH_YAHOO1 || __AUTH_YAHOO2 || __AUTH_YAHOO3 || __AUTH_YAHOO4
describe __AUTH_YAHOO   Author claims to be from Yahoo
header   __AUTH_GMAIL   From:addr =~ m{\@gmail\.com$}mi
describe __AUTH_GMAIL   Author claims to be from gmail.com
header   __AUTH_PAYPAL  From:addr =~ /[\@.]paypal\.(com|co\.uk)$/mi
describe __AUTH_PAYPAL  Author claims to be from PayPal
header   __AUTH_EBAY    From:addr =~ /[\@.]ebay\.(com|at|be|ca|ch|de|ee|es|fr|hu|ie|in|it|nl|ph|pl|pt|se|co\.(kr|uk)|com\.(au|cn|hk|mx|my|sg))$/mi
describe __AUTH_EBAY    Author claims to be from eBay
meta     NOTVALID_YAHOO !DKIM_VERIFIED && __AUTH_YAHOO && !__VIA_ML
priority NOTVALID_YAHOO 500
describe NOTVALID_YAHOO Claims to be from Yahoo but is not
score    NOTVALID_YAHOO 2.8
meta     NOTVALID_GMAIL !DKIM_VERIFIED && __AUTH_GMAIL && !__VIA_ML
priority NOTVALID_GMAIL 500
describe NOTVALID_GMAIL Claims to be from gmail.com but is not
score    NOTVALID_GMAIL 2.8
meta     NOTVALID_PAY   !DKIM_VERIFIED && (__AUTH_PAYPAL || __AUTH_EBAY)
priority NOTVALID_PAY   500
describe NOTVALID_PAY   Claims to be from PayPal or eBay, but is not
score    NOTVALID_PAY   6
whitelist_from_rcvd     abuse@yahoo.com         yahoo.com
whitelist_from_rcvd     MAILER-DAEMON@yahoo.com yahoo.com

Строки 1-7 содержат правила, определяющие, что сообщение было отправлено с использованием списков рассылки; строки 8-13 — правила, срабатывающие, если сообщение отправлено пользователем одного из доменов Yahoo; строки 14,15 — правила, срабатывающие, если сообщение отправлено пользователем службы Gmail; строки 16,17 — правила, срабатывающие, если сообщение отправлено пользователем одного из доменов PayPal; строки 18,19 — правила, срабатывающие, если сообщение отправлено пользователем одного из доменов eBay; строки 20-23 — правила, срабатывающие, если в адресе отправителя указан пользователь одного из доменов Yahoo, у сообщения отсутствуют признаки использования списков рассылки и валидная сигнатура DKIM (Yahoo не отправляет такие письма); строки 24-27 — правила, срабатывающие, если в адресе отправителя указан пользователь службы Gmail, у сообщения отсутствуют признаки использования списков рассылки и валидная сигнатура DKIM (Gmail не отправляет такие письма); строки 28-31 — правила, срабатывающие, если в адресе отправителя указан пользователь одного из доменов PayPal, у сообщения отсутствуют признаки использования списков рассылки и валидная сигнатура DKIM (PayPal не отправляет такие письма); строки 32, 33 — разрешают прием сообщений со специальных адресов без DKIM верификации. Более подробная информация о составлении и отладке дополнительных правил SpamAssassin имеется в документе Writing and Testing New Rules.
На этом настройка DKIM верификации средствами SpamAssassin заканчивается (не забудьте перезапустить Amavisd-new командой amavisd reload). Как и в случае с Amavisd-new, указанные выше значение параметров придется расширять и/или уточнять экспериментальным путем. Помните, что при совместном использовании DKIM верификации средствами Amavisd-new и SpamAssassin увеличивается количество DNS запросов, которые выполняются при проверке сообщений. Разработчики SpamAssassin обещает исправить этот момент (SpamAssassin будет использовать данные, содержащиеся в полях Authentication-Results, добавленных Amavisd-new в заголовки сообщений).

Несколько слов о DKIM-Reputation Open Data Project

DKIM-Reputation Open Data Project — проект Мюнхенской компании Agitos Websolutions, который предоставляет публичный список репутаций отправителей, выполняющих DKIM подписание сообщений. Репутации отправителей варьируются от -1000 (лучшая репутация, присвоенная абстрактному отправителю good@example.com) до 1000 (худшая репутация, присвоенная абстрактному отправителю bad@example.com) и хранятся в виде TXT записей на DNS сервере проекта, который имеет имя al.dkim-reputation.org. У данного сервера можно запрашивать два типа TXT записей: как о репутации отправителей (user-level DKIM reputation), так и о репутации доменов, в которых выполняется DKIM подписание (signingdomain-level DKIM reputation), при этом для получения информации о репутации отправителей необходимо запрашивать записи hex(md5(user)).hex(md5(domain)).hex(md5(signdomain)).al.dkim-reputation.org, о репутации доменов, в которых выполняется DKIM подписание, — *.hex(md5(signdomain)).al.dkim-reputation.org. Например, для выяснения репутации абстрактного отправителя bad@example.com, DKIM подписание сообщений которого осуществляется в домене example.com, можно выполнить команду:

dig TXT bae60998ffe4923b131e3d6e4c19993e.5ababd603b22780302dd8d83498e5172.5ababd603b22780302dd8d83498e5172.al.dkim-reputation.org

которая выведет примерно такое сообщение (строка, содержащая интересующую нас информацию, подсвечена):

; <<>> DiG 9.3.6-P1 <<>> TXT bae60998ffe4923b131e3d6e4c19993e.5ababd603b22780302dd8d83498e5172.5ababd603b22780302dd8d83498e5172.al.dkim-reputation.org
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16481
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0
;; QUESTION SECTION:
;bae60998ffe4923b131e3d6e4c19993e.5ababd603b22780302dd8d83498e5172.5ababd603b22780302dd8d83498e5172.al.dkim-reputation.org. IN TXT
;; ANSWER SECTION:
bae60998ffe4923b131e3d6e4c19993e.5ababd603b22780302dd8d83498e5172.5ababd603b22780302dd8d83498e5172.al.dkim-reputation.org. 86400 IN TXT "rep=1000\;time=20091202010617\;wppd=1"
;; AUTHORITY SECTION:
al.dkim-reputation.org. 505131  IN      NS      dns.dkim-reputation.org.
al.dkim-reputation.org. 505131  IN      NS      ns.heindlnet.de.
;; Query time: 436 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Dec  2 20:30:00 2009
;; MSG SIZE  rcvd: 234

Также репутация отправителя может быть проверена с помощью специальной формы на главной странице официального сайта проекта:

Выяснение репутации отправителя

Более подробная информация об организации взаимодействия с сервером DKIM-Reputation Open Data Project, имеется в документах Mission of DKIM Reputation project и Implementing your own DKIM Reputation client. В завершение этого раздела добавлю, что в настоящее время большинство СПАМеров имеет репутацию от 50 до 100, при этом зона al.dkim-reputation.org содержит около 135000 записей о репутации, динамику заполнения данной зоны в удобной графической форме можно увидеть странице DNS Reputation Records. И самое главное — Вы можете создать аккаунт и настроить мониторинг корректности DKIM подписания сообщений обслуживаемыми Вами почтовыми системами.

DKIM верификация средствами альтернативного плагина DKIM для SpamAssassin

DKIM-Reputation Open Data Project предлагает альтернативный плагин DKIM для SpamAssassin, представляющий из себя стандартный плагин Mail::SpamAssassin::Plugin::DKIM, дополненный возможностями получения данных о репутации отправителей в процессе анализа сообщений на принадлежность к СПАМу. Для установки альтернативного плагина DKIM необходимо сохранить «родной» плагин DKIM (он понадобится позже), а затем загрузить, распаковать и переместить в папку плагинов SpamAssassin альтернативный плагин:

cd /tmp
mv /usr/local/lib/perl5/site_perl/5.8.9/Mail/SpamAssassin/Plugin/DKIM.pm .
fetch http://www.dkim-reputation.org/fileadmin/downloads/reputationclient/Mail-SpamAssassin-3.2.5-DKIM-Reputation-Plugin-V3.tgz
tar xf Mail-SpamAssassin-3.2.5-DKIM-Reputation-Plugin-V3.tgz
cd Mail-SpamAssassin-3.2.5-DKIM-Reputation-Plugin-V3
mv *.pm /usr/local/lib/perl5/site_perl/5.8.9/Mail/SpamAssassin/Plugin

После замены плагина необходимо добавить в файл /usr/local/etc/mail/spamassassin/v312.pre строки:

full DKIM_VALID    eval:check_dkim_valid()
full DKIM_VALID_AU eval:check_dkim_valid_author_sig()

Следует отметить, что в этом месте я столкнулся с разногласиями: в файле README, входящем в состав дистрибутива плагина, рекомендуется добавить в файл /usr/local/etc/mail/spamassassin/v312.pre строку full DOMAINKEY_DOMAIN eval:check_dkim_verified(), а в исходном тексте плагина (файле DKIM.pm) — строки, предложенные выше. Я сделал свой выбор в связи с тем, что идентификатор DKIM_VALID является синонимом DKIM_VERIFIED, и в слудующих версиях SpamAssassin будут использоваться правила DKIM_VALID (сообщение содержит хотя бы одну валидную сигнатуру DKIM) и DKIM_VALID_AU (сообщение содержит валидную сигнатуру DKIM домена отправителя), а не используемое в настоящее время правило DKIM_VERIFIED. При таком выборе следует отключить правило DKIM_VERIFIED и определить оценки, выставляемые правилами DKIM_VALID и DKIM_VALID_AU, в файле /usr/local/etc/mail/spamassassin/local.cf:

score DKIM_VERIFIED 0
score DKIM_VALID    -0.1
score DKIM_VALID_AU -0.5

Также в файле /usr/local/etc/mail/spamassassin/local.cf можно изменить коэффициенты dkimrep_maxspamscore (по умолчанию: 15) и dkimrep_maxhamscore (по умолчанию: -15), которые учитываются при расчете оценок, зависящих от репутации отправителей. Эти оценки вычисляются следующим образом (помните, что отрицательная репутация добавлена на перспективу и в настоящее время не используется):

score = dkimrep_maxspamscore / 1000 * DKIM-Reputation или score = dkimrep_maxhamscore / 1000 * DKIM-Reputation

При использовании значений коэффициентов по умолчанию сообщения от большинства СПАМеров получают оценку от 0,5 до 1. На этом настройка DKIM верификации средствами альтернативного плагина DKIM заканчивается, хотя в большинстве случаев придется уточнять значения коэффициента dkimrep_maxspamscore. На время тестирования и окончательной настройки альтернативного плагина DKIM можно повысить детальность логов Amavisd-new (определяется параметром $log_level в файле /usr/local/etc/amavisd.conf) до значения 5 и запустить Amavisd-new командой amavisd -d all, чтобы отладочная информация записывалась в /var/log/debug.log (учтите, что при этом размер лога начнет резко увеличиваться). Теперь в процессе доставки сообщений, содержащих сигнатуры DKIM, в /var/log/debug.log будут выводиться примерно такие сообщения («лишняя», на мой взгляд, информация удалена, имя пользователя Gmail и md5-хеш имени заменены на user и ee11cbb19052e40b07aac0ca060c23ee, соответственно):

SA dbg: dkim: no wl entries match author user@gmail.com, no need to verify sigs
SA dbg: dkim: performing public key lookup and signature verification
SA dbg: dkim: signing identity: @gmail.com, d=gmail.com, a=rsa-sha256, c=relaxed/relaxed
SA dbg: dkim: signing identity: user@gmail.com, d=gmail.com, a=rsa-sha1, c=nofws
SA dbg: dkim: signature verification result: PASS
SA dbg: DKIMRep: check_dkimreputation
SA dbg: DKIMRep: found some valid dkim identities
SA dbg: DKIMRep: request to ee11cbb19052e40b07aac0ca060c23ee.f74d39fa044aa309eaea14b9f57fe79c.f74d39fa044aa309eaea14b9f57fe79c.al.dkim-reputation.org
SA dbg: dkim: policy: not retrieved, author signature is valid

Естественно, мне захотелось проверить, каким образом альтернативный плагин DKIM будет реагировать на сообщения, отправители которых имеют «нехорошую» репутацию, однако, это оказалось невозможным, в связи с чем я задал вопрос разработчикам DKIM-Reputation Open Data Project. Мне ответили, что, к сожалению, в настоящее время не существует каких-либо онлайн-инструментов тестирования работоспособности систем DKIM-верификации, использующих данные о репутации отправителей, получаемые с сервера DKIM-Reputation Open Data Project, но создание соответствующей системы планируется. Еще мне сказали, что можно скормить SpamAssassin сообщение от абстрактного отправителя bad@example.com. Я знаю, как проверить сообщение, хранящееся в тестовом файле, но не догадываюсь, как создать сообщение с валидной сигнатурой DKIM от абстрактного пользователя. В связи с этим остается только экспериментировать и надеяться на дальнейшее развитие проекта DKIM-Reputation Open Data Project.

DKIM верификация средствами альтернативного плагина DKIMrep для SpamAssassin

Для того, чтобы обзор был полным, необходимо рассказать еще и о плагине DKIMrep для SpamAssasssin, который разработал Mark Martinec. Данный плагин предназначен для совместной работы с «родным” плагином DKIM и разработан на базе альтернативного плагина DKIM от DKIM-Reputation Open Data Project. Для установки плагина DKIMrep необходимо восстановить восстановить «родной» плагин DKIM, если он был заменен альтернативным, и загрузить необходимые файлы в папку, содержащую плагины для SpamAssassin:

cd /usr/local/lib/perl5/site_perl/5.8.9/Mail/SpamAssassin/Plugin
mv /tmp/DKIM.pm .
fetch http://www.ijs.si/software/amavisd/DKIMrep.pm http://www.ijs.si/software/amavisd/effectiveTLDs.pm

После замены плагина необходимо привести содержимое файла /usr/local/etc/mail/spamassassin/v312.pre к виду:

loadplugin Mail::SpamAssassin::Plugin::DKIM
loadplugin Mail::SpamAssassin::Plugin::DKIMrep

Затем следует добавить в файл /usr/local/etc/mail/spamassassin/local.cf строки:

ifplugin Mail::SpamAssassin::Plugin::DKIM
ifplugin Mail::SpamAssassin::Plugin::DKIMrep
full     DKIM_REPUT eval:check_dkim_reputation()
tflags   DKIM_REPUT net
score    DKIM_REPUT 0.1
describe DKIM_REPUT Signing domain reputation according to dkim-reputation.org
priority DKIM_REPUT 200
dkimrep_maxspamscore 0.5
dkimrep_maxhamscore -0.5
endif
endif

На этом настройка DKIM верификации средствами плагина DKIMrep заканчивается, хотя, как и в предыдущем случае, скорее всего придется уточнять значения коэффициента dkimrep_maxspamscore. Процедура настройки и тестирования плагина DKIMrep также не отличается от уже рассмотренной. Теперь в процессе доставки сообщений, содержащих сигнатуры DKIM, в /var/log/debug.log будут выводиться примерно такие сообщения (как и в предыдущем случае, «лишняя» информация удалена, имя пользователя Gmail и md5-хеш имени заменены на user и ee11cbb19052e40b07aac0ca060c23ee, соответственно):

SA dbg: dkimrep: check_dkim_reputation
SA dbg: dkimrep: found some valid dkim identities
SA dbg: dkimrep: request (src) DKIMrep:TXT:(user).(gmail.com).(gmail.com).(al.dkim-reputation.org)
SA dbg: dkimrep: request  ee11cbb19052e40b07aac0ca060c23ee.f74d39fa044aa309eaea14b9f57fe79c.f74d39fa044aa309eaea14b9f57fe79c.al.dkim-reputation.org
SA dbg: dkimrep: request (src) DKIMrep:TXT:(*).(gmail.com).(al.dkim-reputation.org)
SA dbg: dkimrep: request *.f74d39fa044aa309eaea14b9f57fe79c.al.dkim-reputation.org
SA dbg: dkimrep: DNS query failed: NXDOMAIN, key DKIMrep:TXT:(*).(gmail.com).(al.dkim-reputation.org)
SA dbg: dkimrep: DNS query failed: NXDOMAIN, key DKIMrep:TXT:(user).(gmail.com).(gmail.com).(al.dkim-reputation.org)
SA dbg: dkimrep: aggregate score: 0

Пусть Вас не пугают сообщения DNS query failed: NXDOMAIN. Они подтверждают, что на сервере al.dkim-reputation.org нет данных ни о домене, в котором было выполнено DKIM подписание, ни об отправителе сообщения (ни домен, ни отправитель не занесены в черный список).
Использование плагина DKIMrep кажется мне более удобным, т.к. я являюсь противником замены программных модулей, периодически обновляемых с помощью системы портов. Все остальные проблемы, описанные в предыдущем разделе, присущи и плагину DKIMrep.

Заключение

Я постарался рассказать все, что смог узнать о DKIM верификации средствами Amavisd-new и SpamAssassin. Бесспорно, на текущий момент поддержка DKIM верификации реализована лишь частично, однако, сама технология имеет огромный потенциал. Уже в ближайших версиях SpamAssassin будут добавлены правила, позволяющие идентифицировать ADSP discardable, которая позволяет отправителям обеспечить однозначную идентификацию валидных сообщений и блокировку маскирующегося под них СПАМа на стороне получателей. Также я уверен, что будут развиваться системы, предоставляющие публичные списки репутаций отправителей, выполняющих DKIM подписание сообщений. Пока же я предлагаю Вам начать тестирование технологии DKIM и по возможности делиться с общественностью своими наработками, а также принять участие в обсуждении этой статьи на форуме OpenNET. Мне интересны любые замечания, комментарии и рекомендации.

Понравилась статья?

 Подпишитесь на RSS или почтовую рассылку

 Присоединиться в Twitter, Facebook или Google+

 Поделитесь ссылкой в социальной сети или блоге

Один комментарий к «FreeBSD: DKIM верификация средствами Amavisd-new и SpamAssassin»

  1. В течение прошлой недели (точную дату я не знаю) в коллекцию портов FreeBSD был добавлен SpamAssassin версии 3.3.0, который поддерживает правила, позволяющие более гибко менять оценки, выставляемые сообщениям, содержащим сигнатуры DKIM. Полный список правил, поддерживаемых SpamAssassin версии 3.3.0 содержится в списке Tests Performed: v3.3.x.

Оставить комментарий