Postfix a SPF kontrola pomocí policyd-spf-perl

30.10.2014

V jednom z předchozích článků jsme si ukázali, jak vytvořit SPF záznam pro doménu, kterou spravujeme, abychom dali vědět světu, které servery jsou oprávněné posílat z naší domény emaily.

V tomto článku si ukážeme, jak postupovat, pokud chceme naučit Postfix tyto záznamy využívat, přijímá-li emaily k doručení pro naší doménu.

U dřívějších verzí CentOSu a jiných distribucí je několik různých typů sw pro řešení tohoto cíle, zatímco u CentOSu ve verzi 7 je nejspíše nejsnazší a nejsystémovější cestou níže popsaná, která je samozřejmě u jiných distribucí také možná. (Software, který instaluji na své servery by měl splňovat kromě jiných věcí tu zásadu, že by měl být snadno upgradovatelný - tedy měl by být instalovatelný z balíků ve standardních repozitářích, či z balíků z repozitářů prověřených. Pokud je tato zásada porušena doporučuji si najít způsob, jak se dozvědět o existenci updatů daného software tak, abyste jej udrželi aktuální.

Pro CentOS 7 jsem zvolil script v perlu, který se jmenuje postfix-policyd-spf-perl.

Definice ATrpms repozitáře

Poněvadž budeme potřebovat nainstalovat balík, který není obsažen ani ve standarních repozitářich CentOSu nebo EPELu, přidáme další repozitář ATrpms. Neprve naimportujeme PGP klíč:

rpm --import http://packages.atrpms.net/RPM-GPG-KEY.atrpms

a dále vytvoříme soubor /etc/yum/repos.d/atrpm.repo s následujícím obsahem:

[atrpms]
name=Fedora Core $releasever - $basearch - ATrpms
baseurl=http://dl.atrpms.net/el$releasever-$basearch/atrpms/stable
gpgkey=http://ATrpms.net/RPM-GPG-KEY.atrpms
gpgcheck=1

Instalace balíků

Vlastní instalaci potřebných balíků provedeme příkazem:

yum install perl-Mail-SPF perl-Sys-Syslog perl-Sys-Hostname-Long

přičemž odsouhlasíme instalaci dalších z důvodu závislostí. (ATrpms repozitář jsme vytářeli kvůli poslednímu balíku.)

Stažení a instalace archívu se scriptem postfix-policyd-spf-perl

Bohužel tento script se nenachází (v době psaní článku) v žádném RPM repozitáři a tudíž jej musíme stáhnout přímo od zdroje jako tarball (zdroj je https://launchpad.net/postfix-policyd-spf-perl/trunk/).

Doporučuji, abyste si na URL zdroje našli aktuální verzi. V tuto chvíli je to verze 2.0.10:

wget https://launchpad.net/postfix-policyd-spf-perl/trunk/release2.010/+download/postfix-policyd-spf-perl-2.010.tar.gz

Tarball obsahuje kromě zmíněného scriptu v perlu (jeden soubor) ještě návod, který je zde ale přetlumočen. Script zkopírujte do adresáře /usr/local/lib jako soubor se jménem policyd-spf-perl.

To je celá instalace. Samotný script se nijak nekonfiguruje, tudíž můžeme přistoupit ke konfiguraci Postfixu.

Konfigurace Postfixu

Na konec souboru /etc/postfix/master.cf přidáme řádky:

policy  unix  -       n       n       -       0       spawn    
            user=nobody argv=/usr/local/lib/policyd-spf-perl

a na konec souboru /etc/postfix/main.cf:

smtpd_recipient_restrictions =
        reject_unauth_destination
        check_policy_service unix:private/policy

policy_time_limit = 3600

Tim je konfigurace dokončena a můžeme restartovat Postfix:

systemctl restart postfix.service

Pro jistotu zkontrolujeme v logu, zda se Postfix správně nastartoval a můžeme otestovat, zda vše funguje tak, jak má.

Případ, kdy výsledek SPF checku je ambivalentní a email je doručen

Kontrolu můžeme učinit několika způsoby, zvolíme například softwarově nejjednodušší pomocí telnetu na TCP port 25 (port SMTP služby, kde naslouchá Postfix) Zadávané příkazy jsem zvýraznil boldem a italicou. Telnet můžete provést z libovolného počítače s přístupem na Internet a server.domena.cz je server, kde jste konfigurovali Postfix podle tohoto článku. Uživatel “user” na konfigurovaném serveru musí existovat, pokud chcete kontrolu provést (jinak budete odmítnuti z důvodu neexistence uživatele).

user@client:~$ host -t MX domena.cz
domena.cz mail is handled by 10 server.domena.cz.

user@client:~$ telnet server.domena.cz 25
Trying 22.22.22.222...
Connected to server.domena.cz.
Escape character is '^]'.
220 server.domena.cz ESMTP
ehlo mx1.seznam.cz
250-server.domena.cz
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from: user@seznam.cz
250 2.1.0 Ok
rcpt to: user@domena.cz
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
Subject: Pokus jako ze seznamu
Pokusny email, ktery by mel mit v hlavickach, ze nebyl poslan ze serveru v SPF zaznamu.

.
250 2.0.0 Ok: queued as B831F10DB3A2

Na serveru by se uživateli, kterému jste takto poslali email, měl v příchozí poště objevit email s hlavičkou podobnou této:

Received-SPF: neutral (seznam.cz: Domain does not state whether sender is authorized to use 'user@seznam.cz' in 'mfrom' identity (mechanism '?all' matched)) receiver=server; identity=mailfrom; envelope-from="user@seznam.cz"; helo=mx1.seznam.cz; client-ip=23.65.77.87

Výsledek neutral jsme obdrželi proto, že seznam má ve svém SPF záznamu:

user@client:~$ host -t TXT seznam.cz
seznam.cz descriptive text "v=spf1 mx ip4:77.75.72.0/23 ip4:77.75.76.0/23 ?all"

přičemž v SPF “mx” znamená, že korektně odcházejí emaily ze seznamu ze serverů, které jsou v DNS MX RR, dále “ip4” specifikuje to samé pro konkrétní subsítě nebo IP adresy a “?all” říká, že o správnosti odesilatele nemůže nic říci. Což je velmi měkké pravidlo. Pokud by “all” bylo uvozene “-”, znamenalo by to reject, tedy že email nepochází ze správného odesílacího serveru seznamu (nicméně mají zřejmě provozní důvody pro měkčí politiku).

Případ, kdy výsledek SPF checku je negativní a doručení není umožněno

Pokud bychom chtěli vyzkoušet chování s rejectem jako výsledkem kontroly, pak můžeme podobně simulovat odeslání emailu z MX serveru microsoftu, který má v SPF záznamu pro doménu microsoft.com na konci “-all”. Vidíme, že reakce je odlišná:

user@client:~$ telnet server.domena.cz 25
Trying 22.22.22.222...
Connected to server.domena.cz.
Escape character is '^]'.
220 server.domena.cz ESMTP
ehlo microsoft-com.mail.protection.outlook.com
250-server.domena.cz
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from: profor@microsoft.com
250 2.1.0 Ok
rcpt to: user@domena.cz
450 4.7.1 <user@domena.cz>: Recipient address rejected: SPF-Result=microsoft-com.mail.protection.outlook.com: 'SERVFAIL' error on DNS 'TXT' lookup of 'microsoft-com.mail.protection.outlook.com'

Pokud bychom v EHLO příkazu uvedli microsoft.com, pak by chování bylo opět jiné:

550 5.7.1 <user@domena.cz>: Recipient address rejected: Please see http://www.openspf.net/Why?s=helo;id=microsoft.com;ip=23.65.77.87;r=server

což je přesně to, co potřebujeme.

Případ, kdy výsledek SPF checku je pozitivní a email je doručen

Pokud máme na serveru, který má v SPF záznamu nějaké domény pro tuto doménu povoleno odesílání emailů, pak z něj můžeme odeslat na náš server testovací email a zjistit, zda bude korektně doručen. Pokud ano, v emailu bude hlavička s podobným obsahem:

Received-SPF: pass (seznam.cz: 77.75.76.123 is authorized to use 'user@seznam.cz' in 'mfrom' identity (mechanism 'ip4:77.75.76.0/23' matched)) receiver=server; identity=mailfrom; envelope-from="user@seznam.cz"; helo=mxf2.seznam.cz; client-ip=77.75.76.123

Protože seznam má navíc u odchozích serverů zaveden DKIM, tak pro zajímavost můžeme uvést ještě DKIM hlavičky s kontrolou naším serverem “server.domena.cz”:

Authentication-Results: server.domena.cz; dkim=pass
        reason="1024-bit key; unprotected key/testing"
        header.d=seznam.cz header.i=@seznam.cz header.b=RH0eGnmc;
        dkim-adsp=pass
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=seznam.cz; s=beta;
        t=1414643489; bh=0YGKntba0zjkXNkf8HDMEI+RAi+ZcIR60m1tEuR2OW4=;
        h=Received:From:To:Subject:Date:Message-Id:Mime-Version:X-Mailer:
         Content-Type;
        b=RH0eGnmc9l1gu6hyExlHT1UjY4sAiicubuz5OHjNdy4+zBJFniByekX4/8sjfDOBj
         CZ9G0IbeueirjRRnO1WuDZe3jX9kfQ2SE8Gr5Xf0DeDx7+udSdz1Z9YOTWMjIHnHF4
         argIVSPXd0ZpVd6QahYn6FJj5+fdbu5AgmKmZ9Vs=

ale to již tak úplně nepatří do tohoto článku.

Případ, kdy SPF neexistuje email je doručen

Posledním případem je neexistence SPF záznamu pro danou doménu, ze které se email odesílá. Jako příklad jsem si našel doménu eurotel.cz, která SPF záznam nemá.

Pokud podobným způsobem jako výše pošlu email, bude doručen s následující hlavičkou:

Received-SPF: none (eurotel.cz: No applicable sender policy available) receiver=server; identity=mailfrom; envelope-from="profor@eurotel.cz"; helo=eurotel.cz; client-ip=23.65.77.87

což je opět v pořádku.

Můžeme tedy konstatovat, že testy se zdařily pro různé typy chování.

  • obsah/bezpecnost/centos_spf_postfix.txt
  • Last modified: 2018/10/17 22:04
  • by profors