Autom. Versand von Log-Dateien per Email: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „Hier sind einige Punkte, die du in deinem MediaWiki-Artikel zum automatischen Versand von Log-Dateien per E-Mail aufnehmen kannst: === Einleitung === Das au…“) |
|||
| (2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
| − | |||
| − | |||
=== Einleitung === | === Einleitung === | ||
| − | Das automatische Versenden von Log-Dateien per E-Mail kann in vielen Szenarien nützlich sein, z. | + | 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 === | === Anforderungen === | ||
| − | * Ein funktionierender Mailserver, z. | + | * Ein funktionierender Mailserver, z. B. Postfix oder Exim |
* Ein Skript zur Verarbeitung und Versendung der Logs | * Ein Skript zur Verarbeitung und Versendung der Logs | ||
* Ein Cronjob oder systemd-Timer zur regelmäßigen Ausführung | * Ein Cronjob oder systemd-Timer zur regelmäßigen Ausführung | ||
| Zeile 14: | Zeile 12: | ||
Falls komplette Log-Dateien regelmäßig per E-Mail versendet werden sollen, kann ein einfaches Skript genutzt werden: | Falls komplette Log-Dateien regelmäßig per E-Mail versendet werden sollen, kann ein einfaches Skript genutzt werden: | ||
| − | < | + | <syntaxhighlight lang="bash"> |
#!/bin/bash | #!/bin/bash | ||
LOGDATEI="/var/log/syslog" | LOGDATEI="/var/log/syslog" | ||
| Zeile 21: | Zeile 19: | ||
cat "$LOGDATEI" | mail -s "$SUBJECT" "$MAILADRESSE" | cat "$LOGDATEI" | mail -s "$SUBJECT" "$MAILADRESSE" | ||
| − | </ | + | </syntaxhighlight> |
| − | * Die Datei | + | * Die Datei /var/log/syslog wird per mail-Befehl versendet. |
* Der Betreff enthält den Hostnamen und das aktuelle Datum. | * Der Betreff enthält den Hostnamen und das aktuelle Datum. | ||
* Voraussetzung: Ein MTA (Mail Transfer Agent) wie Postfix muss eingerichtet sein. | * Voraussetzung: Ein MTA (Mail Transfer Agent) wie Postfix muss eingerichtet sein. | ||
==== Versand von Log-Auszügen mit Filtern ==== | ==== Versand von Log-Auszügen mit Filtern ==== | ||
| − | Falls nur relevante Zeilen aus einer Log-Datei versendet werden sollen, kann | + | Falls nur relevante Zeilen aus einer Log-Datei versendet werden sollen, kann grep oder awk verwendet werden: |
| − | < | + | <syntaxhighlight lang="bash"> |
#!/bin/bash | #!/bin/bash | ||
LOGDATEI="/var/log/auth.log" | LOGDATEI="/var/log/auth.log" | ||
| Zeile 37: | Zeile 35: | ||
grep "Failed password" "$LOGDATEI" | mail -s "$SUBJECT" "$MAILADRESSE" | grep "Failed password" "$LOGDATEI" | mail -s "$SUBJECT" "$MAILADRESSE" | ||
| − | </ | + | </syntaxhighlight> |
| − | * In diesem Beispiel werden nur fehlgeschlagene Login-Versuche aus | + | * In diesem Beispiel werden nur fehlgeschlagene Login-Versuche aus auth.log versendet. |
| − | * Es können weitere Filter, z. | + | * Es können weitere Filter, z. B. für bestimmte Nutzer oder IP-Adressen, hinzugefügt werden. |
==== Komprimierung großer Log-Dateien vor Versand ==== | ==== Komprimierung großer Log-Dateien vor Versand ==== | ||
Falls die Logs sehr groß sind, kann die Datei vor dem Versand komprimiert werden: | Falls die Logs sehr groß sind, kann die Datei vor dem Versand komprimiert werden: | ||
| − | < | + | <syntaxhighlight lang="bash"> |
#!/bin/bash | #!/bin/bash | ||
LOGDATEI="/var/log/syslog" | LOGDATEI="/var/log/syslog" | ||
| Zeile 54: | Zeile 52: | ||
gzip -c "$LOGDATEI" > "$ZIPFILE" | gzip -c "$LOGDATEI" > "$ZIPFILE" | ||
echo "Anbei die komprimierte Log-Datei" | mutt -s "$SUBJECT" -a "$ZIPFILE" -- "$MAILADRESSE" | echo "Anbei die komprimierte Log-Datei" | mutt -s "$SUBJECT" -a "$ZIPFILE" -- "$MAILADRESSE" | ||
| − | </ | + | </syntaxhighlight> |
| − | * Die Datei wird mit | + | * 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. | * Nützlich für große Log-Dateien, um die E-Mail-Größe zu reduzieren. | ||
| Zeile 62: | Zeile 60: | ||
Damit der Versand regelmäßig erfolgt, kann ein Cronjob eingerichtet werden: | Damit der Versand regelmäßig erfolgt, kann ein Cronjob eingerichtet werden: | ||
| − | < | + | <syntaxhighlight lang="cron"> |
0 6 * * * /path/to/logversand.sh | 0 6 * * * /path/to/logversand.sh | ||
| − | </ | + | </syntaxhighlight> |
* Führt das Skript täglich um 06:00 Uhr aus. | * Führt das Skript täglich um 06:00 Uhr aus. | ||
| Zeile 73: | Zeile 71: | ||
==== Service-Definition (/etc/systemd/system/logversand.service) ==== | ==== Service-Definition (/etc/systemd/system/logversand.service) ==== | ||
| − | < | + | <syntaxhighlight lang="ini"> |
[Unit] | [Unit] | ||
Description=Versand der Log-Dateien per E-Mail | Description=Versand der Log-Dateien per E-Mail | ||
| Zeile 79: | Zeile 77: | ||
[Service] | [Service] | ||
ExecStart=/path/to/logversand.sh | ExecStart=/path/to/logversand.sh | ||
| − | </ | + | </syntaxhighlight> |
==== Timer-Definition (/etc/systemd/system/logversand.timer) ==== | ==== Timer-Definition (/etc/systemd/system/logversand.timer) ==== | ||
| − | < | + | <syntaxhighlight lang="ini"> |
[Unit] | [Unit] | ||
Description=Logversand Timer | Description=Logversand Timer | ||
| Zeile 92: | Zeile 90: | ||
[Install] | [Install] | ||
WantedBy=timers.target | WantedBy=timers.target | ||
| − | </ | + | </syntaxhighlight> |
Nach der Erstellung wird der Timer aktiviert: | Nach der Erstellung wird der Timer aktiviert: | ||
| − | < | + | <syntaxhighlight lang="bash"> |
systemctl enable --now logversand.timer | systemctl enable --now logversand.timer | ||
| − | </ | + | </syntaxhighlight> |
=== Sicherheitshinweise === | === Sicherheitshinweise === | ||
* Log-Dateien können sensible Informationen enthalten. Sie sollten nicht unverschlüsselt über unsichere Kanäle versendet werden. | * 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. | * Falls externe Mailserver verwendet werden, sollte SMTP mit Authentifizierung und TLS genutzt werden. | ||
| − | * Alternativ kann die Log-Datei mit | + | * Alternativ kann die Log-Datei mit gpg verschlüsselt und nur an vertrauenswürdige Empfänger versendet werden. |
| + | |||
| + | === Nur Deltas schicken === | ||
| + | <syntaxhighlight lang="bash"> | ||
| + | #!/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 | ||
| + | </syntaxhighlight> | ||
Aktuelle Version vom 28. März 2025, 06:36 Uhr
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