OpenDKIM kasutamine Postfixiga

Allikas: Imre kasutab arvutit
Mine navigeerimisribaleMine otsikasti

Sissejuhatus

OpenDKIM http://www.opendkim.org/ on vaba tarkvaraline DKIM (Domain Keys Identified Mail) http://en.wikipedia.org/wiki/DomainKeys_Identified_Mail 'sender authentication system' implementatsioon.

Käesolev tekst on läbi proovitud Debian v. 6 ja v. 7 operatsioonisüsteemi keskkonnas, kuid tõenäoliselt sobib ka mujal kasutamisel kasutada.

Tarkvara paigaldamine

Tarkvara paigaldamiseks sobib öelda, kusjuures opendkim deemon ei käivitu kuna vaikimisi ei ole kasutada vajalikku privaatset võtit

# apt-get install opendkim
...
Starting OpenDKIM: opendkim: /etc/opendkim.conf: at least one selector and key required for signing mode
opendkim.

Tulemusena lisatakse kasutaja:grupp opendkim:opendkim ning failisüsteemi

  • /etc/opendkim.conf - peamine seadistusfail
  • /etc/init.d/opendkim - käivitusskript
  • /etc/default/opendkim - seadistusfail
  • /usr/sbin/opendkim-testkey - salajase ja avaliku võtme vastavuse kontrollimise utiliit
  • /usr/sbin/opendkim-genkey - võtmepaari genereerimise utiliit
  • /usr/sbin/opendkim-convert-keylist
  • /usr/sbin/opendkim - deemon
  • /usr/sbin/opendkim-stats
  • /usr/sbin/opendkim-genzone
  • /usr/sbin/miltertest
  • /usr/sbin/opendkim-testadsp

Lisaks tarkvara paigaldamisel moodustatud kataloogidele võiks tekitada kataloogi /etc/dkim, kus hoida võtmeid ja OpenDKIM tööks vajalikke täiendavaid seadistusfaile

# mkdir /etc/dkim

Kui mingil põhjusel katsetatakse lisaks ka dkim-filter tarkvara, siis tundub, et see kataloog võib olla neil ühine.

Võtmepaari genereerimine

Võtmepaari tekitamiseks sobib öelda

$ /usr/sbin/opendkim-genkey -b 1024 -d loomaaed.tartu.ee -D /etc/dkim -s default

kus

  • -b - võtme pikkus
  • -s - selektori nimi
  • -d - domeeninimi, mida kasutatakse dns kirje juures kommentaarina
  • -D millisesse kataloogi võtmed moodustatakse

Tulemusena tekib kaks faili

# ls -l
total 8
-rw------- 1 root root 887 Jan 22 20:55 default.private
-rw------- 1 root root 312 Jan 22 20:55 default.txt

kus

  • default.private failis on PEM kujul vastav salajane osa. Selle faili omaniku võiks muuta opendkim kasutajaks kusjuures olulised on ka loabitid 0600
# chown opendkim:opendkim /etc/dkim/default.private
  • default.txt on PEM vormingus avalik osa, kusjuures see esineb DNS TXT kirje kujul
# cat default.txt
default._domainkey IN TXT "v=DKIM1; g=*; k=rsa; \
p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9HbZWjIo\
... \
LQIDAQAB" ; ----- DKIM default for loomaaed.tartu.ee

kus

  • v - DKIM versioon
  • g - milliste kasutajate posti DKIM puudutab (see võib ka puududa, vaikeväärtus on tavaliseks kasutamiseks sobiv)
  • k - algoritm
  • p - avalik võti
  • t - TXT kirjele lisatakse juurde üks väli, mis näitab, et DKIM süsteemi juurutamine on testimisel

DNS kirje tekitamine

Selleks, et DKIM signatuuri saaks kirja vastuvõtja kontrollida, peab olema nimesüsteemis nt selline kirje, vastav rida tuleb loomaaed.tartu.ee tsoonifaili lisada

default._domainkey.loomaaed.tartu.ee IN TXT "v=DKIM1; g=*; k=rsa; p=MIGfMA0GCSqGSI ... LQIDAQAB"

Tulemusena peab saab nimesüsteemist vastuse pärigule

$ dig default._domainkey.loomaaed.tartu.ee txt

Avaliku ja privaatse võtme klappimise kontrollimiseks sobib öelda, õnnestumisel ei vastata midagi

$ /usr/sbin/opendkim-testkey -d loomaaed.tartu.ee -s default -k /etc/dkim/default.private
$

kus

  • -d domeeninimi
  • -s selektor
  • -k privaatne võti

