Podpisywanie wiadomości na serwerze – DKIM

Dziś przedstawię technika podpisywania wiadomości przed serwer pocztowy – DKIM DomainKeys Identified Mail. Wiadomość z takim podpisem poprawnie zweryfikowanym oznacza, że  jest wysłana przez serwer dedykowany dla tej domeny. Dzięki temu otrzymujemy dwie funkcjonalności:

  • każdy może sprawdzić czy mail wysłany z serwera z domeny np przykladowadomena.pl  jest naprawdę wysłany przez serwer dedykowany do tego. Nie ma możliwości podrobienia nagłówków.
  • my możemy udowodnić czy mail nie był(lub był) wysłany przez serwer. Pomocne przy próbach wyłudzenia z cyklu „mamy mail od państwa i państwo zamawiali usługę”. Po nagłówkach można sprawdzić czy to prawda. Wszystkie inne nagłówki można spreparować z wyjątkiem właśnie sygnatury DKIM

DKIM wiadomości kluczem prywatnym szyfruje pola maila np:nadawce,adresata ,datę temat i na tej podstawie generuje klucz wiadomości. Odbiorca może dzięki temu zdeszyfrować (kluczem publicznym publikowanym na DNSie domeny) to i sprawdzić czy wszystko się zgadza. Duże portale używają DKIM: gmail,yahoo.com, wp.pl,onet.pl i wiele innych.

Zakładam, że użytkownik ma poprawnie skonfigurowane serwery poczty (Postfix) i DNS(Bind – chociaż tu rodzaj ma mniejsze znaczenie). Konfiguracja będzie oparta o opendkim. Wszystkie pliki będą w katalogu /etc/postfix/opendkim. Domena to przykladowadomena.pl. Nie będzie to kopia  dostępnych tutorialii z sieci lecz kompletny przewodnik z uwzględnieniem obsługi wielu domen na jednym serwerze.

Konfiguracje opendkim

Najpierw należy wygenerować klucz prywatny i klucz publiczny dla domeny. Tworzymy katalog /etc/postfix/opendkim/przykladowadomena.pl w ktorym będą przechowywane klucze. Każda domena będzie miała osobny katalog i osobną parę kluczy (niezależny zestaw). Dobre rozwiązanie jeśli będzie trzeba kiedyś przenieść jedną z domen na inny serwer. Nie trzeba będzie po świecie wynosić klucza prywatnego jednego wspólnego dla wszystkich domen.

opendkim-genkey -t -s mail -d przykladowadomena.pl

ta komenda tworzy dwa pliki w katalogu. Klucz prywatny o nazwie mail.private i klucz publiczny w formacie przygotowanym do publikacji w Bindzie o nazwie mail.txt. Opcja s to tzw selektor czyli prefix w nazwie, która może być dowolna tu będzie standardowa mail.

Plik konfiguracyjny /etc/opendkim.conf wygląda tak

# This is a basic configuration that can easily be adapted to suit a standard
# installation. For more advanced options, see opendkim.conf(5) and/or
# /usr/share/doc/opendkim/examples/opendkim.conf.sample.

# Log to syslog
Syslog        no    
# Required to use local socket with MTAs that access the socket as a non-
# privileged user (e.g. Postfix)
UMask            002

#AuthservID    Authentication-Results: mailserver.almamarket.pl
AuthservID     poczta.przykladowadomena.pl
KeyTable      /etc/postfix/opendkim/domeny
SigningTable  /etc/postfix/opendkim/SigningTable

KeyTable to pliki to plik z definiowanymi parametrami dla każdej domeny.

Plik /etc/postfix/opendkim/domeny ma następująco postać

mail._domainkey.przykladowadomena.pl przykladowadomena.pl:mail:/etc/postfix/opendkim/przykladowadomena.pl/mail.private

przy większej ilości domen należy dodać następne linie. Każda linia zawiera selektor i domenę i powiązany z nimi klucz prywatny.

Plik /etc/postfix/opendkim/SigningTable zawiera domeny i powiązane z nimi subdomeny.

przykladowadomena.pl  mail._domainkey.przykladowadomena.pl

 Połączenie z Postfixem

Połączenie z Postfixem jest dośc proste w pliku /etc/postfix/main.cf dodajemy linie

# DKIM
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891

Dopisanie do DNSu

I prawie skończone teraz należy tylko opublikować klucz publiczny przy pomocy pliku mail.txt.  czyli coś taiego

mail._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=MIGfMA0GCSqGSIb3DQZNIOQUAA4GNADCBiQKBgQDX1SziGp/3KDnZ2kkWtTyIhMB2/9TO1SLCm4SUPNWcoP7BF8sYW5cCgae
qcRBVD6VWVZE0dt2aJQkSvKPeHsyEOgFo7od5Xd4z3WyKRuNDMC3mYUcTyG8PesBfauRBHx4CkYLygRw20Gjzq6Fbg9viy6G1Z9qiK27I3/en5J5clQIDAQAB" ; ----- DKIM mail f
or przykaldowadomena.pl

I sprawa zakończona , powinno działać. jak nie działa szukamy w logach i szukamy na necie:)

Wysyłamy testowego maila np dla gmail.com i powinna być w nagłówkach dwa nowe:

generowany przez nas serwer z DKIM-Signature w stylu

DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=przykladowadomena.pl; s=mail;
	t=1431586094; bh=Y+4J+1NyUD0KT/Y4cIdpk8CDE+PIgFDHga1m1j9cQEo=;
	h=Date:From:To:Subject;
	b=R5tf6BsHZZUaIyEKBgeiqu3k27+svAnLPdp4cikBBB2Ip0nwGgIyJJbxQ/Pisl2cM
	 osYgjgRv1sHo5nXSpGC2vABGsfTS1/B1lmYGdl4hqGlwB7SR+84EKuhECM7dno+7En
	 k7OlPiRWyzPbNfwoWXFco4yBXkoXK9dQWr8amDlI=

Oraz linia generowane przez gmaila

Authentication-Results: dkim=pass

Opisany tu sposób ma tą zaletę, że łatwo dopisywać natępne domeny na jednym serwerze.

Podsumowanie

DKIM jest wygodnym sposobem podpisywania maili. Ma jedną wielka zaletę: nie da się spreparować nagłówków aby spoofingować źródło wysłania maili. Odbiorca może mieć pewność, że nasz dobry serwer wysłał maila. Pomaga to zdecydowanie w walce ze spamem(spoofingiem) ale o tym innym razem. Jedna z reguł w walce z fałszywymi przesyłkami DHL wykorzystywała brak DKIM.

Wszystkie uwagi i pytania najlepiej pisać w komentarzach. Niech inni tez skorzystają

Do poczytania:

[1] Strona domowa projektu
[2] Manual dla ubuntu.
[3] Tuturial po Polsku

8 thoughts on “Podpisywanie wiadomości na serwerze – DKIM

  1. I cały ten DKIM jest wujka warty.
    Tony spamu przychodzą z bardzo ładnym nagłówkiem z DKIM.
    Aż się zastanawiam czy punktacji nie obniżać jak jest podpis.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *