Autom. Versand von Log-Dateien per Email
Einleitung
Das automatische Versenden von Log-Dateien per E-Mail kann in vielen Szenarien nützlich sein, z. B. zur Überwachung von Systemen, zur Fehleranalyse oder zur Benachrichtigung über kritische Ereignisse. Postfix kann in Kombination mit Skripten genutzt werden, um regelmäßig Log-Dateien oder spezifische Log-Einträge an Administratoren zu senden.
Anforderungen
- Ein funktionierender Mailserver, z. B. Postfix oder Exim
- Ein Skript zur Verarbeitung und Versendung der Logs
- Ein Cronjob oder systemd-Timer zur regelmäßigen Ausführung
Methoden zum Versand von Log-Dateien
Versand kompletter Log-Dateien
Falls komplette Log-Dateien regelmäßig per E-Mail versendet werden sollen, kann ein einfaches Skript genutzt werden:
#!/bin/bash
LOGDATEI="/var/log/syslog"
MAILADRESSE="admin@example.com"
SUBJECT="Logfile vom $(hostname) - $(date)"
cat "$LOGDATEI" | mail -s "$SUBJECT" "$MAILADRESSE"
- Die Datei /var/log/syslog wird per mail-Befehl versendet.
- Der Betreff enthält den Hostnamen und das aktuelle Datum.
- Voraussetzung: Ein MTA (Mail Transfer Agent) wie Postfix muss eingerichtet sein.
Versand von Log-Auszügen mit Filtern
Falls nur relevante Zeilen aus einer Log-Datei versendet werden sollen, kann grep oder awk verwendet werden:
#!/bin/bash
LOGDATEI="/var/log/auth.log"
MAILADRESSE="admin@example.com"
SUBJECT="Fehlgeschlagene Login-Versuche - $(hostname)"
grep "Failed password" "$LOGDATEI" | mail -s "$SUBJECT" "$MAILADRESSE"
- In diesem Beispiel werden nur fehlgeschlagene Login-Versuche aus auth.log versendet.
- Es können weitere Filter, z. B. für bestimmte Nutzer oder IP-Adressen, hinzugefügt werden.
Komprimierung großer Log-Dateien vor Versand
Falls die Logs sehr groß sind, kann die Datei vor dem Versand komprimiert werden:
#!/bin/bash
LOGDATEI="/var/log/syslog"
ZIPFILE="/tmp/syslog-$(date +%Y-%m-%d).gz"
MAILADRESSE="admin@example.com"
SUBJECT="Logfile (komprimiert) vom $(hostname)"
gzip -c "$LOGDATEI" > "$ZIPFILE"
echo "Anbei die komprimierte Log-Datei" | mutt -s "$SUBJECT" -a "$ZIPFILE" -- "$MAILADRESSE"
- Die Datei wird mit gzip komprimiert und mit mutt als Anhang versendet.
- Nützlich für große Log-Dateien, um die E-Mail-Größe zu reduzieren.
Automatisierung mit Cron
Damit der Versand regelmäßig erfolgt, kann ein Cronjob eingerichtet werden:
0 6 * * * /path/to/logversand.sh- Führt das Skript täglich um 06:00 Uhr aus.
- Die Log-Dateien werden automatisch per E-Mail versendet.
Automatisierung mit systemd-Timer
Alternativ kann ein systemd-Timer verwendet werden:
Service-Definition (/etc/systemd/system/logversand.service)
[Unit]
Description=Versand der Log-Dateien per E-Mail
[Service]
ExecStart=/path/to/logversand.sh
Timer-Definition (/etc/systemd/system/logversand.timer)
[Unit]
Description=Logversand Timer
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
Nach der Erstellung wird der Timer aktiviert:
systemctl enable --now logversand.timer
Sicherheitshinweise
- Log-Dateien können sensible Informationen enthalten. Sie sollten nicht unverschlüsselt über unsichere Kanäle versendet werden.
- Falls externe Mailserver verwendet werden, sollte SMTP mit Authentifizierung und TLS genutzt werden.
- Alternativ kann die Log-Datei mit gpg verschlüsselt und nur an vertrauenswürdige Empfänger versendet werden.
Nur Deltas schicken
#!/bin/bash
LOGFILE="$1"
STATEFILE="/var/tmp/logtrack.state"
DEST="root"
# Aktuelle inode holen
curr_inode=$(stat -c %i "$LOGFILE")
# Wenn STATEFILE existiert
if [ -f "$STATEFILE" ]; then
read last_inode last_offset < "$STATEFILE"
if [ "$curr_inode" != "$last_inode" ]; then
# Datei wurde rotiert → alles neu schicken
mail -s "Log wurde rotiert: Kompletter Log" "$DEST" < "$LOGFILE"
offset=$(stat -c %s "$LOGFILE")
echo "$curr_inode $offset" > "$STATEFILE"
else
# Nur Delta schicken
tail -c +$((last_offset + 1)) "$LOGFILE" | mail -s "Log-Deltas" "$DEST"
offset=$(stat -c %s "$LOGFILE")
echo "$curr_inode $offset" > "$STATEFILE"
fi
else
# Erstlauf → alles schicken
mail -s "Initialer Logversand" "$DEST" < "$LOGFILE"
offset=$(stat -c %s "$LOGFILE")
echo "$curr_inode $offset" > "$STATEFILE"
fi