Autom. Versand von Log-Dateien per Email: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
(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:
Hier sind einige Punkte, die du in deinem MediaWiki-Artikel zum automatischen Versand von Log-Dateien per E-Mail aufnehmen kannst:
 
 
 
=== Einleitung ===   
 
=== 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.
+
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. B. Postfix oder Exim   
+
* 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:
  
<pre>
+
<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"
</pre>
+
</syntaxhighlight>
  
* Die Datei `/var/log/syslog` wird per `mail`-Befehl versendet.   
+
* 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 `grep` oder `awk` verwendet werden:
+
Falls nur relevante Zeilen aus einer Log-Datei versendet werden sollen, kann grep oder awk verwendet werden:
  
<pre>
+
<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"
</pre>
+
</syntaxhighlight>
  
* In diesem Beispiel werden nur fehlgeschlagene Login-Versuche aus `auth.log` versendet.   
+
* 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.   
+
* 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:
  
<pre>
+
<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"
</pre>
+
</syntaxhighlight>
  
* Die Datei wird mit `gzip` komprimiert und mit `mutt` als Anhang versendet.   
+
* 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:
  
<pre>
+
<syntaxhighlight lang="cron">
 
0 6 * * * /path/to/logversand.sh
 
0 6 * * * /path/to/logversand.sh
</pre>
+
</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) ====
<pre>
+
<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
</pre>
+
</syntaxhighlight>
  
 
==== Timer-Definition (/etc/systemd/system/logversand.timer) ====
 
==== Timer-Definition (/etc/systemd/system/logversand.timer) ====
<pre>
+
<syntaxhighlight lang="ini">
 
[Unit]
 
[Unit]
 
Description=Logversand Timer
 
Description=Logversand Timer
Zeile 92: Zeile 90:
 
[Install]
 
[Install]
 
WantedBy=timers.target
 
WantedBy=timers.target
</pre>
+
</syntaxhighlight>
  
 
Nach der Erstellung wird der Timer aktiviert:
 
Nach der Erstellung wird der Timer aktiviert:
  
<pre>
+
<syntaxhighlight lang="bash">
 
systemctl enable --now logversand.timer
 
systemctl enable --now logversand.timer
</pre>
+
</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 `gpg` verschlüsselt und nur an vertrauenswürdige Empfänger versendet werden.
+
* 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"
  
Falls du Ergänzungen möchtest, sag Bescheid!
+
    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