Ebaõnnestumise korral vastatakse nt

opendkim-testkey: keys do not match

Seadistamine

OpenDKIM tööd juhib seadistusfail /etc/opendkim.conf. OpenDKIM seadistatakse tavaliselt käima ühena järgmistest viisidest

  • Single Domain Signature - iga domeeni kirjad signeeritakse samale domeenile vastava võtmega
  • Third Party Signature - kõigi domeenide kirjad signeeritakse ühe ja sama võtmega

Teine võimalus võib esmapilgul tunduda pisut kummaline, kuna miks peaks nõ võtma vastutuse keegi kolmas osapool signeerimise osas, kuid osutub, et teatud juhtumitel on selline asjakorraldus samuti mõttekas.

Selleks, et OpenDKIM deemon võrgus kuulaks tuleb kasutada failis /etc/default/opendkim nt rida

SOCKET="inet:8891@localhost"

Single Domain Signature

Single Domain Signature on kõige tavalisem ja otsekohesem viis DKIM kasutamiseks. Olgu eesmärgiks seadistada kahe domeeni kirjade allkirjastamine vastava domeeni võtmega, selleks sobib kasutada nt sellist seadistusfaili

# egrep -v "^$|^#" /etc/opendkim.conf 
Syslog                  yes
UMask                   002
Canonicalization        relaxed/relaxed
Mode                    sv
KeyTable                file:/etc/dkim/opendkim-keytable.txt
SigningTable            refile:/etc/dkim/opendkim-signingtable.txt
InternalHosts           /etc/dkim/internal.hosts
SignHeaders             *,+Message-ID,+MIME-Version

kus

  • Mode sv - OpenDKIM tegelen signeerimise ja verifitseerimisega
  • SignHeaders '*,+Message-ID,+MIME-Version' kasutamise tulemusel signeeritakse tavalise kirja puhul sellised elemendid
h=MIME-Version:Date:From:To:Subject:Message-ID;
  • KeyTable - seostab signatuuri sissekande juures kasutatava domeeni (d=), selektori (s=) ja privaatse võtme (k=)
# cat /etc/dkim/opendkim-keytable.txt
auulkey         auul.pri.ee:default:/etc/dkim/auul.key
loomaaedkey     loomaaed.tartu.ee:default:/etc/dkim/loomaaed.key
  • SigningTabel - ütleb, viidatse KeyTablele millist d=, s= ja k= komplekti kasutada kirja signeerimiseks sõltuvalt kirja From reast
# cat /etc/dkim/opendkim-signingtable.txt
*@auul.pri.ee  auulkey
*@loomaaed.tartu.ee loomaaedkey
  • file: ja refile: viitavad vastavalt asjaolule, kas failides kasutatakse või mitte regulaaravaldisi
  • InternalHosts - ip aadressid, kust saadetud kirju postimasin signeerib; üks aadress real

Third Party Signature

Selleks, et kõiki (lubatud aadressidelt) postimasinast läbi käivaid kirju signeeritakse sama võtmega peab kasutama sellise sisuga signingtable faili

# cat /etc/dkim/opendkim-signingtable.txt
* loomaaedkey

Sellist asjakorraldust nimetatakse Third Party Signature'ks http://www.dkim.org/specs/draft-ietf-dkim-deployment-11.html#thirdpartysig

OpenDKIM deemoni käivitamine

Käivitamiseks sobib öelda

# /etc/init.d/opendkim start|stop

tulemusena töötab opendkim protsess

/usr/sbin/opendkim -x /etc/opendkim.conf -u opendkim -P /var/run/opendkim/opendkim.pid -p inet:8891@localhost

kus

  • -x seadistusfail
  • -u kasutaja
  • -P pid
  • -p millisel interneti soketil pöördumisi teenindatakse

Postfixi seadistamine

Postfix kasutab OpenDKIM'id milteri kaudu, selleks tuleb /etc/postfix/main.cf seadistusfaili lisada read

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

kus

  • smtpd_milters - tegeleb smtp kanalil liikuvate andmetega
  • non_smtpd_milters - tegeleb mitte smtp kanalil liikuvate andmetega, nt nn /usr/sbin/sendmail abil saabunud postiga

Kui Postfix kasutab Amavis vms lahendusi, et kirja saadetakse mitu korda läbi Postfixi, siis tuleks kasutada rida /etc/postfix/master.cf failis

-o receive_override_options=no_milters

OpenDKIM töö kontrollimine

  • GMail abil
  • teise Postfix abil
Authentication-Results: mx-ftp.auul.pri.ee; dkim=pass (1024-bit key)
       header.i=@wheezy2.auul.pri.ee; dkim-asp=none
Received: by mx-wheezy.auul.pri.ee (Postfix, from userid 0)
       id 077FE9538D; Mon,  3 Oct 2011 18:15:21 +0300 (EEST)
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wheezy2.auul.pri.ee;
       s=default; t=1317654922;
       bh=twh8ncd2pebuzX9U9Q2DFLO2KXvmEDWgM3p8fe4r7Os=;
       h=Date:To:Subject:MIME-Version:Content-Type:
        Content-Transfer-Encoding:Message-Id:From;
       b=LoWMC5nr5aXhJqSFJQtclHHQ/j6k/7iryS31RGUoAh6NoY3cODizSqAzI4F4x0u71
        u9QGrRgkGK9ILIQ7rwSu8813itZJenmYipyyKAgakgou/zS8fjxiJX2PtT0t1L37QI
        CqSv6wp+s1gFuwG8n7n9FfQHqS/QukHCP1dd6F7E=

Märkused

  • Kui on ebaselge, kas DNS ikka töötab korrektselt, siis maksab nimeserveri ees lihtsalt võrku pealt kuulata ja on näha, kas teise poole postimasin küsib nimeserverilt ootuspäraseid nimesid.
  • logimist saab teha detailsemaks reaga
LogWhy True
  • Kui OpenDKIM seadistusfailides teha süntakstiviga võib saada nö veateate alles programmi kasutamisel segfaulti kujul.
  • Privaatsest võtmest avaliku osa küsimine
$ openssl rsa -in default.private -pubout

kusjuures väljundis on txt kirje p= järele jääv osa

  • avaliku võtme omaduste küsimine, nt eemärgiga saada teada kui pikka võtit gmail.com kasutab
$ dig +short 20120113._domainkey.gmail.com txt
 "k=rsa\; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCA
 QEA1Kd87/UeJjenpabgbFwh+eBCsSTrqmwIYYvywlbhbqoo2Dymn
 dFkbjOVIPIldNs/m40KF+yzMn1skyoxcTUGCQs8g3FgD2Ap3ZB5D
 ekAo5wMmk4wimDO+U8QzI3SD0" "7y2+07wlNWwIt8svnxgdxGkVbbhzY8i+RQ
 9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvI
 hkx4xYSIc9oSwVmAl5OctMEeWUwg8Istjqz8BZeTWb
 f41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac05
 98HY+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN
 04BLUTD21MycBX5jYchHjPY/wIDAQAB"

Seejärel ühendada p= järel ja lõpus " " märkide vahel olev väljund faili

$ cat /tmp/gmail.com
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEA1Kd87/UeJjenpabgbFwh+eBCsSTrqmwIYYvywl
bhbqoo2DymndFkbjOVIPIldNs/m40KF+yzMn1sk
yoxcTUGCQs8g3FgD2Ap3ZB5DekAo5wMmk4wimDO+U8QzI3SD0
7y2+07wlNWwIt8svnxgdxGkVbbhzY8i+RQ9DpSVpPbF7yk
QxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5OctME
eWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYA
D9NOZK9vlfuac0598HY+vtSBczUiKERHv1yRbcaQtZFh5
wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB
-----END PUBLIC KEY-----

ning küsida, nii saab teada gmail.com võtme pikkuse, 2k

$ openssl rsa -pubin -in /tmp/gmail.com -noout -text
Modulus (2048 bit):
   00:d4:a7:7c:ef:f5:1e:26:37:a7:a5:a6:e0:6c:5c:
   21:f9:e0:42:b1:24:eb:aa:6c:08:61:8b:f2:c2:56:
   e1:6e:aa:28:d8:3c:a6:9d:d1:64:6e:33:95:20:f2:
   25:74:db:3f:9b:8d:0a:17:ec:b3:32:7d:6c:93:2a:
   31:71:35:06:09:0b:3c:83:71:60:0f:60:29:dd:90:
   79:0d:e9:00:a3:9c:0c:9a:4e:30:8a:60:ce:f9:4f:
   10:cc:8d:d2:0f:4e:f2:db:ed:3b:c2:53:56:c0:8b:
   7c:b2:f9:f1:81:dc:46:91:56:db:87:36:3c:8b:e4:
   50:f4:3a:52:56:93:db:17:bc:a4:43:1b:4a:5e:4b:
   ff:6a:15:b7:2a:35:62:88:01:fe:82:1b:ef:22:19:
   31:e3:16:12:21:cf:68:4b:05:66:02:5e:4e:72:d3:
   04:79:65:30:83:c2:2c:b6:3a:b3:f0:16:5e:4d:66:
   df:e3:57:db:36:1b:5e:ed:8f:98:a9:93:b0:ab:54:
   9d:d0:36:ef:60:00:fd:34:e6:4a:f6:f9:5f:b9:a7:
   34:e7:df:07:63:eb:ed:48:17:33:52:22:84:44:7b:
   f5:c9:16:dc:69:0b:59:16:1e:70:b6:24:6b:37:4e:
   01:2d:44:c3:db:53:32:70:15:f9:8d:87:21:1e:33:
   d8:ff
Exponent: 65537 (0x10001)

Muudatused seoses Debian v. 7 Wheezy operatsioonisüsteemiga

Tundub, et osa utiliite on paketis opendkim-tools

# apt-get install opendkim-tools

Tundub, et uuemal ajal soovitatakse kasutada /etc/opendkim.conf failis rida

OversignHeaders         From

Muudatused seoses Debian v. 9 Stretch operatsioonisüsteemiga

  • systemd

DNSSEC kasutamine

Kui OpenDKIM sooritab dns-plain päringuid on kirjas selline päis (olgu vastav domeen ise dnssec enabled või mitte)

Authentication-Results: mail.auul.pri.ee; dkim=pass
   reason="1024-bit key; unprotected key"
   header.d=pak-lm.ee header.i=@pak-lm.ee header.b=NWkrz5ch;
   dkim-adsp=pass; dkim-atps=neutral

Selleks, et OpenDKIM hakkaks sooritama dns-sec päringuid, sobib kasutada seadistusfailis sellist rida

ResolverConfiguration   /etc/unbound/unbound.conf

kusjuures failis on nt

# cat /etc/unbound/unbound.conf
server:
  auto-trust-anchor-file: "/var/lib/unbound/root.key"

  domain-insecure: "auul"
  domain-insecure: "moraal"
  domain-insecure: "10.168.192.in-addr.arpa"
  domain-insecure: "1.168.192.in-addr.arpa"
  domain-insecure: "2.168.192.in-addr.arpa"
  domain-insecure: "1.0.10.in-addr.arpa."

  local-zone: "1.168.192.in-addr.arpa." transparent
  local-zone: "2.168.192.in-addr.arpa." transparent
  local-zone: "10.168.192.in-addr.arpa." transparent

forward-zone:
  name: "."
  forward-addr: 10.192.0.53

Kirjas on kirjas selline päis

Authentication-Results: mail.auul.pri.ee; dkim=pass
  reason="2048-bit key; secure key"
  header.d=eugo.ee header.i=@eugo.ee header.b=NzuLt8wP;
  dkim-adsp=pass; dkim-atps=neutral

Unbound protsess võib töötada, aga OpenDKIM seisukohast ei pea töötama. Kuna OpenDKIM kasutab teda nö teegina, siis olgugi, et Unbound logimine võib olla sisse lülitatud seadistusfailist, see ei toimi.

systemd abil teise opendkim protsessi pidamine

systemd abil teise opendkim pn1 nimelise protsessi pidamiseks sobib teha süsteemis sellised muudatused, õieti täiendused (pn1 - projekti nimi 1)

tekitada uus kasutaja:grupp

# groupadd -r opendkimpn1
# useradd -r -g opendkimpn1 -m -d /var/run/opendkimpn1 -s /bin/false opendkimpn1

tekitada iseseisev opendkim võrgunduse seadistusfail ning teha seal asjakohased muudatused (nt kasutada vaba inet porti 8892)

# cp /etc/default/opendkim /etc/default/opendkimpn1

tekitada iseseisev opendkim seadistusfail (esialgu võib selle sisu olla sama mis primaarsel)

# cp /etc/opendkim.conf /etc/opendkimpn1.conf

tekitada systemd seadistusfail

# cp /lib/systemd/system/opendkim.service /etc/systemd/system/opendkimpn1.service

kehtestada systemd muudatused

# systemctl daemon-reload

käivitada teise opendkim protsess

# systemctl start opendkimpn1

Tulemusena töötab kaks opendkim protsessi, erinevate kasutajatena

# ps auxf | less
# ps -U opendkim -o pid,user,cgroup:150,args

Teise opendkim protsessi kasutamiseks postfix seest sobib käivitada sama postfix protsesside komplekt lisaks ühelt portilt

# cat /etc/postfix/master.cf
..
10025      inet  n       -       y       -       -       smtpd
  -o smtpd_milters=inet:localhost:8892
  -o non_smtpd_milters=inet:localhost:8892
...

Kasulikud lisamaterjalid