SOCL.cz
blog nejen o Internetu

DKIM, Spamassassin a T_DKIM_INVALID

publikováno 18. 2. 2015 v 19:46

Vítězoslavně jsem si na serveru zprovoznil DKIM (DomainKeys Identified Mail), přesněji implementaci OpenDKIM. Vytvořil jsem příslušné záznamy pro své domény a vložil je do DNS. Pro účely otestování jsem založil poštovní schránku u GMAIL.com, abych si mohl přes jejich webové rozhranní ověřit, zda je vše nastaveno korektně a zda jejich kontrola projde. Jaká byla má radost, když u GMAIL.com kontrola prošla, stejně tak DKIM Test dopadl výborně. Pak jsem ale narazil na zajímavý problém.

V poštovním klientovi Mozilla Thunderbird používám doplňek DKIM Verifier, který u přijatého e-mailu provede kontrolu v případě podepsaného e-mailu. Tedy hned vidím, zda zpráva obsahuje platný DKIM podpis. Funguje to bezvadně. Kontrolu DKIM v Thunderbirdu mám nasazenu doma i v práci, kde bych sice mohl používat Microsoft Outlook, ale prostě mi k srdci nijak nepřirostl. Tak fajn, pojďme si pokusně poslat e-mail do práce. A tady se objevil ten zajímavý problém - v případě, kdy jsem si poslal podepsaný e-mail z domu do práce, DKIM Verifier vyhodnotil korektně podepsaný e-mail, ale v hlavičce e-mailu bylo vidět, že Spamassassin s tím má problémy - test DKIM zobrazuje jako chybný - T_DKIM_INVALID. Nebudu vás napínat, problém byl v samotném Spamassassinu v práci.

Spamassassin Logo

Pořád jsem přemýšlel, jak zjistím, co se tomu Spamassassinu nelíbí. Začal jsem prohledávat diskusní fóra a po chvilce jsem nalezl cizojazyčné vlákno, kde někdo řeší stejný problém jako já. Jak tedy zjistit, co se děje uvnitř Spamassassinu? Prostým debugováním.

spamassassin -t -D dkim < mail.msg

Výstup příkazu:

bře 11 23:17:05.063 [16405] dbg: dkim: cannot load Mail::DKIM module, DKIM checks disabled: Can't locate Mail/DKIM/Verifier.pm in @INC (@INC contains: /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8) at /usr/lib/perl5/vendor_perl/5.8.8/Mail/SpamAssassin/Plugin/DKIM.pm line 584.

A máme našeho viníka - Perlu chyběl modul Mail::DKIM. Test DKIM tedy nebyl ve Spamassassinu vůbec proveden. Opravil jsem následovně:

perl -MCPAN -e shell 
install Mail::DKIM

Pak stačilo už jen restartovat Spamassassin a záhada byla vyřešena. Další e-mail už byl skutečně zkontrolován a kontrolou prošel:

X-Spam-Status: No, score=-0.1 required=5.0 tests=DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_PASS
  autolearn=unavailable autolearn_force=no version=3.4.0

Dvojí podepsání e-mailu DKIM podpisem

Jeden problém se vyřešil a hned jsem zaregistroval další, který tam sice byl od prvopočátku, ale já si jej prostě nevšiml - dvojí DKIM-Signature:

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=socl.cz; s=default;
	t=1399192286; bh=rr8BWRFU74x2OgLuCKTGYLRY3p8+5O76m4ZAnU9voeo=;
	h=Date:From:To:Subject;
	b=bAYVdcS9RpJUpcLZGZ6EQepAJ7kHl8J41oXX3liOhdLj6Y+N/pAMnIBe79DXGiI+w
	 BdjAKCcP8oU9hvwXVfSIALATIT/fXWyFPsZSVQ3V0jCLTs6JekOEcJ2WzS6jtc2rjh
	 3dVAAw24ANnsHcpIwqpY4MPVdmP2SGUZPvMVqvMo=
X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on mail.spamassassin.cz
X-Spam-Level: 
X-Spam-Status: No, score=-1.1 required=5.0 tests=ALL_TRUSTED,DKIM_SIGNED,
	DKIM_VALID,DKIM_VALID_AU autolearn=unavailable autolearn_force=no
	version=3.4.0
