ParseDMARC zum Analysieren von Berichten

Letzte Aktualisierung am 23.04.2023, 12:04:23 Uhr

Domain-based Message Authentication, Reporting and Conformance (DMARC) ist eine Spezifikation, die entwickelt wurde, um den Missbrauch von E-Mails zu reduzieren, wie er etwa bei Mail-Spoofing vorkommt. DMARC versucht einige seit langem bestehende Unzulänglichkeiten im Zusammenhang mit der Authentifizierung von E-Mails zu beheben und wurde bei der IETF zur Standardisierung eingereicht.

DMARC baut auf den Techniken Sender Policy Framework (SPF) und DomainKeys Identified Mail (DKIM) auf, indem es für eine Absender-Domain festlegt, wie das Empfänger-Mailsystem die Authentifizierung von E-Mails durchführen soll und wie im Falle eines Fehlers zu verfahren ist. Während die vorgenannten Techniken beschreiben, wer eine Mail versenden darf (SPF) bzw. sicherstellen, dass diese Mail in bestimmter Weise unverändert vom Absender stammt (DKIM), kann der Absender nach der DMARC-Spezifikation zusätzlich Empfehlungen geben, auf welche Art der Empfänger mit einer Mail umgeht, die in einem oder beiden Fällen nicht den Anforderungen entspricht. Sofern das Empfänger-Mailsystem die DMARC-Spezifikation bei E-Mail-Nachrichten anwendet, ist dadurch eine konsistente Überprüfung der Authentizität dieser E-Mails gesichert.

Die DMARC-Richtlinie für eine Absender-Domain kann das Empfänger-Mailsystem einem Eintrag im Domain Name System (DNS) entnehmen. (Quelle: Wikipedia)

Einleitung

ParseDMARC ist ein Open Source DMARC-Berichtsanalysator, welcher On-Premise (keine Teilung der Daten mit Dritten) installiert und betrieben werden kann. In diesem Artikel wird ParseDMARC auf einem Server eingerichtet, so dass DMARC Berichte von Google, Microsoft, etc.. eingelesen und aufbereitet werden können. ParseDMARC wird in Python entwickelt.

Voraussetzungen

Eine Grundvoraussetzung ist es natürlich, dass für die entsprechende (Sub)Domain auch ein gültiger DMARC Eintrag in der DNZ-Zone angelegt ist. Falls dem nicht so ist, ist dies nun der passende Zeitpunkt dies nachzuholen.

Für die Visualisierung und Speicherung der Daten kommt Elasticsearch und Kibana zum Einsatz. Beide Applikationen benötigen viel Arbeitsspeicher (RAM). Daher ist es empfehlenswert, dass ein Server mindestens 4 GB Ram und 2 CPU Kerne hat. Ich habe mich für den Test für einen Server aus der Hetzner Cloud, CX21 mit Ubuntu 20.04 entschieden.

Für die Erreichbarkeit des Servers habe ich bei meinem Domain Hoster einen A-Eintrag mit dem Namen dmarc01.wydler.eu angelegt.

Grundeinrichtung des Servers

Vorweg sind auch diesem Server grundlegende Konfigurationen vorzunehmen. Zuerst werden Paketquellen als auch installierte Pakete aktualisiert.

apt update
apt upgrade -y

Zeitzone für den Server setzen.

timedatectl
timedatectl set-timezone Europe/Berlin
timedatectl

Installation von Tools.

apt install -y vim htop apt-transport-https gnupg2

Installation und Konfiguration der Firewall.

apt install -y ufw

ufw allow 22
ufw allow 80
ufw allow 443
echo y | ufw enable

Installieren von Elasticsearch und Kibana

ParseDMARC ist ein Befehlszeilenprogramm für die Konsole. Daher sollt mit Hilfe von Elasticsearch und Kibana eine Visualisierung in einer Weboberfläche realisiert werden.

Einbinden der Paket Repository und Aktualisierung.

wget https://artifacts.elastic.co/GPG-KEY-elasticsearch -O ~/GPG-KEY-elasticsearch.key
gpg --no-default-keyring --keyring ~/GPG-KEY-elasticsearch_keyring.key --import ~/GPG-KEY-elasticsearch.key
gpg --no-default-keyring --keyring ~/GPG-KEY-elasticsearch_keyring.key --export > ~/GPG-KEY-elasticsearch.gpg
mv ~/GPG-KEY-elasticsearch.gpg /etc/apt/trusted.gpg.d/elastic-elasticsearch.gpg
rm ~/GPG-KEY-elasticsearch*

echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
apt update

Installation von Elasticsearch und Kibana.

apt install -y default-jre-headless elasticsearch kibana

