Implementace DKIM

Správa linuxového serveru: Implementace DKIM

DKIM je mechanismus pro zvýšení důvěryhodnosti e-mailů odesílaných z vašeho poštovního serveru. Jak funguje a jak jej zprovoznit, to se dozvíte v tomto dílu.

Připomínám, že poštovnímu serveru a otázkám s ním spojeným byly věnovány poslední čtyři díly seriálu. Pokud jste je nečetli, určitě se na ně podívejte – první dva díly (první díldruhý díl) se věnovaly převážně teorii, třetí díl tvořil praktický úvod do nastavení Postfixu, DNS a SPF, techniky určená ke zvýšení důvěryhodnosti e-mailů, na což naváže dnešní díl tématem DKIM, a konečně čtvrtý díl, který se věnoval nastavení Postfixu obecně a antispamové technice zvané greylisting.

DKIM

DKIM je zkratka pro DomainKeys Identified Mail, tedy pošta identifikovaná pomocí doménových klíčů. Jedná se o techniku ověření původu e-mailu (nebo, chcete-li, techniku zaručení se za odeslaný e-mail) pomocí asymetrického šifrování.

Asymetrické šifrování

Symetrické šifrování asi každý zná, máte algoritmus, klíč a nešifrovaná data. Šifrovacímu algoritmu předáte klíč a nešifrovaná data, načež on vám vyprodukuje zašifrovaná data. K dešifrování použijete stejný algoritmus (v módu dešifrování) a stejný klíč.

Asymetrické šifrování nevyužívá jeden klíč, ale dva klíče (přesněji pár klíčů), jejichž zásadní vlastností je to, že co zašifrujete jedním klíčem, rozšifrujete pouze tím druhým. Asymetrického šifrování se využívá v mnoha oblastech, včetně kupříkladu oblasti digitálních podpisů.

Digitální podepisování funguje tak, že si vygenerujete pár klíčů, z toho jeden (veřejný) klíč zveřejníte a druhý (soukromý) si chráníte. Z dat, která podepisujete, se spočítá hash, který se následně zašifruje vaším soukromým klíčem. Všichni, kteří mají k dispozici váš veřejný klíč, mohou daný hash dešifrovat, spočítat si hash podepsaných dat a jejich porovnáním zjistit, jestli jsou data stejná nebo zda nebyla pozměněna. Tyto postupy jsou samozřejmě zautomatizované.

Fungování DKIM

DKIM je v podstatě systém digitálního podepisování zpráv na úrovni serveru, a to pro každou z obsluhovaných domén. Ověřením tohoto podpisu si může kterýkoliv jiný poštovní server ověřit, že zpráva pochází skutečně ze serveru autorizovaného pro odesílání pošty z dané domény. Tato technika, spolu se SPF, umožňuje přidat vaší poště na důvěryhodnosti. Samozřejmě pouze u těch serverů, které provádí příslušná ověřování (SPF či DKIM).

Zprovoznění DKIM

Zprovoznění DKIM představuje následující kroky:

  1. instalace DKIM filtru

  2. vygenerování klíčů pro domény

  3. úprava DNS záznamů

  4. nastavení DKIM filtru

  5. nastavení Postfixu

Instalace DKIM filtru

Samotná instalace představuje instalaci balíku dkim-filter, což v Debianu provedete takto:

aptitude install dkim-filter
Vygenerování doménových klíčů

Jelikož DKIM nemá v Debianu připraveno úložiště klíčů v /etc, je třeba nějaké vytvořit, např.:

mkdir -p /etc/dkim/keys
cd /etc/dkim/keys

Následně vygenerujte klíče pro každou doménu:

mkdir -p /etc/dkim/keys/example.com
cd /etc/dkim/keys/example.com
dkim-genkey -b 1024 -d example.com

Parametr -b udává délku generovaného RSA klíče, přípustné hodnoty jsou mezi 512 a 2048 bitů. Doporučená hodnota je 1024. Parametr -d udává doménu, pro kterou má být pár klíčů generovaný.

Parametr -s určuje tzv. selektor, který vám umožňuje přiřadit více klíčů jedné doméně, pokaždé s odlišným selektorem). Výchozím selektorem je default. Klíč určený k podepisování (soukromý klíč) se uloží do souboru selektor.private v aktuálním adresáři, veřejný klíč pak do souboru selektor.txt. Není tedy od věci pro každou doménu vyhradit specifický podadresář, tak, jak je naznačeno výše.

Úprava DNS záznamů

Aby si ostatní poštovní servery mohly podpisy ověřovat, je třeba umístit veřejné klíče na nějaké veřejně dostupné a důvěryhodné místo. Stejně jako v případě SPF i DKIM využívá DNS, konkrétně pak TXT záznamů. Samotný DNS záznam nemusíte nijak tvořit, stačí jej zkopírovat ze souboru selektor.txt. Pro představu, příslušný záznam vypadá např. takto:

default._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC65bMhv0ACIGOzAT4uXbGC3dKo5opmtnnIASUFbsmA8qiFjjUO+fZQrOI3UiUx0laPANnarGn+caTv7jdJAS+dhpCIvA4zUixIDk0opm+Xv6IeSZ9SyVLGkE7+Jtos0He5+h3lVRz/GqbJLAR5yvgXyn7nzC7cGebjfOgCbeBADwIDAQAB" ; ----- DKIM default for example.com

Povšimněte si selektoru, který má hodnotu default (hned na začátku řádku).

Nastavení DKIM filtru

Nejprve je třeba démonovi říci, jaké domény má obsluhovat. Toho docílíte vytvořením souboru s vhodně formátovaným seznamem, který může vypadat třeba takto:

*@example.cz:example.cz:/etc/dkim/keys/example.cz/default.private
*@example.com:example.com:/etc/dkim/keys/example.com/default.private

Jak je vidět, na každém řádku je záznam pro jeden klíč, parametry jsou celkem tři a jsou odděleny dvojtečkou. Prvním parametrem je vzor odesílatele (hvězdička funguje jako zástupný znak pro nula nebo více znaků), druhým pak doména, pro kterou bude podepisováno, a třetím parametrem je umístění souboru s klíčem. Kam tento konfigurační soubor umístíte nebo jak ho pojmenujete, je v zásadě jedno. V souladu s příkladem výše by mohl být umístěn v /etc/dkim/dkim-keys.conf.

Podstatné je, abyste o tomto souboru řekli DKIM filtru – upravte tedy soubor /etc/dkim-filter.conf, kam přidejte následující řádek:

KeyList /etc/dkim/dkim-keys.conf

Pokud jste výše uvedený soubor se seznamem domén pojmenovali jinak, upravte parametr direktivy KeyListtak, aby odpovídal absolutní cestě k tomuto souboru.

Dalším krokem je nastavení portu, na kterém bude DKIM filtr naslouchat. Upravte soubor /etc/default/dkim-filter a vložte nebo odkomentujte a upravte stávající záznam podle následujícího vzoru:

SOCKET="inet:8891@localhost"

Tento řádek, jak je asi jasné, nastaví DKIM k poslechu na portu 8891. Chcete-li použít jiný port, samozřejmě můžete.

Následně DKIM filtr restartujte:

/etc/init.d/dkim-filter restart

A přesvědčte se, že běží, a to na správném portu:

netstat -tlpn | grep 8891
Nastavení Postfixu

Do /etc/postfix/main.cf umístěte následující řádky:

milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891

První řádek nastavuje chování Postfixu v případě, že je filtr nedostupný: accept zařídí, že se e-mail zpracuje, jako kdyby nebyl nastaven žádný filtr. Druhý řádek nastavuje typ protokolu, zbylé dva řádky definují seznamy filtrů pro poštu, která dorazí buď pomocí SMTP démona, nebo jiným způsobem.

Následně řekněte Postfixu, aby znovu načetl konfiguraci:

/etc/init.d/postfix reload

Otestování funkce DKIM

Nejjednodušším způsobem otestování funkce DKIM je odeslat e-mail s odesílatelem odpovídajícím specifikovanému vzoru (nejspíše příslušné doméně). To můžete provést, jste-li přes SSH připojeni k serveru, třeba takto:

telnet localhost 25

Tím se připojíte na místní poštovní server. Dle SMTP protokolu byste měli zadat následující příkazy:

EHLO localhost
MAIL FROM: root@example.com
RCPT TO: root@localhost
DATA
Subject: DKIM test

.

Následně zkontrolujte poštovní schránku, kam vám chodí pošta pro roota, a ověřte, že se v e-mailu nachází DKIM podpis – ten může vypadat třeba takto:

DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=example.com;
        s=example.com.private; t=1335887965;
        bh=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN/XKdLCPjaYaY=;
        h=Message-Id:Date:From:To;
        b=O+LTeP0rfmUn9nnvsIyXY6uiaGi8wPt4/6myFoxWmeY8ivHMNdlbi+lZvQ2EkhaUG
         f8T8zbzYY5/4GQdMF+F/N5mzcnFi8XmdgIoVWggpXnARuh+M1p4ui+VbUoi6DJGP/w
         Grj7F78QdLXrFb8D3cV3q+yYFJ4RQpjMavhh/gxk=

Tento test vám ale neřekne, jestli jsou jiné servery schopny za pomoci doménových záznamů tento podpis ověřit. Nejjednodušší je asi použít některý z mnoha online nástrojů, které k tomuto účelu slouží. Ty naleznete buď pomocí vyhledávače, nebo v komentářích pod jedním z odkazovaných článků.