---
# System prepended metadata

title: Mechanizmy weryfikacji nadawcy wiadomości

---

# Mechanizmy weryfikacji nadawcy wiadomości

## SPF (Sender Policy Framework) ([RFC7208](https://tools.ietf.org/html/rfc7208))
Pozwala właścicielowi domeny zdefiniować adresy IP uprawnione do wysyłki maili. Sprawdzenie odbywa się na podstawie domeny obecnej w polu `MAIL FROM` wg. RFC5321(envelope) - `RFC5321.MailFrom`. Pole to jest też znane jako `Return-Path` czy `Envelope-Sender`. Jeśli `MailFrom` jest puste, tzw `null sender`, domena jest brana z komendy `HELO/EHLO`, tzw. `HELO identity`.

**Uwaga! SPF nie sprawdza pola From z nagłówka, tzw. `RFC5322.From`, które jest wyświetlane w klientach pocztowych, tylko `RFC5321.MailFrom`. SPF może przejść sprawdzenia poprawnie, nawet gdy pole From jest spoofowane.**

SPF jest definiowany w rekordzie TXT domeny która ma być chroniona. Serwer pocztowy który otrzymuje wiadomość, wysyła zapytanie o rekord dla domeny z pola `MAIL FROM (RFC5321.MailFrom)`, a następnie go analizuje.

Przykład rekordu dla `nask.pl`
```
dig txt nask.pl | grep v=spf1

nask.pl. 600 IN TXT "v=spf1 include:_spf.nask.pl include:_spf2.nask.pl     
ip4:195.187.245.33/24 ip4:193.59.201.32/27 ip4:193.59.201.64/27 
ip4:193.59.201.238/32 ip4:195.187.242.0/24 ip4:193.59.204.167/32 
ip4:194.181.0.106 ip4:194.181.0.102 ip4:195.187.6.28 -all"
```

Serwer pocztowy sprawdza czy adres IP klienta SMTP z którego został nadany, zawiera się na ostatecznej (po rozwiązaniu wszystkich składowych) liście dozwolnych adresów IP w rekordzie SPF.

#### Składowe rekordu SPF

* `v=spf1` - wersja SPF, jedyna obecnie wykorzystywana to 1 
* `ip4:192.168.0.1` - Adres IPv4 uprawniony do wysyłki
* `a:google.com` - Domena jest rozwiązywana i jej rekord A dodawany jako uprawniony IP do wysyłki
* `mx:google.com` - Rekordy A dla MX dla podanej domeny dodawne są jako IP uprawnione do wysyłki. Gdy użyte jest samo `mx` sprawdzany jest MX domeny dla której aktualnie weryfikowana jest polityka
* `include:google.com` - Domena z której rekord spf zostanie również uwzględniony - dodany do obecnie weryfikowanych

Na końcu rekordu definiowana jest akcja co ma się stać z mailem jeśli nie będzie pasował do polityki:

| Dyrektywa | Nazwa | Opis |
| -------- | -------- | -------- | 
| -all     | Fail     | Odrzuć     | 
| ~all     | Softfail     | Rekomenduj odrzucenie     | 
| +all     | Pass     | Akceptuj     | 
| ?all     | Neutral     | Nic nie sugeruj (Neutralne)     | 


**Uwaga** RFC w wielu miejscach mówi że coś powinno się robić, a nie że trzeba. Trzeba pamiętać że różne serwery pocztowe odbiorcy mogą różnie interpretować otrzymany rekord SPF. Np. wiele serwerów traktuje `-all` oraz `~all` tak samo.

Ograniczenia: Max długość rekordu to 255 znaków i max 10 rozwiązań domen ( występujące przy tagach: a, mx, ptr, include, exists), wliczając to rozwiązania rekursywne.

## DKIM (DomainKeys Identified Mail) ([RFC6376](https://tools.ietf.org/html/rfc6376))

Daje możliwość dodania do wiadomości podpisu (z body i wybranych pól nagłowka), który wykorzystując kryptografię asymetryczną może zostać zweryfikowany przez serwer odbiorcy za pomocą klucza publicznego z odpowiedniego rekordu DNS danej domeny. 

Podpis jest dodawany do nagłówka wiadomości jako pole `DKIM-Signature`, przykład:
```
DKIM-Signature: 
v=1; a=rsa-sha256; c=relaxed/relaxed; d=ncas.us-cert.gov; s=15q3; i=@ncas.us-cert.gov; h=Content-Transfer-Encoding:
Content-Type:x-subscriber:X-Accountcode:Errors-To:MIME-Version:
Message-ID:X-ReportingKey:Subject:Date:To:Reply-To:From; bh=bqWW
VsSFeYnMUseujsFFol8xU8ZRNz18EBcFtuxI91c=; b=hjQjcCOi/CzTr1STuUnN
digjN5gW2Wr81UR2CBKpwUV8MqYNlZV76YuGdX+T ...
```
ważne pola
* `d=` - Domena którą odpytać o klucz publiczny do odszyfrowania podpisu
* `s=` - Selector wskazujący który z opublikowanych kluczy publicznych ma być użyty
* `h=` - Jakie pola nagłówka zostały podpisane i mają zostać sprawdzone
* `a=` - Algorytm który został użyty do wyliczenia hasha (podpisu)
* `b=` - Zaszyfrowany podpis (hash wyliczony przez wysyłającego)

