RMXF
Reverse MX Postfix 2 Filter
reject_bad_rmx
(c) 2004:2007 Elita rozanski@sergiusz.com

docs | src | download | pakiet debiana | changelog | copyright | TODO | www.4x4.kalisz.pl



1. Co to jest?
2. Jak to działa?
3. Jak go ustawić u siebie
4. Jak ustawić swój dns aby prawidłowo współpracował z hostem zabezpieczonym przez RMXF?
5. SPF dla poczty wychodzącej i smarthosta.
6. Zabezpieczenie zwrotek (Sign Envelope Sender).
7. Forward
8. Koncepcje, drafty, propozycje.
9. Jeden obraz znaczy więcej niż 1000 słów
10. Testy mxfiltra
11. Procmail
12. Spamassassin
13. Pliki


1. Co to jest?

Program jest filtrem pozwalającym na częściowe uwierzytelnienie nadawcy poczty. Filtrowanie polega na sprawdzaniu w obrębie sesji smtp czy list pochodzi z prawidłowego punktu zaznaczonego przez administartora domeny jako uprawnionego do wysyłania poczty.
Można to porównać w klasycznej poczcie do sprawdzania stempla pocztowego przed przyjęciem przesyłki czy adresat i kod pocztowy się zgadzają.


2. Jak to działa?

Do tej pory poczta przesyłana jest w następujący sposób:

sender@a.tld -(A)-> mail.a.tld -(B)-> mail.b.tld -(C)-> recipient@b.tld

Odcinek A jest autoryzowany przez pop-before-smtp, sasl itp.
Odcinek C jest autoryzowany przez pop3, imap itp.

Odcinek B nie jest wogóle autoryzowany.
Poniższy filtr pozwala na sprawdzenie wiarygodności nadawcy przez sprawdzenie czy host mail.a.tld jest wpisany jako nadawca dla domeny a.tld.
Kontorola odbywa się z chwilą gdy nadawca przedstawia się swoją domeną, (a.tld) filtr sprawdza czy: (poszczególne testy można włączać i wyłączać)

- istnieją rekordy zgodne z spf. Wynik filtru spf może być następujący:
  • ok: domena ma wpis spf i dał on wynik pozytywny (wiadomość jest przepuszczana)
  • false: domena ma wpis spf i dał on wynik negatywny (odrzucamy 550)
  • softfail: domena ma wpis spf i dał wynik softfail (przepuszcamy, ale znaczymy wiadomość)
  • unknown: domena nie ma wpisu spf, lub test dał wynik unknown (wiadomość przechodzi do dalszych testów, jeśli sa włączone)
    - istnieją rekordy zgodne z dmp
  • ok: domena ma wpis dmp i jest on pozytywny (wiadomość przechodzi)
  • false: domena ma wpis dmp i jest on negatywny (odrzucamy 550)
  • unknown: domena nie ma wpisu dmp (wiadomość przechodzi do dalszych testów)
    - istnieje rekord A dla domeny a.tld/24
  • ok: host nadawcy jest w 'okolicy' A (wiadomość przechodzi)
  • unknown: host nie jest w okolicy lub nie istnieje (wiadomość przechodzi do dalszych testów)
    - istnieje rekord MX dla domeny a.tld/24
  • ok: host nadawcy jest w 'okolicy' MX (wiadomość przechodzi)
  • unknown: host nie jest w okolicy lub nie istnieje (wiadomość przechodzi do dalszych testów)
    - domyślny wynik
  • zwracany jest domyślny wynik
    W przypadku błędu servera dns wiadomość jest wstrzymywana (450)


    3. Jak go ustawić u siebie?

    Filtr wymaga Postfix-a ze wsparciem dla check_policy_service i akcji PREPEND. Obecny oficjalny Postfix 2.1.x ma już wsparcie dla tego protokołu, chociaż można filtr stosować już od snapshotu eksperymantalnego 2.0-20040124 i oczywiście w wersjach 2.2.

    Tworzenie i instalacja:
    Linux:
    # make
    Freebsd:
    # make freebsd
    Instalacja:
    # cp mxfilter /usr/local/sbin
    
    Polecam narazie testy na jednym adresie:
    - tworzymy plik /etc/postfix/mxfilter.acl dostępny dla usera odpalającego filtr (proszę sprawdzić uprawnienia i chroot) wg przykładowego np:
    # ten adres będzie skanowany (dla unknown znakujemy poczte, ale dopuszczamy):
    
    rozanski@sergiusz.com	check	HMARK
    
    # reszta dla tej domeny sprawdzamy, ale dla 'unknown' leci 550
    
    @sergiusz.com	check
    
    # reszte domen docelowych pomijamy
    
    *	skip
    
    # składnia dla tego pliku jest w pakiecie
    
    Musimy jeszcze utworzyć plik /etc/postfix/mxfilter.cf zawiera on definicje z jakich filtrów chcemy korzystać i jaka jest domyślna akcja jeśli domena nie posiada żadnych wpisów (zgodnie z spf1 musi to być unknown "v=spf1 ?all" czyli '2')
    Gdy pliku nie ma filtr testuje tylko spf1 z "?all" dla unknown

    - do main.cf wstawiamy coś jak:
    smtpd_sender_restrictions = #wg uznania, do smaku
    
    smtpd_recipient_restrictions = 
    ### kontrola poprawności adresów
        reject_non_fqdn_sender, #adres nadawcy musi być poprawny
        reject_non_fqdn_recipient, #adres odbiorcy musi być poprawny
        reject_unknown_sender_domain, #wywalamy tych senderów bez wpisu w dns
        reject_unknown_recipient_domain, #jw. dla recipientów
    ### autoryzacja naszych klientów
        permin_mynetworks,
        permit_sasl_authenticated,
    ### delivery (tu spodziewamy się tylko prawidłowo skonfigurowanych serverów)
    # zły odbiorca
        reject_unauth_destination,
    # nieprawiłowy format helo
        reject_non_fqdn_hostname,
    # złe helo
        reject_invalid_hostname,
    # zły reverse-mx
        check_policy_service unix:private/mxfilter, #tu leci ten filter
    # host podany w helo nie istnieje (hard! ale powinno się wymagać)
        reject_unknown_hostname,
    # nadawca nie ma rev-dns (bardzo hard! ale tez powinno się wymagać)
        reject_unknown_client
    # i tu już mamy list w delivery jeśli wszystko jest ok.
    
    do master.cf:
    mxfilter  unix  -       n       n       -       -       spawn
        user=nobody argv=/usr/local/sbin/mxfilter
    
    ścieżka w argv oczywiście tam gdzie wgraliśmy filtr.

    Musimy jednocześnie pamiętać o włączeniu smtpd na porcie 587 (zgodnie z zaleceniami spf). Dotyczy to problemów związanych z przechwytywaniem ruchu z portu 25 na lokalny smtpd ze skanerem antywirusowym.

    do master.cf:
    587      inet  n       -       n       -       -       smtpd
    
    I restart postfixa:
    # postfix reload
    

    4. Jak ustawić swój dns aby prawidłowo współpracował z hostem zabezpieczonym przez RMXF?

    najlepiej zrób wpisy spf1 (w przykładzie zezwalamy na wysyłkę z całej klasy /24 w której stoją nasze mx-y i z 3 wyszczególnionych ip i zabraniamy pozostałym):
    a.tld.	TXT "v=spf1 mx/24 ip4:4.4.4.4 ip4:5.4.55.66 ip4:6.6.6.6 -all"
    
    a jeśli masz jeszcze domene a.com.tld wysyłającą to samo:
    a.com.tld.	TXT	"v=spf1 redirect=a.tld"
    
    lub:
    a.com.tld.	TXT	"v=spf1 include:a.tld -all"
    
    Tam gdzie możecie, to stosujcie wpisy ip4: ponieważ najmniej obciążają wasz server dns, bo nie wymagają dodatkowych zapytań.


    5. SPF dla poczty wychodzącej i smarthosta.

    Jest to specyficzna konfiguracja mxfiltra, pozwalająca na kontrolę poczty wychodzącej (w trybie relay).
    Spójrz na schemat przesyłania poczty umieszczony w punkcie 2. Ta konfiguracja sprawdza w punkcie A czy uda sie punkt B zanim użykownik załaduje swój cały email (możliwe że klika MB) na server.
    Mxfilter uruchamiany jest wtedy w taki sposób że sprawdza czy będziemy mogli wysłać pobierany list do zdalnego odbiorcy z punktu widzenia SPF, biorąc pod uwagę nasze wychodzące IP i adres nadawcy przesyłki.
    Mxfilter w tym trybie działa tylko wraz z uruchomionym SASL i sprawdza tylko prawidłowo zalogowanych użytkowników

    Konfiguracja:
    do pliku master.cf dodajemy server rmxf w trybie smarthost, podajemy tam nasze wyjściowe IP
    mxfiltersh unix  -       n       n       -       -       spawn
        user=nobody argv=/usr/local/sbin/mxfilter -sh 192.168.21.1
    
    w pliku main.cf:
    smtpd_recipient_restrictions =
        [...]
        permin_mynetworks,
        check_policy_service unix:private/mxfiltersh,
        permit_sasl_authenticated,
        [...]
    
    Mxfiltersh zignoruje wszelkie niezalogowane sesje (przepuszcza je do dalszych testów). Dla każdej zalogowanej sesji sprawdzi czy nasz host jest właściwy dla wysyłania poczty i jesli nie jest przesyłka zostanie odrzucona. Gdy wszystko jest w porządku email zostanie przepuszczony do następnej regułki (permit_sasl_authenticated), i tam wpuszczony. Oczywiście accesslist-a jest ignorowana w tym trybie.


    6. Zabezpieczenie zwrotek (Sign Envelope Sender).

    Pierwsza sugestia: obecnie stawiany system MUSI posiadać liste prawidłowych odbiorców poczty. Wszystkie mx-y muszą znać aktualną listę. Postfix jest wyposażony we wszystkie potrzebne ku temu narzędzia, zarówno w trybie local-delivery jak i mx-backup. Taka konfiguracja eliminuje wogóle problem double-bounced, więc tą kwestią nie będę się zajmował. Bez tej listy serwer staje się poprostu maszyną do mielenia zwrotek.

    Jak zabezpieczyć swój system pocztowy przed niechcianymi zwrotkami (bounce). W zwrotce nie ma przecież envelope-sendera więc sprawdzanie SPF nie na wiele się zda.
    Pomysł opiera się on na znakowaniu envelope-sendera specjalnym kluczem w technice SES (Sign Envelope Sender). Technika nie ma tu aż tak dużego znaczenia musi być tylko jednolita dla danego systemu pocztowego (więc również wszelkich mx-backupów, send-smarthostów itp.)

    Jak to działa?

    Każdy list MUSI być wysyłany za autoryzacją i MUSI być wysyłany przez nasz system pocztowy. Niedozwolone jest korzystanie z obcych smtp do rozsyłania poczty (co rówież jest wymogiem SPF). KAŻDY list wysyłany z autoryzacją SASL lub listy będącej ekwiwalentem mynetworks zostaje podpisany w polu envelope-sender specjaną sygnaturą domeny (DS), można potraktować to jak tymczasowy adres pocztowy, gdyż ma określoną administracyjnie ważność (np. 3 dni). Tą czynnością zajmuje się odpowiedni program uruchamiany przed autoryzacją (sign_auth_relay). Bardzo ważne jest aby podpisywanie nadawcy następowało tylko raz (jeśli droga listów w Waszym systemie prowadzi przez kilka serwerów). Znakowanie adresów prowadzimy więc tylko na styku mua-mta.
    Gdy list nie dotrze do odbiorcy zdalny system pocztowy może wygenerować zwrotkę zaadresowaną na ten tymczasowy adres. Taka przesyłka zostaje odebrana przez nasz system pocztowy. Zawiera ona puste pole envelope-sender i podpisane pole envelope-recipient (co traktujemy jako autoryzacje). Gdy recipient nie jest podpisany taki list możemy odrzucić, gdyż nie mógł się pojawić, gdy nie został wysłany przez nasz system. Tą czynność robi odpowiedni program (reject_unsigned_bounce). Proces instalacji opisany jest w pliku INSTALL-SIGN-BOUNCE


    7. Forward

    UWAGA!!! Ta część dokumentacji dotyczy implementowanej techniki zabezpieczania forwardu. I jest obecnie niedostepna.

    Aby umożliwić autoryzowany forward możemy zastosować podobną technike. Każdy użytkownik może wygenerowac sobie specjalny unikatowy adres email (prywatny) którego nigdzie nie będzie udostępniał i w każdej chwili będzie mógł go zmienić, gdyby został przechwycony. Ten adres będzie zapisany w bazie mta (i synchronizowany ze wszystkimi mx-backupami) oraz w odróżnieniu od podpisu zwrotek będzie bezterminowy. Specjalne narzędzie (np. list wysłany na adres user-signature@domain.tld, zautoryzowany sasl lub web-interface) umożliwi zmianę adresu i jego odczyt. Odpowiedni filtr (permit_auth_forwarders) wpuści list do systemu przepisując adres odbiorcy na właściwy.


    8. Koncepcje, drafty, propozycje.

    http://spf.pobox.com/
    http://www.pan-am.ca/dmp/draft-fecyk-dmp-01.txt
    http://www.ietf.org/internet-drafts/draft-danisch-dns-rr-smtp-03.txt


    9. Jeden obraz znaczy więcej niż 1000 słów

    (Obce adresy zniekształciłem)
    Feb  6 17:22:15 kamera postfix/mxfilter: 212.127.xx.250 st4gg.tvm.pl rozanski@sergiusz.com REJECT
    Feb  6 17:30:45 kamera postfix/mxfilter: 212.127.xx.250 7awicz.poczta.onet.pl robert@sergiusz.com REJECT
    Feb  6 17:33:44 kamera postfix/mxfilter: 212.127.xx.250 mp1etrus.interia.pl brent@sergiusz.com REJECT
    Feb  6 17:40:55 kamera postfix/mxfilter: 212.127.xx.250 ry--k.macsy.poczta.fm james@sergiusz.com REJECT
    Feb  6 17:55:14 kamera postfix/mxfilter: 212.127.xx.250 brent@sergiusz.com john@sergiusz.com REJECT
    Feb  6 17:57:12 kamera postfix/mxfilter: 212.127.xx.250 4ndrew.azpexim.com.pl bob@sergiusz.com REJECT
    Feb  6 18:03:40 kamera postfix/mxfilter: 212.127.xx.250 id.drweb.ru michael@sergiusz.com REJECT
    Feb  6 18:04:49 kamera postfix/mxfilter: 212.127.xx.250 st4n.onet.pl ted@sergiusz.com REJECT
    Feb  6 18:08:29 kamera postfix/mxfilter: 212.127.xx.250 k4si4~reep.poczta.onet.pl alice@sergiusz.com REJECT
    Feb  6 18:10:51 kamera postfix/mxfilter: 212.127.xx.250 fr3d.gazeta.pl dave@sergiusz.com REJECT
    Feb  6 18:16:07 kamera postfix/mxfilter: 212.127.xx.250 t3d.mks.com.pl dan@sergiusz.com REJECT
    Feb  6 18:16:33 kamera postfix/mxfilter: 212.127.xx.250 jo3.mobista.pl george@sergiusz.com REJECT
    Feb  6 18:18:38 kamera postfix/mxfilter: 212.127.xx.250 g0dry.yahoo.com matt@sergiusz.com REJECT
    Feb  6 18:19:57 kamera postfix/mxfilter: 212.127.xx.250 a1r4m.poczta.fm helen@sergiusz.com REJECT
    Feb  6 18:22:58 kamera postfix/mxfilter: 212.127.xx.250 j0hn.email.si tom@sergiusz.com REJECT
    Feb  6 18:24:43 kamera postfix/mxfilter: 212.127.xx.250 4nn4.czajen.pl ray@sergiusz.com REJECT
    Feb  6 18:26:23 kamera postfix/mxfilter: 212.127.xx.250 k3vin.mobista.pl jane@sergiusz.com REJECT
    Feb  6 18:33:05 kamera postfix/mxfilter: 212.127.xx.250 r4y.nullsoft.com julie@sergiusz.com REJECT
    Feb  6 18:36:30 kamera postfix/mxfilter: 212.127.xx.250 j0hn.garaze.com.pl kevin@sergiusz.com REJECT
    Feb  6 18:53:11 kamera postfix/mxfilter: 212.127.xx.250 j4mes.tlen.pl jimmy@sergiusz.com REJECT
    Feb  6 19:02:01 kamera postfix/mxfilter: 212.127.xx.250 ke3in.onet.pl david@sergiusz.com REJECT
    

    10. Testy mxfiltra

    Wywołując mxfilter z 'ręki' podając jako pierwszy i jedyny parametr adres email możemy sprawdzić przebieg mxfiltra. Mxfilter ignoruje w tym trybie wszelkie błędy nie wychodząc na pierwszym trafieniu. Przykład:
    $ mxfilter rozanski@sergiusz.com
    RMXF test: rozanski@sergiusz.com
    Test spf1:
    [answer level:1] mx ip4:195.205.84.133 include:comm.pl -all
    [mx+] 195.117.147.125/32
    [ip4+] 195.205.84.133/32
    [answer level:2] mx -all
    [mx+] 213.25.233.144/32
    [mx+] 80.53.181.242/32
    [all-] 0/0
    [all-] 0/0
    Test dmp:
    [+] sergiusz.com
    Test a:
    [+] 195.205.84.0/24
    Test mx:
    [mx+] 195.117.147.125/24
    $
    

    11. Procmail

    Instalacja w samym procmailu:
    .procmailrc:
    :0 f
    | /path/to/mxfilter --procmail
    
    Mxfilter w tym trybie próbuje na podstawie informacji zawartych w nagłówku poczty (return-path: (envelope-sender w nawiasach trójkątnych) i pierwszego received from: (adres IP w nawiasach kwardatowych)) wyznaczyć autoryzacje spf. Jedyną akcją są ustawione odpowiednio Received-SPF: w nagłówku, które można później wykorzystać do dalszego filtrowania.
    W tym trybie mxfilter ignoruje accessliste, czyta /etc/postfix/mxfilter.cf oraz ~/.mxfilter.cf (wyższy priorytet ma ten osobisty)
    Z konfiguracji uzywane są: test_spf,test_dmp,test_a,test_mx,default_result. Test helo jest pomijany.

    12. Spamassassin

    Manipulacje regułkami spamassassin na podstawie nagłówków z SPF (przykład):
    header NO_SPF   Received-SPF =~ /\bnone\b/i
    score NO_SPF    0.3
    header SOFTFAIL_SPF   Received-SPF =~ /\bsoftfail\b/i
    score SOFTFAIL_SPF    2.0
    

    13. Pliki

    docs
    src
    download
    changelog
    copyright
    TODO