Obrana proti SPAMu (Implementace SPF a DKIM)

10. dubna 2015

Je všeobecne známe, že veľkú väčšinu zaslaných e-mailových správ tvorí spam (hlavne z botnetov). Samotný SMTP protokol umožňuje odoslať e-mail s ľubovoľnou zdrojovou adresou, čo sa využíva na odosielanie spamu a phishingu, pretože identita útočníkov ostáva skrytá. Nepríjemné sa to pre držiteľov domén stáva v momente, kedy je ich identita v maily obdobného typu využitá. Okrem toho, že spam ľudí v schránkach otravuje, môže užívateľov poškodiť a zahlcuje SMTP servery. Obrana však existuje. A to buď na základe kontroly pôvodu správy (Sender Policy Framework), alebo na základe analýzy obsahu správy (DomainKeys Identified Mail). Dôležité je však implementovať obranu ako na strane odosielateľa, tak na strane prijímateľa.

Sender Policy Framework
V takmer všetkých falošných e-mailových správach je adresa odosielateľa podvrhnutá. Jeden zo spôsobov ako tomu zabrániť spočíva v zahrnutí SPF (Sender Policy Framework) do DNS záznamov domény. SPF je otvorený štandard definovaný IETF v RFC 4408 a umožňuje určiť, ktoré zariadenia budú autorizované na odosielanie pošty s adresou danej domény v časti "MAIL FROM" a "HELO". Takto vložený záznam potom prijímateľ pošty môže overiť a pokiaľ pochádza z neautorizovaného zdroja, správu odmietne ešte pred tým ako telo správy príjme. Záznam SPF predstavuje jednoduchý string textu, ktorý môže vyzerať napríklad takto:

"v=spf1 +mx a:mail.nic.cz -all"

V uvedenom príklade mailový server poštu z danej domény príjme iba ak je poslaná z niektorého zo serverov uvedených v rámci MX záznamu (+mx), alebo zo serveru s IP adresou, na ktorú sa preloží A záznam pre mail.nic.cz (a:mail.nic.cz), avšak pošta z danej domény poslaná z inej IP adresy bude odmietnutá (-all).
Záznam v stringu je možné upraviť podľa potreby a definovať tak napríklad okrem iného mechanizmus odpovedí:
allall sa pridáva na koniec záznamu
includedefinuje ďalšie oprávnené domény napr. "v=spf1 include:mail.nic.cz include mail.csirt.cz -all"
aak nieje špecifikované inak odpovedá v prípade, že doménové meno má záznam typu A alebo AAAA, a to je rovnaké ako adresa odosielateľa
mxak má doménové meno MX záznam, ktorý odpovedá adrese odosielateľa, nastane zhoda
ptrak PTR záznam odpovedá aspoň jednému A záznamu, nastane zhoda
IPv4ak je odosielateľ v danom rozsahu IPv4 adries, nastane zhoda
IPv6ak je odosielateľ v danom rozsahu IPv6 adries, nastane zhoda
existsurčuje domény, ktoré sú vybrané ako výnimky. Tento mechanizmus je používaný iba zriedka.
Takmer každý ochranný mechanizmus však obsahuje aj určité obmedzenia. Pred vložením SPF záznamu do DNS je potrebné zhodnotiť najmä obmedzenia, ktoré môžu pre politiku odosielania pošty predstavovať. SPF záznam okrem toho, že z časti chráni doménu pred odosielaním falošných správ definuje tiež obmedzenia na zasielanie pošty a práve to často predstavuje prekážku pri jeho implementácií. Tiež je jasné, že tento evaluačný mechanizmus je závislý na DNS, takže v prípade napríklad podvrhnutia DNS záznamov sa stáva neúčinný.

Implementácia SPF kontroly na mailovom serveri
Na druhej strane je po zabezpečení nezasielania spamu z vašej domény nutné myslieť na to, aby mailový server takisto kontroloval SPF záznamy v príchodzej pošte. Pokiaľ nemáte vlastný mailový server, informujte sa u vášho prevádzkovateľa, či validáciu SPF záznamov vykonáva automaticky alebo je možné ju doplniť ako súčasť antispamovej obrany. Ako a či bude tento záznam na strane prijímateľa správy kontrolovaný záleží od prevádzkovateľa mailového serveru. V prípade, že disponujete vlastným mailovým serverom, prinášame stručný návod pre kontrolu týchto záznamov na Postfixe a mailovom serveri od Microsoftu.
Postfix
V Linuxových distribúciach je možné kontrolu SPF s Postfixom vykonávať programmi napísanými v Pythonu alebo Perlu. Podľa toho bude potom inštalácia vyzerať nasledovne:

sudo apt-get install postfix-policyd-spf-python

alebo

sudo apt-get install postfix-policyd-spf-perl

