15 Август 2016

Контроль работоспособности проверки DKIM в Spamassassin

Checking DKIM control function in Spamasassin

Title: Контроль работоспособности проверки DKIM в Spamassassin Content: В ходе попытки разобраться с одной из проблем коллеги всплыл интересный момент связанный с работой модуля проверки DKIM в пакете защиты от спама Spamassassin.

В расшифровке начисления Spamassassin баллов входящему письму была замечена строка T_DKIM_INVALID DKIM Signature header exists but is not valid. Несмотря на то, что DKIM подпись у письма была и была корректной, о чём можно было сделать вывод, например, из лога Exim.

Aug 14 17:47:54 beta exim[12783]: 1bYxdi-0003KB-JT DKIM: d=gb2bel.ru s=mail c=relaxed/simple a=rsa-sha256 b=1024 t=1471189673 [verification succeeded]

В попытке разобраться что же не понравилось антиспам-системе путём отладочной проверки тестового письма была замечена ошибка.

root@beta:/ # spamassassin -D < /path/to/testemail.msg
...
авг 14 19:55:59.319 [29569] dbg: dkim: cannot load Mail::DKIM module, DKIM checks disabled: Can't locate Crypt/OpenSSL/RSA.pm in @INC (you may need to install the Crypt::OpenSSL::RSA module) (@INC contains: /var/db/spamassassin/compiled/5.020/3.004001 /var/db/spamassassin/compiled/5.020/3.004001/auto lib /usr/local/lib/perl5/site_perl /usr/local/lib/perl5/site_perl/mach/5.20 /usr/local/lib/perl5/5.20/mach /usr/local/lib/perl5/5.20 /usr/local/lib/perl5/site_perl/5.20 /usr/local/lib/perl5/site_perl/5.20/mach) at /usr/local/lib/perl5/site_perl/Mail/DKIM/PublicKey.pm line 333.
авг 14 19:55:59.319 [29569] dbg: dkim: [...] BEGIN failed--compilation aborted at /usr/local/lib/perl5/site_perl/Mail/DKIM/PublicKey.pm line 333.
авг 14 19:55:59.320 [29569] dbg: dkim: [...] Compilation failed in require at /usr/local/lib/perl5/site_perl/Mail/DKIM/Signature.pm line 13.
авг 14 19:55:59.320 [29569] dbg: dkim: [...] BEGIN failed--compilation aborted at /usr/local/lib/perl5/site_perl/Mail/DKIM/Signature.pm line 13.
авг 14 19:55:59.320 [29569] dbg: dkim: [...] Compilation failed in require at /usr/local/lib/perl5/site_perl/Mail/DKIM/Verifier.pm line 13.
авг 14 19:55:59.320 [29569] dbg: dkim: [...] BEGIN failed--compilation aborted at /usr/local/lib/perl5/site_perl/Mail/DKIM/Verifier.pm line 13.
авг 14 19:55:59.320 [29569] dbg: dkim: [...] Compilation failed in require at /usr/local/lib/perl5/site_perl/Mail/SpamAssassin/Plugin/DKIM.pm line 648.
...

Модуль, ответственный за проверку DKIM - DKIM.pm не мог найти связанный модуль крипографии Crypt::OpenSSL::RSA который имеется в портах FreeBSD под именем p5-Crypt-OpenSSL-RSA.

Вывод списка установленных этим пакетом файлов прояснил картину.

# pkg info -l p5-Crypt-OpenSSL-RSA
p5-Crypt-OpenSSL-RSA-0.28_1:
        /usr/local/lib/perl5/site_perl/mach/5.18/Crypt/OpenSSL/RSA.pm
        /usr/local/lib/perl5/site_perl/mach/5.18/auto/Crypt/OpenSSL/RSA/RSA.so
        /usr/local/lib/perl5/site_perl/mach/5.18/auto/Crypt/OpenSSL/RSA/autosplit.ix
        /usr/local/lib/perl5/site_perl/mach/5.18/auto/Crypt/OpenSSL/RSA/get_key_parameters.al
        /usr/local/lib/perl5/site_perl/mach/5.18/auto/Crypt/OpenSSL/RSA/import_random_seed.al
        /usr/local/lib/perl5/site_perl/mach/5.18/auto/Crypt/OpenSSL/RSA/new_key_from_parameters.al
        /usr/local/lib/perl5/site_perl/mach/5.18/auto/Crypt/OpenSSL/RSA/new_public_key.al
        /usr/local/lib/perl5/site_perl/man/man3/Crypt::OpenSSL::RSA.3.gz

Требуемый RSA.pm был установлен в каталогии старой версии Perl - 5.18, в то время как базовой версией по умолчанию для сборки в данной системе является 5.20

root@beta:/ # cat /usr/ports/Mk/bsd.default-versions.mk | grep PERL5_
PERL5_DEFAULT?=         5.20
.elif !defined(PERL5_DEFAULT)
.if !defined(_PERL5_FROM_BIN)
_PERL5_FROM_BIN!=       perl -e 'printf "%vd\n", $$^V;'
_EXPORTED_VARS+=        _PERL5_FROM_BIN
PERL5_DEFAULT:=         ${_PERL5_FROM_BIN:R}

Вероятно, при процессе перехода на текущую версию Perl в силу каких-то причин порт p5-Crypt-OpenSSL-RSA не был успешно пересобран.

Для того, чтобы поправить эту проблему достаточно его удалить и собрать по-новой.

root@beta:/ # pkg delete -fy p5-Crypt-OpenSSL-RSA &&  pkg install p5-Crypt-OpenSSL-RSA

Не забыв после этого, конечно же, перекомпилировать бинарные обработчики Spamassassin (в случае, если они используются) и перезапустить демона.

root@beta:/ # sa-compile
...
root@beta:/ # service sa-spamd restart
Stopping spamd.
Waiting for PIDS: 30492.
Starting spamd.

Проблема решена!

Рекомендую вам обратить внимание на наличие в ваших отчётах от Spamassassin строки T_DKIM_INVALID которая, как выяснилось, однозначно говорит о неработающем модуле DKIM.