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.
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
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.
Tweetštítky: DKIM linux perl postfix spam spamassassin
8403x přečteno
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ší. :)
Copyright © 2015-2024 SOCL.cz, RSS 2.0
Všechna práva vyhrazena, nebo tak nějak.