Opis działania DKIM.
DKIM jest metodą umożliwiającą sprawdzenie, czy otrzymywana wiadomość e-mail została wysłana przez autoryzowanego nadawcę. Zasada działania polega na działaniu kluczy podpisujących wiadomość oraz odczytujących poprawność ich podpisania na MTA odbiorcy. Nadawca generuje klucz prywatny oraz klucz publiczny.
Klucz prywatny jest przechowywany na serwerze nadawcy i wysyłający MTA używa go do podpisywania wysyłanej wiadomości. Podpis dotyczy wybranych części wiadomości, np. domeny nadawcy, tematu wiadomości itp. Podpis wykonywany jest przez MTA w chwili przyjęcia wiadomości do wysłania. Wiadomość wysłana do adresata zawiera już informację zaszyfrowaną prywatnym kluczem DKIM.
Nadawca umieszcza w strefie swojej domeny rekord z kluczem publicznym DKIM. Klucz ten służy do odszyfrowania informacji zapisanych przez MTA wysyłający wiadomość. MTA odbierający odczytuje wartość tego klucza, odszyfrowuje za jego pomocą informacje zawarte w nagłówku wiadomości oraz przeprowadza weryfikację poprawności informacji. Umieszczony w strefie DNS nadawcy klucz publiczny DKIM ma postać:
selektor._domainkey.domena.tld
.
przy czym:
- selektor: ciąg znaków identyfikujący dany klucz dla domeny. Domena może posiadać wiele kluczy i w związku z tym wiele selektorów.
- _domainkey: słowo kluczowe informujące, że ten wpis jest kluczem domeny.
MTA wysyłający wiadomość dokonuje podpisu wiadomości korzystając z klucza prywatnego i umieszcza informacje w nagłówku wiadomości. MTA odbierający wiadomość odczytuje te informacje i generuje sprawdzenie autentyczności nadawcy wiadomości, korzystając z klucza zapisanego w DNS domeny nadawcy (selektor._domainkey).
MTA odbierający może podjąć akcję dla podpisu DKIM, np. dla MTA Exim są to wartości:
- none: brak podpisu DKIM
- pass: podpis DKIM poprawny
- fail: podpis DKIM nieprawidłowy (zafałszowana wiadomość)
- invalid: błąd weryfikacji DKIM
Dodatkową wiadomością dla MTA odbierającego, a zawartą w DKIM jest informacja o tym, czy podpis DKIM jest w fazie testów, czy produkcyjnej.
Poprawność podpisu DKIM można weryfikować również przy pomocy SpamAssassin. Należy sprawdzić, czy plugin odpowiadający za obsługę DKIM jest aktywny. W pliku v312.pre powinna być odkomentowana linijka:
Mail::SpamAssassin::Plugin::DKIM
, oznaczająca, że SpamAssassin sprawdza podpis DKIM. W pliku local.cf możemy modyfkować domyślne działanie dla określonych akcji związanych z DKIM, np.
score DKIM_VALID -2.123
score DKIM_INVALID 15.123
a MTA odczytujący przydzieloną przez SpamAssassin punktację podejmie odpowiednie, zadane przez administratora dalsze działania.
Przykładowe regułki reakcji na stan DKIM dla MTA Exim.
Najpierw sprawdzamy, czy Exim ma wkompilowaną obsługę DKIM:
server#exim -bV
Support for: crypteq IPv6 Perl OpenSSL move_frozen_messages Content_Scanning DKIM DNSSEC Event OCSP PIPE_CONNECT PRDR SPF DMARC TCP_Fast_Open Experimental_SRS
acl_smtp_dkim:
### DENY #####################################################################################################################################
#Odrzucamy pocztę przychodzącą, gdy DKIM=invalid lub DKIM=failed a DKIM NIE jest w fazie testów
#Na 99.99% jest to nieautoryzowana wysyłka - SPAM
#Odrzucamy pocztę z "nadawcą" polspam.pl i niepoprawnym DKIM
deny
sender_domains = polspam.pl
dkim_signers = polspam.pl
!dkim_status = pass
log_message = DKIM: polspam.pl sender with incorrect DKIM.
message = DKIM Invalid: signer=$dkim_cur_signer\nstatus=$dkim_verify_status\nreason=$dkim_verify_reason.
#Odrzucamy pocztę z gmail.com i niepoprawnym DKIM
deny
sender_domains = gmail.com
dkim_signers = gmail.com
dkim_status = fail : none : invalid
log_message = DKIM: GMail sender with incorrect DKIM.
message = DKIM Invalid: signer=$dkim_cur_signer\nstatus=$dkim_verify_status\nreason=$dkim_verify_reason, test=$dkim_key_testing
#Odrzucamy pocztę z nieprawidłowym DKIM, dla DKIM z wyłączoną flagą TEST
deny
condition = ${if eq{$dkim_key_testing}{0}}
dkim_status = invalid
log_message = DKIM Invalid: signer=$dkim_cur_signer status=$dkim_verify_status reason=$dkim_verify_reason
message = DKIM Invalid: signer=$dkim_cur_signer\nstatus=$dkim_verify_status\nreason=$dkim_verify_reason, test=$dkim_key_testing
#Odrzucamy pocztę z nieprawidłowym DKIM, dla DKIM z wyłączoną flagą TEST
deny
condition = ${if eq{$dkim_key_testing}{0}}
dkim_status = fail
log_message = DKIM: Failed. reason=$dkim_verify_reason
message = DKIM Invalid: signer=$dkim_cur_signer\nstatus=$dkim_verify_status\nreason=$dkim_verify_reason, test=$dkim_key_testing
### WARN/DEFER#################################################################################################################################
#Zezwalamy na przyjęcie poczty w ACL DKIM, gdy DKIM=invalid lub DKIM=failed ale DKIM nadawcy JEST w fazie testów
#warn w dwu poniższych można zamienić np. na defer. Jeżeli ktoś testuje DKIM to pewnie patrzy w logi i gdy zobaczy odpowiedź naszego MTA poprawi sobie DKIM.
#przykładowo:
#defer
#condition = ${if eq{$dkim_key_testing}{1}}
# *** i np. dodatkowo biała lista ***
#condition = ${if !eq($acl_c_permit}{1}}
#do $acl_c_permit należy załadować wcześniej białą listę dla której ominiemy DKIM.
# *** condition = ${if !eq($acl_c_permit}{1}} można również zastosować w powyższych regułach deny
#
warn
condition = ${if eq{$dkim_key_testing}{1}}
dkim_status = invalid
add_header = X-DKIM: status=$dkim_verify_status signer=$dkim_cur_signer reason=$dkim_verify_reason, test=$dkim_key_testing
log_message = DKIM Invalid: signer=$dkim_cur_signer status=$dkim_verify_status reason=$dkim_verify_reason
message = DKIM Invalid: signer=$dkim_cur_signer\nstatus=$dkim_verify_status\nreason=$dkim_verify_reason, test=$dkim_key_testing
delay = 30s
warn
condition = ${if eq{$dkim_key_testing}{1}}
dkim_status = fail
add_header = X-DKIM: status=$dkim_verify_status signer=$dkim_cur_signer reason=$dkim_verify_reason, test=$dkim_key_testing
log_message = DKIM: Failed. reason=$dkim_verify_reason
message = DKIM Invalid: signer=$dkim_cur_signer\nstatus=$dkim_verify_status\nreason=$dkim_verify_reason, test=$dkim_key_testing
delay = 30s
#DKIM jest ok, więc zgoda na przyjęcie poczty z tytułu sprawdzenia DKIM
warn
dkim_status = pass
add_header = X-DKIM: status=$dkim_verify_status signer=$dkim_cur_signer
#Za brak DKIM dajemy opóźnienie 1 minutę
warn
dkim_status = none
add_header = X-DKIM: status=$dkim_verify_status signer=$dkim_cur_signer reason=$dkim_verify_reason
delay = 60s
#
Tak więc wdrożenie zasad DKIM na własnym serwerze pocztowym uwiarygodni nasze wiadomości u odbiorcy poczty jako autentyczne, a jednocześnie pozwoli odbiorcy na zastosowanie własnej polityki traktowania fałszywych wiadomości generowanych przez podszywających się pod nasze domeny nadawców. Efektem takiego działania będzie wyeliminowanie nieprawdziwych wiadomości przesyłanych bez naszej wiedzy przez nieuprawnione do tego, obce MTA.