Critical Syslog per Mail

Seit längerer Zeit sammle ich die Syslog Nachrichten von allen möglichen Geräten zentral auf einem Linux Host. Das sind W-LAN Access Points, Loxone Logger, mein NAS usw. Syslogs zentral zu sammeln ist schön, doch eine Benachrichtigung per Mail bei kritischen Events wäre super. Es gibt zwar verschiedene Cloud Dienste wie z.B. loggly aber ich bin gerne Herr über meine Daten.

Ich habe das Thema folgendermaßen gelöst:

  1. Filtern der syslog events nach bestimmten Regeln und Schreiben in eine eigenständige Log-Datei
  2. Veränderungen an der Log-Datei detektieren und ein Script aufrufen.
  3. Das Script schickt eine Mail mit entsprechendem Text.

Für die Grundinstallation des syslog servers empfehle ich einen Blick auf diese Seite: http://www.laub-home.de/wiki/Syslog_Server_unter_Debian_Linux_mit_Rsyslog

1. Syslog Events filtern

In Debian Jessie ist der Standard syslog Daemon der rsyslogd. Eine umfängliche Beschreibung gibt es unter : http://www.laub-home.de/wiki/Syslog_Server_unter_Debian_Linux_mit_Rsyslog

Die zentrale Konfigurationsdatei ist /etc/rsyslog.conf. Hier können die verschiedenen Meldungen über Filter verarbeitet werden. Um nur bestimmte severity level herauszudrehen, habe ich die folgenden Zeile in die rsyslog.conf eingefügt.


*.crit,*.alert,*.emerg /var/log/alert/critical

So werden alle critical, alert und emergency syslog events in die Datei /var/log/alert/critical geschrieben.

2. incron

Da die für mich relevanten Einträge jetzt in einer eigenständigen Datei sind, geht es darum Veränderungen an dieser Datei zu erkennen und entsprechende Aktionen einzuleiten. Dafür habe ich incron genutzt, welches die Möglichkeit bietet Veränderungen am Dateisystem zu erkennen.

Die Infos gibt’s hier: http://inotify.aiken.cz/?section=incron&page=about&lang=en

sudo aptitute install incron

Nun wird es etwas tricky, denn die Konfiguration incron Konfiguration kann über zwei Arten durchgeführt werden.

  1. incrontab Kommandozeilen
  2. Konfigurationsdateien in /etc/incron.d
Since 0.4.0 also system tables are supported. They are located in /etc/incron.d and their commands use root privileges. System tables are intended to be changed directly (without incrontab).

Incrontab Kommandozeile

Die Steuerung der Konfiguration erfolgt über den Befehl incrontab, welcher standardmäßig von keinem Benutzer genutzt werden darf. Zuerst müssen in der Datei /etc/incron.allow die erlaubten Benutzernamen eingetragen werden. Also ganz stumpf die Namen mit anschließendem „Zeilenvorschub“ <Enter> eintragen. Den „Wagenrücklauf“ brauchen wir nicht, weil ist ja kein Windows.

Nun kann der freigeschaltete Benutzer über verschiedenen Parameter incrontab steuern. Das Editieren des user table ist mit -e möglich.

incrontab -e

Danach öffnet sich ein Nano Fenster und nach der folgenden Logik wird dann die Konfiguration eingegeben. Save bei Nano ist übrigens mit CTRL-X möglich.

<Verzeichnis zur Überwachung> <incron Kommando> <auszuführende Aktion>
<path> <mask> <command>

Hier ein Beispiel:

 /var/log/alert IN_MODIFY /opt/scripts/mailsyslog.sh 

Hier eine kurze Tabelle der mask Kommandos:

 IN_ACCESS: File was accessed (read) (*).
 IN_ATTRIB: Metadata changed, e.g., permissions, timestamps, extended attributes, link count (since Linux 2.6.25), UID, GID, etc. (*).
 IN_CLOSE_WRITE: File opened for writing was closed (*).
 IN_CLOSE_NOWRITE: File not opened for writing was closed (*).
 IN_CREATE: File/directory created in watched directory (*).
 IN_DELETE: File/directory deleted from watched directory (*).
 IN_DELETE_SELF: Watched file/directory was itself deleted.
 IN_MODIFY: File was modified (*).
 IN_MOVE_SELF: Watched file/directory was itself moved.
 IN_MOVED_FROM: File moved out of watched directory (*).
 IN_MOVED_TO: File moved into watched directory (*).
 IN_OPEN: File was opened (*)

Konfigurationsdateien in /etc/incron.d

Sehr viel angenehmer finde ich hingegen die Konfiguration über Dateien im folder /etc/incron.d. Hier können Konfigurationsdateien mit einem beliebigen Namen angelegt werden, deren Inhalt bzgl. der Syntax identisch mit der Konfiguration über incrontab -e mit Nano ist.

Ich habe z.B. die Datei watch_var_log_alert angelegt, welche den folgenden Inhalt hat.

 /var/log/alert IN_MODIFY /opt/scripts/mailsyslog.sh 

3. Script mit Mail

Nun kommt die Exekutive zum Einsatz, also das Script welches die Informationen per Mail verschickt. Voraussetzung ist natürlich, dass der EMail versandt bereits vollständig und korrekt konfiguriert worden ist.


#!/bin/bash
# mailsyslog.sh
# by automatenkarl - www.automaten-karl.de
# Version 0.2
# recent Changes
# 01. - Initial File
# 02. - Added functionality to e-mail only the last 10 lines of the critical log file
# ----------------------------
# set variables

sender_address="Syslog_Daemon"
receiver_address="systems@mydomain.info"
header="Critical Syslog Event"
default_body="A critical syslog event has occured.\nPlease check the following last 10 lines of the syslog protocol.\n\n------------------------------------------------------------\n"
filename="/root/bin/mailsyslog.sh"
syslogfile="/var/log/alert/critical"
body=$default_body

# Number of lines to be sent via e-Mail
nolines=10

# Determine in which line to start the extraction of the log file in order to e-mail only the last $nolines defined.
totallines=`wc -l &lt; $syslogfile`
startline=`expr $totallines - $nolines`
t=0

# Fill the body of the e-mail with only the $nolines lines defined.

while read line;
do
if [ "$t" -ge "$startline" ];
then
body=$body"\n"$line
fi
t=$(($t+1))
done &lt; $syslogfile

str="uuencode $filename"
#echo $str
#echo -e "$body"

# e-Mail with syslog information in body
(echo -e "$body") | mail -s "$header" "$receiver_address" -- -F"$sender_address"

# e_Mail with syslog information in attachment
# echo |(eval ${str}) | mail -s "$header" "$receiver_address" -- -F"$sender_address"

Testen

Ein Test mit logger zeigt, ob es geht oder nicht.

logger -p local0.crit "Achtung Achtung  - foobar foobar"

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert