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
- 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.