Received: from [IPv6:***] (unknown [IPv6:***])
	by mail.spamassassin.cz (Postfix) with ESMTPS id D08868145C
	for <***@socl.cz>; Sun,  4 May 2014 10:31:23 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=socl.cz; s=default;
	t=1399192283; bh=rr8BWRFU74x2OgLuCKTGYLRY3p8+5O76m4ZAnU9voeo=;
	h=Date:From:To:Subject;
	b=XnmlsBvrvpi95sIodgd4guDQQmDQfjEFGvuEwpHkQFWz0Z4LE9CUff5Ed87XVbgnL
	 +IHC52wY+S4VOqzmw63COLzV2jxkcMNvcDIzhMONoBp9HnoDeCTtW3hA1/VKrjPRxZ
	 vMUFF++CPodVku7pUOH8xXj1AwoOyfAWdmGSRy5k=

Dochází k tomu, protože k filtrování obsahu používám Spamassassin. Snažil jsem se to nějak vyřešit přímo v Postfixu, ale nepodařilo se mi to. Bádal jsem nad tím opravdu dlouho a alespoň k něčemu to bylo - pronikl jsem trošku více do tajů fungování Postfixu. Vřele doporučuji na dlouhé zimní večery. :-)

Jak tedy problém vyřešit? To méně "dobré" řešení je úprava Postfixu:

main.cf
# OpenDKIM
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

master.cf
smtp      inet  n       -       n       -       -       smtpd
 -o receive_override_options=no_milters
 -o content_filter=spamassassin

Díky tomuto nastavení nebude docházet k dvojímu podepisování, ale bude docházet k tomu, že kontrola Spamassassinu u e-mailů, které odesíláte, bude obsahovat v hlavičce chybu DKIM_ADSP_ALL, protože v době kontroly obsahu nebude ještě zpráva podepsána a já mám u všech svých domén nastavenu podpisovou politiku tak, že všechny e-maily by měly být podepsány. Což příliš nevadí, protože následně z pohledu přijímající strany někde v Internetu už bude zpráva správně podepsána pomocí OpenDKIM mechanismu.

X-Spam-Status: No, score=0.1 required=5.0 tests=ALL_TRUSTED,DKIM_ADSP_ALL
  autolearn=no autolearn_force=no version=3.4.0

Mnohem lepší řešení je přímo v nastavení opendkim.conf. Stačí nastavit následující:

opendkim.conf
RemoveOldSignatures   Yes

main.cf
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

master.cf
smtp      inet  n       -       n       -       -       smtpd
 -o content_filter=spamassassin

Jednoduché, elegantní a hlavně plně funkční řešení. V době, kdy se na podpis DKIM bude klást velký důraz (viz zpřísnění antispamové politiky u Seznam.cz), se hodí mít toto v pořádku.

štítky: DKIM linux perl postfix spam spamassassin
8027x přečteno

Komentáře k článku (3)

13. 5. 2015 v 13:43 Jan napsal(a)
Super prace, dekuju moc, oba problemy diky Vam vyreseny behem chvilicky. Ale zato opsat captchu... :)

14. 5. 2015 v 8:39 Martin napsal(a)
Jan: Jsem rád, že článek pomohl. A ta captcha je asi občas fakt těžká. :-)

3. 12. 2016 v 12:01 Martin napsal(a)
Jan: Captchu jsem předělal, protože jsem od té staré, hůře čitelné, ztratil zdrojáky a na serveru byla jen zkompilovaná verze PHP skriptu. Snad je to teď lepší. :)


Přidejte komentář
Vaše jméno/přezdívka: (max 40 znaků)

Web: (nepovinné, zadejte s http(s)://, max 100 znaků)

Opiště sekvenci znaků:

captcha!

Zde napište komentář: (max 512 znaků)

Copyright © 2015-2024 SOCL.cz, RSS 2.0 RSS kanál blogu
Všechna práva vyhrazena, nebo tak nějak.

WEDOS BANNER