Levelezés

Postfix és DKIM beállítása

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.

Loading