Klucz publiczny jest umieszczany w rekordzie TXT subdomeny zbudowanej z pól Selectora i Domeny nagłówka `DKIM-Signature`. 
Np. `15q3._domainkey.ncas.us-cert.gov`
Gdzie `15q3` jest wartośćią pola `s`, `ncas.us-cert.gov` wartośćią pola `d`, a `_domainkey` stałe.

Po pobraniu klucza publicznego, pole `b` jest odszyfrowywane i otrzymany hash użyty w celu weryfikacji zgodności podpisu. Odbywa się to poprzez wyliczenie nowego hasha z aktualnego body oraz nagłówków i porównaniu go z otrzymanym.

Sam w sobie DKIM nie ma możliwości sugerowania co zrobić z wiadomością z niezgodnym podpisem, potrzebny do tego jest DMARC.

## DMARC (Domain-based Message Authentication, Reporting & Conformance) ([RFC7489](https://tools.ietf.org/html/rfc7489))

Zestaw reguł budowany na bazie SPF i DKIM pozwalający zdecydować czy wiadomość faktycznie przyszła od wysyłającego za którego się podaje. Jako centralny punkt odniesienia bierze pole `RFC5322.From` (widoczone w klientach pocztowych). Posiada też możliwości raportowania.

Sprawdzenia:
- SPF alignment - Czy SPF poprawnie przechodzi sprawdzenie **ORAZ** Czy`RFC5321.MailFrom` zgadza się z `RFC5322.From` (dla ustawień relax dowolne z pól może być subddomeną, dla strict domeny muszą być dokładnie takie same)
- DKIM alignment - Czy wiadomość jest poprawnie podpisana wg. DKIM **ORAZ** Czy wartość w polu `d=` nagłówka DKIM zgadza się z `RFC5322.From` (dla ustawień relax dowolne z pól może być subddomeną, dla strict domeny muszą być dokładnie takie same)

Dowolne ze sprawdzeń musi się zakończyć sukcesem żeby mail doszedł.
```
DMARC authentication pass = (SPF authentication pass AND SPF identifier alignment) OR (DKIM authentication pass AND DKIM identifier alignment)
```

W rekordzie TXT subdomeny `_dmarc`, dla domeny z pola`RFC5322.From`, umieszczony jest wpis definiujący reguły dopasowania, tzn. co zrobić z wiadomością gdy nie zostanie spełnione któreś ze sprawdzeń, oraz gdzie wysyłać raporty z powiadomień. 
Np. gdyby w polu From było `abc.google.com` to o rekord odpytywany jest `_dmarc.abc.google.com`. 
Jeśli nie ma tam poprawnego rekordu, pytana o niego jest domena narzędna, w tym przypadku `google.com`, więc kolejne zapytanie o rekord TXT pójdzie do domeny `_dmarc.google.com`

Przykład:
```
dig +short txt _dmarc.google.com
"v=DMARC1; p=reject; rua=mailto:mailauth-reports@google.com"
```
Opis pól:
* `v=` - Wersja protokołu, musi być `DMARC1`
* `rua=` - Lista adresów na które mają przyjść raporty ze sprawdzeń - w formacie * `mailto:mailauth-reports@google.com` 
* `adkim=` - Ustawienia restrykcyjności dla DKIM - 'r' (Relaxed) lub 's' (Strict). W relaxed porównywane są tylko domeny narzędne (dopuszczalne są subdomeny). Domyślnie Relaxed.
* `aspf=` - Ustawienia restrykcyjności dla SPF - 'r' (Relaxed) lub 's' (Strict). W relaxed porównywane są tylko domeny narzędne (dopuszczalne są subdomeny). Domyślnie Relaxed.
* `p=` - Co ma się stać z wiadomocią która nie przejdzie sprawdzeń, możliwe opcje:

| Opcje dla `p=` | Opis | 
| -------- | -------- | 
| none     | nie są podejmowane żadne akcje, tylko raportowanie     | 
| quarantine     | wiadomość powinna zostać przeniesiona do spamu     | 
| reject     | wiadomość powinna być odrzucona     | 



[Więcej możliwych pól](https://tools.ietf.org/pdf/rfc7489.pdf#39)
