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:

aptitude install dkim-filter

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

devrandom:~/dkim# openssl genrsa -out 2010.devrandom.prv 2048
Generating RSA private key, 2048 bit long modulus
.......................+++
.............+++
e is 65537 (0x10001)
devrandom:~/dkim# openssl rsa -in 2010.devrandom.prv -pubout -out 2010.devrandom.pub -outform PEM > /dev/null
writing RSA key

Mamy już nasze klucze, teraz pora na konfigurację DKIM, edytujemy /etc/dkim-filter.conf i ustawiamy:

Domain devrandom.pl
KeyFile /etc/postfix/dkim/2010.devrandom.prv
Selector 2010

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:

smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891

i dodać (ew. zakomentowac inne) w /etc/default/dkim-mfilter

SOCKET="inet:8891@localhost"

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):

Authentication-Results: mx.google.com; spf=pass (google.com: best guess
record for domain of test@devrandom.pl designates 109.74.192.97 as
permitted sender) smtp.mail=test@devrandom.pl; dkim=pass
header.i=@devrandom.pl

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

Related Posts: