OpenDMARC kasutamine operatsioonisüsteemiga Debian

Allikas: Imre kasutab arvutit

Sissejuhatus

DMARC (Domain-based Message Authentication, Reporting & Conformance) https://dmarc.org/ ... OpenDMARC http://www.trusteddomain.org/opendmarc/ ...

Mõisted

  • DMARC - Domain-based Message Authentication, Reporting & Conformance
  • SPF -
  • DKIM -
  • milter - mail filter
  • mail from - smtp protokolli ümbriku 'MAIL FROM' ehk RFC5321.MailFrom ehk envelope
  • header from - kirja sisu From: päis, ehk RFC5322.From ehk header
  • ADSP (Author Domain Signing Practices) - https://en.wikipedia.org/wiki/Author_Domain_Signing_Practices kunagi soovitati, enam mitte ja soovitatakse DMARC kasutajatel ignoreerida
  • SRS

Tööpõhimõte

DMARC abil saab domeeni omanik teha teatavaks, kuidas tema domeenilt pärit (või justkui pärit) kirjade vastuvõtjad peavad peale SPF ja DKIM kontrolle nende kontrollide tulemusi kasutama ja kirju edasi käsitlema. Seega DMARC edukaks kasutamiseks on vaja osaliste vahel koostöö, selle realiseerimine toimub mitmes osas

  • DNS abil DMARC kirje publitseerimine
  • DNS abil DKIM kirje publitseerimine
  • DNS abil SPF kirje publitseerimine
  • kirja väljasaatmine DNS SPF kirjega kooskõlaliselt ip aadressilt
  • välja saadetavale kirjale DKIM signatuuri lisamine
  • 'mail from' ja 'header from' aadressides sama domeeninime kasutamine; ja mis on kooskõlas DKIM ja SPF kirjetega
  • saabunud kirjale DMARC kirje abil teatavaks tehtud reeglite rakendamine

Põhimõtteliselt kasutatakse DMARC'i alati koos DKIM ja SPF tehnikatega. Võiks ette kujutada, et DKIM ja SPF on puhtalt instrumendid, mille abil saab mingeid tegevusi teha; aga DMARC on policy ehk reegel, mis ütleb kuidas konkreetsel juhtumil (domeeni jaoks ja käesoleval ajal) DKIM ja SPF kontrollide tulemusi rakendada.

Väited

  • DMARC domeen on 'header from' eposti aadressis kasutatud domeeninimi, st selle peale toimub 'dig _dmarc.moraal.ee txt' päring
  • kui DMARC kontekstis kasutatakse SPF'i, siis osutub, et 'mail from' ja 'header from' aadresside domeeni osad peavad kokku langema
  • DMARC kontrolli õnnestumiseks peab õnnestuma vähemalt üks, kas SPF või DKIM kontroll (või mõlemad)

DMARC policy rakendamiseks sobib Postfix puhul milter tarkvara opendmarc. Tehniliselt on võimalik opendmarc abil rakendada policy täpselt nii nagu öeldud, nt reject st kontrolli mitte läbinud kirju ei võeta vastu. Kuna nt listserverid on tuntud DKIM lõhkujad (nt nad lisavad kirjade sisu osa lõppu listi signatuuri vms), siis võib olla mõistlikum DMARC kontrolli alusel lisada rohkem või vähem spämmi skoori kirjale.

Kirja väljasaatmine

Kirja väljasaatmisel ei tegele ükski nn DMARC protsess otseselt kirjaga. Küll aga DKIM signatuur lisatakse ja seda vastuvõtja DMARC kasutamisel kasutab.

Tööpõhimõte

Kui oma domeeni eposti on seadistatud kontrollima DMARC, tuleb ise saata kirju välja selliselt, et neid on võimalik vastu võtta

  • publitseerida SPF kirje ja saata kirju vastavalt ip aadressilt ja vastava 'mail from' ja 'header from' aadressiga
  • publitseerida DKIM kirje st võti ja kirju allkirjastada

Tõenäoliselt korrektselt käivitatud vastuvõtja jaoks piisab kirja vastuvõtmiseks üks või teine kontroll. Seejuures piisab ühe kontrolli õnnestumisest, teine võib olla kirjeldamata ja tegemata; või kirjeldatud, tehtud aga valesti tehtud, st teise kontroll ebaõnnestub. Tundub, et GMail on eeskujulik avalik teenusepakkuja, kus on hea kirju vastu võtta ja testida saatmist ja vastuvõtmist.

DNS kirje publitseerimine

Kõige lihtsam DMARC DNS kirje on nt selline (\ märk on seotud dig väljundi näitamisega, iseenesest seda tsoonifailis ei ole)

$ dig _dmarc.moraal.ee txt
_dmarc.moraal.ee.     60      IN      TXT     "v=DMARC1\; p=none"

kus

  • _dmarc.moraal.ee - tegu on domeeni moraal.ee kohta käiva DMARC kirjega
  • v=DMARC1 - tegu on DMARC TXT kirjega
  • p=none - policy on 'none'; alternatiiv ja perspektiiv oleks 'reject'

SPF

  • publitseerida SPF kirje
  • saata kirju välja SPF kirjele vastavalt ip aadressilt
  • kasutada välja saadetud kirjade 'mail from' 'header from' aadresside domeeninime kooskõlaliselt SPF kirjega

DKIM

  • publitseerida DKIM kirje st avalik võti
  • juurutada OpenDKIM abil signeerimine lokaalse Postfix protsessi jaoks

Testimine - kirja vastuvõtmine GMail keskkonnas

Kõigi kontrollide õnnestumisel paistab GMail rakenduses selline pilt

  SPF:	PASS with IP 10.80.127.3 Learn more
 DKIM:	PASS with domain auul.pri.ee Learn more
DMARC:	PASS Learn more

Testimine

  • töötada erinevate 'mail from' ja 'header from' aadressidega
$ sendemail -f imre@netiohud.ee -t imre@eugo.ee -u 'test 109' -m 'test 109' -s 127.0.0.1 -o tls=no -o message-header="From: Imre <forwarder@netiohud.ee>"
  • lülitada lokaalselt töötavas Postfix protsessis sisse ja välja DKIM signeerimist
  • muuta nimesüsteemis DMARC ja SPF kirjete sisu (nt DMARC p=none ja p=reject vahel)
  • kasutada lisaks teiste Postfix protsesse (nt teises arvutis), mis rikub ära DKIM signatuuri kirjutades üle Subject väärtuse

Kirja vastuvõtmine

Kirja vastuvõtmisel DMARC kasutamise tulemuseks võiks olla kirja selline vastuvõtt nagu vastava domeeni omanik (mis esineb kirja 'header from' eposti aadressina) on seda ette näinud. Praktiliselt võiks siseneva eposti spammi skoor vastavalt halveneda või paraneda. Kirja vastuvõtmisel peab praktiliselt arvestama, et kui domeeni omanik on saatnud kirja kuhugi listi ja see jõuab seda kaudu vastuvõtjani, siis listimootor on piisavalt kirja muutnud ja enam ei õnnestu ei DKIM ega SPF kontroll.

Tööpõhimõte

Üldiselt võiks kirja vastuvõtmisel toimuda sellised sammud ja sellises järjekorras

  • SPF kontroll
  • DKIM kontroll
  • DMARC kontroll
  • Spamassassin kontroll

Kõik eelnevad arvutavad oma tulemused ja ükski kirja ei blokeeri. Spamassassin võtab tulemused kokku ja kui spam skoor on liiga suur (nt 15), siis kirja vastuvõtmine blokeeritakse. Igal juhul lisavad kõik kontrollid kirjale omalt poolt päised.

SPF

SPF kontrolli rakendamist kirjeldatakse punktis https://www.auul.pri.ee/wiki/SPF_kasutamine_tarkvaraga_Postfix_operatsioonis%C3%BCsteemis_Debian

Tulemusena on kirjale lisatud selline päis (kui kontroll iseenesest õnnestus (nt opendkim protsess ei krahhinud) ja lõppes positiivselt (Received-SPF: Pass ..))

Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=10.80.127.3;
  helo=smtp-eesti-fwd-2a.test.kit; envelope-from=forwarder@test.eesti.ee; receiver=imre@auul.pri.ee

DKIM

DKIM kontrolli rakendamist kirjeldatakse punktis https://www.auul.pri.ee/wiki/OpenDKIM_kasutamine_Postfixiga

Tulemusena on kirjale lisatud selline päis (kui kontroll lõppes positiivselt)

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

OpenDMARC tarkvara paigaldamine

# apt-get install opendmarc

TODO

  • /etc/default/opendmarc
  • /etc/opendmarc.conf
Seadistamine ja käivitamine
# cat /etc/default/opendmarc
SOCKET="inet:54321"
# egrep -v "^$|^#" /etc/opendmarc.conf
PidFile /var/run/opendmarc.pid
RejectFailures false
Syslog true
SyslogFacility mail
UMask 0002
UserID opendmarc:opendmarc
IgnoreHosts /etc/opendmarc/ignore.hosts

kus

  • TODO
  • /etc/opendmarc/ignore.hosts fail sisaldab
# cat /etc/opendmarc/ignore.hosts
192.168.1.0/24
192.168.10.0/24

Käivitamiseks sobib öelda

# systemctl start opendmarc
Postfix integratsioon

Postfix seadistuses peab DMARC milter asuma peale SPF ja DKIM ja enne Spamassassinit, nt

# MILTERS: CLAMAV, SPAMASSASSIN
smtpd_milters = unix:/clamav/clamav-milter.ctl, inet:localhost:8892, inet:localhost:54321, unix:/spamass/spamass.sock
milter_default_action = accept
milter_protocol = 2
non_smtpd_milters = inet:localhost:8892, inet:localhost:54321

Lisaks võib olla mõistlik muuta internetist tulnud kirja küljes olevad sinna kogunenud Authentication-Results päised ära nö informatiivseteks

# cat header_checks.regexp 
/^Authentication-Results:[[:space:]]+(.*)/ REPLACE X-MORAAL-Original-Authentication-Results: ${1}

ja main.cf

header_checks = regexp:/etc/postfix/header_checks.regexp
Spamassassin integratsioon
# cat /etc/spamassassin/local.cf
..
# dmarc
header DMARC_PASS Authentication-Results =~ /mail.auul.pri.ee; dmarc=pass/
describe DMARC_PASS DMARC validation seems pass
score DMARC_PASS -1.1

header DMARC_NONE Authentication-Results =~ /mail.auul.pri.ee; dmarc=none/
describe DMARC_NONE DMARC validation seems none
score DMARC_NONE 0

header DMARC_FAIL Authentication-Results =~ /mail.auul.pri.ee; dmarc=fail /
describe DMARC_FAIL DMARC validation fail
score DMARC_FAIL 3.7

Kasulikud lisamaterjalid

Logi kasutamine

DMARC paistab mail logis sedasi

# grep dmarc /var/log/mail.log | tail -n 5
Jul 27 23:54:26 post-relay opendmarc[31184]: A7B9562B29: liferay.com none
Jul 27 23:56:47 post-relay opendmarc[31184]: EB3E562B29: faceboomail.com pass
Jul 28 00:00:26 post-relay opendmarc[31184]: D5F4962B29: ee.aso.ee none
Jul 28 00:04:02 post-relay opendmarc[31184]: 720BA62B29: iizi.ee none
Jul 28 00:06:22 post-relay opendmarc[31184]: B000C62B29: gmail.com pass
Testimine

Testimiseks sobib nt võltsida facebootmail.com domeeni kirja

$ sendemail -f priit@facebookmail.com -t imre@auul.pri.ee -u priit -m 'test' -o tls=no
Jul 27 23:22:35 haldus sendemail[19668]: Email was sent successfully!

ja logis paistab see

Jul 27 23:22:35 post-relay opendmarc[31184]: B1CBE62B29: facebookmail.com fail

Eposti kirjas paistab muude päiste hulgas nt selline

Authentication-Results: mail.auul.pri.ee; dmarc=pass header.from=facebookmail.com

Külastada aadressi https://www.mail-tester.com/.

Remailer

DMARC töötamise remaileri kasutamise juhul saab lahendada SRS abil, vt SRS tarkvara postsrsd kasutamine Postfix keskkonnas.

Reporting

DMARC Reporting töötab kahes suunas

  • domeeni omanikule saadavad 'kõik teised' kirju tema domeeni kirjade osas
  • postimasina pidaja saadab kirju 'kõigile teistele' nende domeenide kirjade osas

Domeeni omanikule saadetakse kirju

Selleks, et domeeni omanikule saadaksid 'kõik teised' kirju piisab seadistada dmarc kirje juures parameetrid

  • TODO

Postimasina pidaja saadab kirju

Selleks, et postimasina pidaja saaks 'kõigile teistele' kirju saata, tuleb panna opendmarc protsess salvestama reaga

HistoryFile /var/run/opendmarc/opendmarc.dat

ning seejärel

  • laadida regulaarselt opendmarc.dat failist sisu mysql andmebaasi
  • genereerida baasist väljavõte ja postitada domeeni omaniku poolt _dmarc kirjes näidatud eposti aadressile

Andmebaasi tekitamine

mysql> create database opendmarc character set utf8 collate utf8_general_ci;
mysql> grant all privileges on opendmarc.* to 'opendmarc'@'%' identified by 'parool';
mysql> grant all privileges on opendmarc.* to 'opendmarc'@'localhost' identified by 'parool';
$ mysql -h 192.168.1.18 -u opendmarc -pparool opendmarc < /usr/share/doc/opendmarc/schema.mysql

Tundub, et sellise skriptiga saab sooritada opendmarc.dat faili sisu baasi laadimine, baasist väljavõtte tegemine ja kirjade laiali saatmine

# cat /opt/opendmarc/opendmarc-send-reports.sh 
#!/bin/bash
# Imports data from OpenDMARC's opendmarc.dat file into a local MySQL DB
# and sends DMARC failure reports to domain owners.
# Based on a script from Hamzah Khan (http://blog.hamzahkhan.com/)

set -e

# Database and History File Info
DBHOST='192.168.1.18'
DBUSER='opendmarc'
DBPASS='parool'
DBNAME='opendmarc'
HISTDIR='/var/run/opendmarc'
HISTFILE='opendmarc'

# Make sure history file exists
touch ${HISTDIR}/${HISTFILE}.dat

# Move history file temp dir for processing
mv ${HISTDIR}/${HISTFILE}.dat /tmp/${HISTFILE}.$$

# Import temp history file data and send reports
/usr/sbin/opendmarc-import -dbhost=${DBHOST} -dbuser=${DBUSER} -dbpasswd=${DBPASS} -dbname=${DBNAME} -verbose < /tmp/${HISTFILE}.$$
/usr/sbin/opendmarc-reports -dbhost=${DBHOST} -dbuser=${DBUSER} -dbpasswd=${DBPASS} -dbname=${DBNAME} -verbose -interval=60 -report-email 'dmarc-src@moraal.ee' -report-org 'MORAAL'
/usr/sbin/opendmarc-expire -dbhost=${DBHOST} -dbuser=${DBUSER} -dbpasswd=${DBPASS} -dbname=${DBNAME} -verbose

# Delete temp history file
# rm -rf *.$$

Käivitamine

# ./opendmarc-send-reports.sh 
opendmarc-import: started at Sat Feb 18 13:02:23 2017
opendmarc-import: connected to database
opendmarc-import: updating at line 20
opendmarc-import: updating at line 39

...
opendmarc-import: updating at line 296
opendmarc-import: updating at line 314
opendmarc-import: terminating at Sat Feb 18 13:02:31 2017

Visualiseerimine

Tundub, et 2017 aasta alguses puuduvad üldkasutatavad DMARC raportite visualiseerimise vahendid

Misc

  • domeeni dmarc seadistuse küsimine
# /usr/sbin/opendmarc-check auul.pri.ee
DMARC record for auul.pri.ee:
        Sample percentage: 100
        DKIM alignment: relaxed
        SPF alignment: relaxed
        Domain policy: none
        Subdomain policy: unspecified
        Aggregate report URIs:
                (none)
        Forensic report URIs:
                (none)

Probleemid

  • Tundub, et Ubuntu v. 14.04 paketihaldusest kasutades v. 1.2.0 sureb vahel ära
Feb 18 23:31:20 smtp-2b kernel: [184737.524702] opendmarc[22879]: segfault at 8 ip 0000000000407684 sp 00007ff3cbba4ec0 error 4 in opendmarc[400000+10000]

Kasulikud lisamaterjalid