FQDN in der Konfiguration von Kibana hinterlegen.

cp /etc/kibana/kibana.yml /etc/kibana/kibana.yml.bak
sed -i 's/#server.publicBaseUrl\: \"\"/server.publicBaseUrl\: \"http:\/\/dmarc01.wydler.eu\"/g' /etc/kibana/kibana.yml

Dienste aktivieren, Autostart konfigurieren, Dienste starten.

systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl enable kibana.service

service elasticsearch start
service kibana start

systemctl status elasticsearch
systemctl status kibana

Installation von ParseDMARC

ParseDMARC greift für die Geolokation auf ein Python Modul zurück. Dieses Modul basiert auf MaxMind GeoIP-Datenbank. Der eine oder andere kennt evtl. die freie Version der GeoIP Datenbank. Diese gibt es nach wie vor. Um diese nutzen zu können, muss auf der Internetseite ein kostenloses Benutzerkonto angelegt werden.

Wenn das Benutzer angelegt und aktiviert ist, kann License Key erzeugt werden. Nach der Anmeldung gibt es auf der linken Seite das Navigationsmenü. Im Bereich Account gibts einen Eintrag „Manage License Keys“. Anschließend auf die Schaltfläche „generate new license key“ klicken und den Anweisungen folgen.

Installation von GeoIP auf dem Server.

apt install -y geoipupdate
geoipupdate -V

Nach der Installation muss der erstellten License Key in der Konfiguration des Moduls hinterlegt werden. Zuerst wird eine Kopie der originalen Konfiguration erstellt. Nicht vergessen, in den Zeilen 2 & 3 eure Daten zu hinterlegen!

cp /etc/GeoIP.conf /etc/GeoIP.conf.bak
sed -i 's/AccountID 0/AccountID 123456/g' /etc/GeoIP.conf
sed -i 's/LicenseKey 000000000000/LicenseKey testtesttest/g' /etc/GeoIP.conf

Aktualisierung der Datenbank.

geoipupdate

Installation von Python bzw. PIP.

apt install -y python3-pip

Neuen Benutzer anlegen.

useradd parsedmarc -r -s /bin/false -d /opt/parsedmarc -m

Installation von PIP, den Voraussetzungen und parsedmarc.

sudo -u parsedmarc -H pip3 install --user -U pip --no-warn-script-location
sudo -u parsedmarc -H pip3 install --user -U requests==2.24.0
sudo -u parsedmarc -H pip3 install --user -U testresources
sudo -u parsedmarc -H pip3 install --user -U parsedmarc --no-warn-script-location

Je nach Leistung des Servers kann der Vorgang ein bisschen Zeit in Anspruch nehmen.

ParseDMARC konfigurieren

Der Applikation muss natürlich mitgeteilt, werden woher die Daten bezogen und wo die Daten gespeichert werden sollen.

Neue Konfiguration für ParseDMARC erstellen.

cat << 'EOF' > /etc/parsedmarc.ini
[general]
save_aggregate = True
save_forensic = True
log_file = /var/log/parsedmarc/parsedmarc.log
silent = False
debug = False

[mailbox]
watch = True

[imap]
host = server03.wydler.eu
port = 993
ssl = True
user = dmarc@blog.wydler.eu
password = testtest

[elasticsearch]
hosts = 127.0.0.1:9200
ssl = False

[smtp]
host = server03.wydler.eu
port = 587
ssl = True
user = dmarc@blog.wydler.eu
password = testtest
from = dmarc@blog.wydler.eu
to = info@blog.wydler.eu

EOF

Bitte nicht vergessen die entsprechenden Zugangsdaten, E-Mail-Adressen, etc. anzupassen. Der Bereich SMTP ist nur erforderlich, wenn auch DMARC Berichte jeden Tag an einen Empfänger verschickt werden soll.

Berechtigungen der Konfiguration anpassen.

chown root:parsedmarc /etc/parsedmarc.ini
chmod 640 /etc/parsedmarc.ini

Verzeichnis und Datei für das Logging anlegen.

mkdir /var/log/parsedmarc/
touch /var/log/parsedmarc/parsedmarc.log
chown parsedmarc:parsedmarc /var/log/parsedmarc/ -R

Logrotate für die Logfile anlegen.