Následne je potrebné do /etc/postfix/main.cf pridať nasledovný riadok, ktorý zabráni time out-u kým bude správa spracovávaná: policy-spf_time_limit = 3600s
Do /etc/postfix/master.cf následne pridajte:
policy-spf unix - n n - - spawn
user=nobody argv=/usr/bin/policyd-spf
- v prípade, že ide o Perl:
policy-spf unix - n n - - spawn
user=nobody argv=/usr/sbin/postfix-policyd-spf-perl
Posledné, čo musíte nastaviť je smtpd_recipient_restrictions v /etc/postfix/main.cf:
smtpd_recipient_restrictions =
...
permit_sasl_authenticated
permit_mynetworks
reject_unauth_destination
check_policy_service unix:private/policy-spf
Potom, ako Postfix reštartujete vykonajte kontrolu logov, kde by ste mali vedieť záznamy o odmietnutí či podržaní e-mailu kvôli kontrole SPF. Viac informácií ohľadom nastavenia SPF v Postfixe nájdete napríklad na stránkach ubuntu.com alebo tu.
Ak používate mailový server od Microsoftu, v nástroji Edge transport server je SenderID nastavený defaultne. Keď mailový server správu prijme, tzv. Edge transport server sa začne dotazovať na DNS záznamy odosielateľa a zisťuje, či je IP adresa z ktorej správa prišla autorizovaná na odosielanie správy pre doménu, ktorá je špecifikovaná v hlavičke správy. Podľa toho ako tento evaluačný proces dopadne sa pre správu vygeneruje označenie ako napr. pass, fail, none a podobne. Viac informácie o SenderID nájdete tu.
V prípade, že máte iné mailové serveri, doporučujeme implementovať kontrol SPF podľa konkrétneho mailového servera.

DomainKeys Identified Mail
Kým SPF validuje položku "MAIL FROM " a "HELO", DKIM (DomainKeys Identified Mail) validuje obsah správy a je popísaný v štandarde RFC 6376. Táto metóda overenia tela správy umožňuje jej tvorcovi prebratie zodpovednosti za jej obsah a tak sa snaží výrazným spôsobom obmedziť počet spamov. Aj keď samotný spam nezastaví, v prípade plošného nasadenia by donútila spammerov spojiť obsah správy so správnou zdrojovou doménou. Do hlavičky e-mailu je možné vložiť položku DKIM-signature, ktorý zahŕňa v hlavičke správy položky "FROM" a "SUBJECT" a takisto zahŕňa telo správy tzv. "BODY". Prijímateľ správy sa tak dotazuje priamo na doménu odosielateľa a zisťuje, či sa podpis v správe zhoduje s verejným kľúčom uloženým v DNS zázname. Z toho vyplývajú dva procesy, ktoré sú súčasťou MTA (mail transfer agent). Podpísanie správy a jej následne overenie. Kým podpísanie je na strane pôvodcu správy t.j. organizácií, ktorá správu zasiela, proces overenia je na strane prijímateľa. Pre implementáciu DKIM je potrebné vygenerovať jeden pár kľúčov - verejný a súkromný. Súkromný kľúč sa nahraje na mailový server odosielateľa, ktorý bude odoslané správy podpisovať. Do DNS záznamov sa následne pridá jeden záznam obsahujúci policy RR a samotný verejný kľúč.

Implementácia DKIM na mailovom serveri
Ak DKIM záznamy majú byť kontrolované na príchodzej pošte, je potrebné túto kontrolu na mailovom serveri implementovať . Ak používate SpamAssasin pre povolenie na kontrolu DKIM záznamov na príchodzej pošte stačí v súbore local.pre odkomentovať nasledovný riadok (v posledných verziách je nastavený defaultne):

loadplugin Mail::SpamAssassin::Plugin::DKIM

Zároveň je potrebné nainštalovať balíček Perl programov, ktorý bude slúžiť ako DKIMProxy.

apt-get install libmail-dkim-perl

V prípade DKIM je potom potrebné definovať ako politiku pre odchádzajúce správy (DKIMproxy.out), tak pre mailové správy prichádzajúce (DKIMproxy.in). Defaultné scóre pre označenie podpísaných správ je pomerne nízke, pretože spammeri si pre zasielanie spamu môžu vytvoriť vlastnú doménu, kde DKIM implementujú. DKIMProxy bol primárne určený pre Postfix, ale mal by fungovať aj na iných mailových serveroch. Viac o nastaveniach DKIMProxy nájdete v manuály. Druhou možnosťou je tzv. OpenDKIM, ktorý implementuje ako služby DKIM, tak aplikáciu na báze "milter"(mail-filter) ktorá pracuje ako plug-in vo všetkých MTA, ktoré sú schopné ho rozoznať. V prípade, že príjemca a teda server/klient nevykonáva kontrolu DKIM, hlavičku s DKIM podpisom ignoruje a správu aj tak príjme. Preto implementácia DKIM prímateľa správy nijako neobmedzí, práve naopak, môže ho uistiť, že došlo k overeniu odosielateľovej domény. Vzhľadom k tomu, že ide o kontrolu DNS záznamov, implementácia DNSSECu je takisto na mieste. DNSSEC zaisťuje správnosť záznamov získaných z DNS a dodáva im tak dôveryhodnosť.