Niedawno w sprezentuj.pl kombinowaliśmy jak tu zrobić żeby nasze maile nie były uznawane jako spam przez jak najwięcej serwerów pocztowych i z grzebania w informacjach w helpach Yahoo wynika że warto mieć system który “autentykuje” ze mail jest wysyłany rzeczywiście z podanej domeny. Enter DKIM.

Co to jest DKIM ?

Szczegóły ofc w wikipedii ;] ale system polega na tym że nadawca (niekoniecznie ale zwykle) podpisuje maila swoim kluczem prywatnym a odbiorca pobiera klucz publiczny z DNS (rekord TXT prefix._domainkey), rozkodowuje i sprawdza czy wszystko jest ok. Ponieważ z założenia ktoś kto próbuje się podszyć musiałby mieć odpowiedni klucz prywatny do klucza publicznego, to można uznać że prawidłowy podpis oznacza że to rzeczywiście właściciel domeny wysłał tego maila(w wielkim skrócie). A teraz implementacja ;]

Generowanie kluczy i dkim-filter

Zakładam tutaj że to będzie “typowy”” config tylko do wysyłania maili (serwer aplikacji + postfix jako mailer maili generowanych przez aplikację i serwer), zaczynamy od instalacji czego potrzeba:
<br /> aptitude install dkim-filter<br />
Teraz trzeba wygenerować public i private key. Przyjmę że prefix(tzw. selektor) to 2010, długośc klucza to 2048 a domena to devrandom.pl
<br /> devrandom:~/dkim# openssl genrsa -out 2010.devrandom.prv 2048<br /> Generating RSA private key, 2048 bit long modulus<br /> .......................+++<br /> .............+++<br /> e is 65537 (0x10001)<br /> devrandom:~/dkim# openssl rsa -in 2010.devrandom.prv -pubout -out 2010.devrandom.pub -outform PEM > /dev/null<br /> writing RSA key<br />
Mamy już nasze klucze, teraz pora na konfigurację DKIM, edytujemy /etc/dkim-filter.conf i ustawiamy:
<br /> Domain devrandom.pl<br /> KeyFile /etc/postfix/dkim/2010.devrandom.prv<br /> Selector 2010<br />
kopiujemy klucz do wskazanego katalogu. Ew. błędy polecą do sysloga.

Połączenie z postfixem

Żeby teraz Postfix “widział” naszego demonka należy mu dodać linijkę w /etc/postfix/main.cf:
<br /> smtpd_milters = inet:localhost:8891<br /> non_smtpd_milters = inet:localhost:8891<br />
i dodać (ew. zakomentowac inne) w /etc/default/dkim-mfilter
<br /> SOCKET="inet:8891@localhost"<br />
Why ? postfix się defaultowo chrootuje i przez tcp/ip najłatwiej ustawić (w ubu jest tak domyślnie).
Robimy restart postfixa i dkim-filter i ślemy testowego maila z taką samą domeną jak w configu dkim-filter (ważne! podpisuje tylko z tej domeny!), następnie patrzymy w treść maila i jeżeli zobaczymy* “DKIM-Signature: v=1; a=rsa-sha256;…” *oznacza to że podpisywanie działa poprawnie, teraz…

DNS

Tu uprzedzenie z góry, Twój dostawca DNS musi umożliwać dodawanie rekordów TXT z “” w nazwie, a nie wszyscy (np. home.pl, wstyd i żenada --) to umożliwiają. Rekord DNS (BIND-style) powinien wyglądać tak:

2010._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0GOwR4ZBu9VkuYRHF6MgZm34NZEKrbPjkirIA992mXIs75YwlKBNn59goUlY7eVRXBH23FhrwPqVv8tte7N/pSsGUlj7F+RY/FW91/iYICLdYKW8H2lBydrKkZhOnDtQaKO2cAiaSvbkcYDDKOBd3AHSorRTAFEHc2N3IChSsSjat8PuNOXJ1XhUkzeMaUdwjM9Ti8fcxDjTqilhigOiL1KKcLS7uLGU24ov6av3iMtXSp0PtH2S/pFG/NNRgM7GTCduC9M45EevYNIQrE8UDX0aJmXpmotnirGVHxj7qkaUHgTwhTkVqhcXcU7GpJS5WVVDGNQ4lpBXPrhXQ4vrfQIDAQAB"

gdzie 2010 to wybrany prefix(nie musi być rok!) a p= to klucz publiczny pisany w jednej linijce

Finish

Rezultat (gdy mail przechodził przez google):
<br /> Authentication-Results: mx.google.com; spf=pass (google.com: best guess<br /> record for domain of test@devrandom.pl designates 109.74.192.97 as<br /> permitted sender) smtp.mail=test@devrandom.pl; <strong>dkim=pass</strong><br /> header.i=@devrandom.pl<br />
czasami trzeba będzie trochę poczekać na DNS (chociaż negatywne odpowiedzi nie powinny być cachowane… ale różnie się zdarza). I to tyle, enjoy ;]

Edit: maly fix, dodano “non_smtpd_milters” dla maili wysylanych lokalnie