cat << 'EOF' > /etc/logrotate.d/parsedmarc
/var/log/parsedmarc/*.log {
    rotate 12
    weekly
    compress
    missingok
}
EOF

Logrotate testen.

logrotate -d /etc/logrotate.d/parsedmarc

Ausführen von ParseDMARC als Systemd-Dienst.

cat << 'EOF' > /etc/systemd/system/parsedmarc.service
[Unit]
Description=parsedmarc mailbox watcher
Documentation=https://domainaware.github.io/parsedmarc/
Wants=network-online.target
After=network.target network-online.target elasticsearch.service

[Service]
ExecStart=/opt/parsedmarc/.local/bin/parsedmarc -c /etc/parsedmarc.ini
User=parsedmarc
Group=parsedmarc
Restart=always
RestartSec=5m

[Install]
WantedBy=multi-user.target
EOF

Änderungen anwenden, Dienste aktivieren und starten.

systemctl daemon-reload
systemctl enable parsedmarc.service

service parsedmarc restart
service parsedmarc status

Nginx als Reverse Proxy einrichten

Standardmäßig kann jeder die Weboberfläche aufrufen, der die Adresse des Servers (dmard01.wydler.eu) kennt. Damit nicht jede Person auf die Daten zugreifen kann, wird ein Authentifizierung mit Hilfe von htpasswd einrichtet.

Installation der Tools.

apt install -y nginx apache2-utils

Zugangsdaten erzeugen und speichern.

htpasswd -c /etc/nginx/htpasswd admin
Hf4?wo3#rD82KEkV

Berechtigungen anpassen.

chown root:www-data /etc/nginx/htpasswd
chmod 640 /etc/nginx/htpasswd

Selbstverständlich ist es heute unabdingbar, dass der Datenverkehr ausschließlich über https abgerufen wird. Daher wird nun Nginx und Certbot für den Abruf des SSL-Zertifikats installiert.

apt install -y nginx certbot python3-certbot-nginx

Abrufen des SSL-Zertifikat bei Let’s Encrypt mit Hilfe von certbot.

certbot certonly --nginx --agree-tos --email webmaster@wydler.eu -d dmarc.wydler.eu --non-interactive --rsa-key-size 4096

Erstellen der Konfiguration für Nginx.

cat << 'EOF' > /etc/nginx/sites-available/kibana.conf
server {
        listen 80;
        listen [::]:80;
        server_name dmarc01.wydler.eu;
        return 301 https://$server_name$request_uri;
}
server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name dmarc01.wydler.eu;


        add_header X-Frame-Options SAMEORIGIN;
        add_header X-Content-Type-Options nosniff;

        auth_basic "Login required";
        auth_basic_user_file /etc/nginx/htpasswd;

        access_log /var/log/nginx/dmarc.wydler.eu.access;
        error_log /var/log/nginx/dmarc.wydler.eu.error;

        location / {
                proxy_pass http://127.0.0.1:5601;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        ssl_certificate /etc/letsencrypt/live/dmarc01.wydler.eu/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/dmarc01.wydler.eu/privkey.pem;

        ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA";
        ssl_prefer_server_ciphers on;

        ssl_ecdh_curve secp521r1:secp384r1:prime256v1;

        resolver_timeout 5s;
        ssl_stapling on;
        ssl_stapling_verify on;

        ssl_session_cache shared:le_nginx_SSL:1m;
        #ssl_session_cache shared:SSL:50m;
        ssl_session_timeout 5m;
        ssl_buffer_size 1400;
        ssl_session_tickets off;

        add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload" always;
}
EOF

Neue Konfiguration für Nginx aktivieren.

ln -s /etc/nginx/sites-available/kibana.conf /etc/nginx/sites-enabled/

Konfiguration prüfen und Nginx neu laden.

nginx -t
systemctl reload nginx

Importieren von ParseDMARC-Objekten in Kibana

Damit im Dashboard von Kibana auch die Daten sinnvoll visualisiert werden, stellen die Entwickler von ParseDMARC eine Objektdatei von Haus aus zur Verfügung. Diese Objektdatei kann in der aktuellen Version hier direkt heruntergeladen werden.

Im Anschluss die Weboberfläche von Kibana anrufen und anmelden. Danach direkt in die Objektverwaltung wechseln (https://dmarc01.wydler.eu/app/management/kibana/objects).

Rechts oben gibt es die Möglichkeit die zuvor heruntergeladene Datei zu importieren. Den Anweisungen des Assistenten einfach folgen.

Um das Kibana-Dashboard mit ParseDMARC zu verwenden, müssen Sie zuerst die ParseDMARC-Objekte importieren. Sie können den folgenden Befehl verwenden, um es auf Ihren lokalen Linux- oder Mac-Computer herunterzuladen.

Ist der Vorgang erfolgreich abgeschlossen, gibt es unter Home -> Dashboard ein neuen Eintrag mit dem Namen DMARC Summary. Diese Dashboard wurde durch den Import automatisch erstellt.

Viel Spaß beim Ausprobieren. 🙂

Abonnieren
Benachrichtige mich bei
0 Comments
Inline Feedbacks
View all comments