Levelek kézbesítésénél a fogadó oldal legfontosabb kérdése: a levél hiteles-e, és az küldte, aki ebben kompetens? Ezt a kérdést a DKIM is segít eldönteni úgy, hogy a levelet hitelesíti, a hitelesítési információkat pedig a levél fejléceiben elhelyezi.
Így tulajdonképpen a kérdés az alábbira egyszerűsödik: a levél tartalma módosult-e, és a levél digitálisan titkosított aláírása megegyezik-e a küldő fél DNS rekordjaiban található információkkal? Ha sorrendben nem, igen a válasz akkor a levél megbízható. Most ezt a funkcionalitást próbáljuk meg a saját levelezőszerverünkhöz hozzáadni.
DKIM tudnivalók
A DKIM (Domain Key Identified Mail) megoldást prominens szolgáltatók, mint pl. a Yahoo, Gmail, AOL, Fastmail közösen fejlesztették ki. Csak ismételni tudom magam: a DKIM segítségével a fogadó oldal egyrészt láthatja, hogy módosult-e a levél a két szerver között, illetve láthatja, hogy az aláírás tényleg a mi kulcsunkkal történt-e? Ez úgy történhet meg, hogy a kimenő levelek fejlécéhez az aláíró program egy DKIM-Signature fejlécet ad hozzá, amely egy “tag=value” típusú, vesszővel elválasztott lista elemeit tárolja. Ez csak a levelező szerverek számára látható, a mindennapi levelezésben egyáltalán nem zavaró. Az aláíráshoz használatos privát kulcsunk publikus részét az adott domain (selector) TXT típusú DNS rekordjában helyezzük el. A DNS rekord neve (aldomain) kötött.
A lista elemeinek tag neve gyakran rövid, egy-két betűs szó. Legismertebbek:
- v= verziószám (statikus 1)
- a= aláírás algortimusa
- c= canonizálási algortimus a header és body tartalomra
- q= az alapértelmezett publikus kulcs lekérdezési eljárás (pl. dns/txt)
- b= a tartalom elektornikus aláírása, amely az email header és body-ra vonatkozik
- bh= egy body hash
- d= az aláíró domain
- s= a selector
- l=a body canonilizált részének hossza
- t= aláírási időbélyeg
- x= lejárati idő
- h= az aláírásba bekerült fejlécek listája
Egy minta DKIM fejléc:
DKIM-Signature: v=1; a=rsa-sha256; d=example.net; s=brisbane; c=relaxed/simple; q=dns/txt; l=1234; t=1117574938; x=1118006938; h=from:to:subject:date:keywords:keywords; bh=MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=; b=dzdVyOfAKCdLXdJOc9G2q8LoXSlEniSbav+yuU4zGeeruD00lszZ VoG4ZHRNiYzR
A selector kérdésere vissza kell térnünk. Ahhoz, hogy a fogadó fél a publikus kulcsunkat megszerezhesse, azt kihelyezzük egy TXT típusú dns rekordba. A DNS rekord már önmagában is egy elfogadható eljárás, hiszen a saját domainünk DNS rekordjait – elméletileg – csak mi tudjuk kezelni. A kérdés az, hogy vajon melyik DNS rekordban rejtettük el az adatokat? Ezt megadhatjuk, méghozzá a tag-ek segítségével.
A DNS rekord nevét az alábbi adja meg: selector._domainkey.domain, vagy ha tag-ekkel írjuk le s._domainkey.d . A fenti példa adataival behelyettesítve ezt kapjuk: brisbane._domainkey.example.net
Tehát a fogadó szerver fogja magát és lekéri a brisbane._domainkey.example.net TXT típusú rekordját, amelyben megtalál a hitelesítéshez minden szükséges információt.
Nézzünk egy példa TXT rekordot:
v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDGJY5QnshY9TYF+IL2wU2kBydf971bpGhr9uCNp27Hs9NuxB0G1WOGRFe7mCT+X+6FSc8t9dvhJVlTWuVy6CjyirJ6EiVHZx3ZbNXI067+BV/bktRN5cuCb+NrTF0B1dpZ6p8EIURoJkdtB Yw5pUeZ2ks3y9JWxDM3l9Cc73fanwIDAQAB
Láthatod, hogy itt is van néhány paraméter, a legfontosabb a p=, ez tartalmazza a publikus kulcsot.
Telepítés, beállítás
A postfix telepítéséről most nem beszélek, feltételezem, hogy már van egy jól működő példányod.
apt-get install opendkim opendkim-tools
Az opendkim egy önállón futó démon program, ne lepődj meg, ha látod a folyamat listában. Fontos, hogy betoljuk magunkat az /etc/default/opendkim fájlba, és módosítsuk a SOCKET változó értékét. Egyelőre használjunk TCP-t, így adjuk meg: SOCKET=”inet:8891@localhost”. Tehát az opendkim csak a localhost 8891-es portján figyeljen a kérésekre. Ha socket-et szeretnél hazsnálni (és miért ne akarnál), valószínűleg célszerű lesz a postfix-ot az opendkim csoporthoz adni.
A részletes beállítási lehetőségeket az /etc/opendkim.conf fájlban találod. Máris a multi domaines környezet fogod beállítani (hogy ne kelljen kétszer fáradnod). Egy láma szintű konfiguráció:
# Always oversign From (sign using actual From and a null From to prevent # malicious signatures header fields (From and/or others) between the signer # and the verifier. From is oversigned by default in the Debian pacakge # because it is often the identity key used by reputation systems and thus # somewhat security sensitive. OversignHeaders From # List domains to use for RFC 6541 DKIM Authorized Third-Party Signatures # (ATPS) (experimental) #ADSPDiscard no #ATPSDomains example.com Canonicalization relaxed/relaxed Mode sv SubDomains yes Syslog yes LogWhy yes UMask 022 UserID opendkim:opendkim KeyTable /etc/opendkim/KeyTable SigningTable /etc/opendkim/SigningTable ExternalIgnoreList /etc/opendkim/TrustedHosts InternalHosts /etc/opendkim/TrustedHosts Socket inet:8891@localhost Selector mail DNSTimeout 5 SignatureAlgorithm rsa-sha256
Ebből csak az a fontos egyelőre, hogy a kulcsok, aláírások, egyebek az /etc/opendkim könyvtárban vannak (ne lepődj meg, a fájlnevek kisnagybetúsek). Ez a könyvtár egyébként nem létezik, Neked kell létrehoznod, a fájlokkal együtt:
mkdir -p /etc/opendkim/keys touch /etc/opendkim/KeyTable touch /etc/opendkim/SigningTable touch /etc/opendkim/TrustedHosts
Beszéljünk egy kicsit a fájlok szerepeiről:
- KeyTable, amely domainenként a privát kulcsok adatait tartalmazza
- SigningTable, amelyben összepárosítjuk a küldő domaint a DNS rekorddal
- TrustedHosts, amely IP címeket vagy host neveket tárol
KeyTable
A KeyTable formátuma meglehetősen egyszerű: ez egy multi mezős sorokat tároló fájl, amelyben a mezők kettősponttal vannak elválasztva, a kulcs-érték párok viszont szóközzel. A rekord struktúra sem nehéz.
rekord_alneve domain:selector:privat_kulcs_abszolut_eleresi_utja
tehát azt akarják mondani, hogy adj egy álnevet, aliast midne egyes rekordnak, amellyel azonosíthatod a a benne lévő beállítási készeletet (domain, selector, kulcs). Én magam azt csinálom, hogy a TXT rekord nevét adom meg álnévként, így biztos nem kavarodok bele, méghozzá az alábbi módszertan szerint:
dns_rekord_neve
domain
:
selector
:/etc/opendkim/keys/
domain
/
selector
.private
Az előző példánál maradva így nézne ki:
brisbane._domainkey.example.net example.nte:brisbane:/etc/opendkim/keys/example.net/brisbane.private
Így aztán 1000 rekordot is lehet, könnyű lesz keresgélnde – és hivatkoznod – az adatokra.
SigningTable
A SigningTable segít összepárosítani a küldő felet a saját kulcsával (azaz a KeyTable megfelelő sorával). Ebben kétmezős sorok vannak, a mezők whitespace-el vannak elválasztva. Bal oldalon a küldő fél, jobb oldalon a KeyTable kompetens sorának álneve. A küldő fél lehet teljes e-mail cím, vagy domain, illetve e-mail címben használhatunk csillagot is a kukac előtt.
Példa:
president@example.com brisbane._domainkey.example.net example.com mail._domainkey.example.net *@example.net selector._domainkey.example.net
TrustedHosts
Ez tulajdonképpen ip címeket és hostokat tárol, amit több célra is felhasználunk. Az ExternalIgnoreList arra használja, hogy melyek azok a külső szerverek, amelyek további autentikáció nélkül küldhetnek levelet az opendkim által kezelt domainek nevében. Az InternalHosts adja meg azokat, akiket nem kell ellenőrizni, és aláírhatóak.
Kulcsok generálása
Lépjünk be az /etc/domainkey/keys könyvtárba, és készítsünk egy könyvtárt az adott domainek, majd ide is lépjünk be:
cd /etc/opendkim/keys mkdir /etc/opendkim/keys/example.net cd /etc/opendkim/keys/example.net
A kulcsgeneráláshoz meg kell adnunk a domaint és a selectort:
opendkim-genkey -s brisbane -d example.net
Ez két fájlt fog létrehozni:
- brisbane.private, amely a privát kulcsot
- brisbane.txt, amely a publikus kulcsot tartalmazza
Cseréld le a a privát kulcs tulajdonosát:
chown opendkim:opendkim brisbane.private
A publikus kulcsot add a DNS rekordhoz. A brisbane.txt erre elő van készítve, bár az idézőjelekre figyelj oda: a teljes rekord legyen egy idézőjelben.
v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDGJY5QnshY9TYF+IL2wU2kBydf971bpGhr9uCNp27Hs9NuxB0G1WOGRFe7mCT+X+6FSc8t9dvhJVlTWuVy6CjyirJ6EiVHZx3ZbNXI067+BV/bktRN5cuCb+NrTF0B1dpZ6p8EIURoJkdtB Yw5pUeZ2ks3y9JWxDM3l9Cc73fanwIDAQAB
Postfix beállítása
Ahhoz, hogy a kimenő levelek tényleg aláírásra is kerüljenek, jelezni kell a postfix-nak, hogy tegye is meg. Ezt az /etc/postfix/main.cf fájlban pár sorral meg is oldjuk. Adjuk hozzá:
milter_default_action = accept milter_protocol = 6
smtpd_milters = inet:localhost:8891 non_smtpd_milters = inet:localhost:8891
A vastagon kiemelt sorok a fontosak. Az opendkim-et és a postfix-ot is érdemes a beállítások után újrarúgni.
service opendkim restart service postfix restart
És máris tesztelhetsz.