Letzte Aktualisierung am 11.03.2023, 22:03:22 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. 🙂