Syslog
Linux PCs haben standardmäßig einen Syslog-Daemon welcher informationen über das System, den Kernel, und andere Software sammelt und in
Textdateien abspeichert.
Ubuntu hat standardmäßig den rsyslogd
installiert.
Remotelogging
Um dem rsyslogd
zu sagen dass er auch auf der Netzwerkkarte nach Syslog-Meldungen horchen soll muß folgendes konfiguriert werden.
vi /etc/rsyslog.conf
Hier bei folgenden Zeilen die Rauten (#), am Anfang, löschen.
$ModLoad imudp $UDPServerRun 514 $ModLoad imtcp $InputTCPServerRun 514
Danach den Daemon neustarten.
service rsyslog restart
Logdateien separieren
Auf verschiedene Weise können die einzelnen Syslog-Meldungen in verschiedene einzelne Textdateien geschrieben werden.
Hier sind einige Möglichkeiten aufgezählt.
Es macht Sinn eigene Regelwerke in einer eigenen Konfigurationsdatei abzulegen, welche vor den Standardmäßigen Regelwerken abgearbeitet wird.
Hierfür erstellt man eine Datei unter /etc/rsyslog.d
, nach vorgegebenem Format <NUMMER-NAME>.conf
.
Nimmt man hier eine kleinere Zahl im Dateinamen, als die der Standarddatei (/etc/rsyslog.d/50-default.conf), wird diese Datei mit ihren Regeln vorher abgearbeitet.
Wichtig bei diesen Befehlszeilen sind immer die Zeichen & ~
, diese sagen aus, dass nach dem Abarbeiten der zutreffenden Regel, keine weitere Prüfung auf andere Regeln stattfindet. Wenn die Zeichen nicht angegeben werden, dann greift die spätere Standardregel von rsyslog
welche die Meldungen in die Datei /var/log/syslog
schreibt.
Man hat somit eine doppelte Datenhaltung.
In der 50-default.conf
kann man auch Meldungen in die syslog-Datei ausschließen, in dem die Severity „none“ nach dem Facility-Feld gewählt wird.
Hier ein Beispiel anhand der Meldungen des Facility „mail“:
*.*;mail.none -/var/log/syslog
Hiermit werden die Meldungen vom Postfix, Dovecot, … nicht mehr in die Syslog-Datei geschrieben.
Beispiel:
Hier wird eine ankommende Meldung auf den Hostnamen oder IP-Adresse geprüft. Wenn eines zutrifft wird die Meldung in die angegebene Textdatei gespeichert.
if $fromhost == '<HOSTNAME_ODER_IP>' then <PFAD_ZU_LOG_DATEI> & stop
Hier wird eine ankommende Meldung zusätzlich auf den Nachrichteninhalt geprüft. Wenn hier noch einer der gesuchten Begriffe zutrifft, dann wird separiert.
if $fromhost == '<HOSTNAME_ODER_IP>' and ($msg contains '<BEGRIFF>' or $msg contains '<BEGRIFF>' or $msg contains '<BEGRIFF>') then <PFAD_ZU_LOG_DATEI> & stop
Templates
Templates kann man für verschiedene Zwecke nutzen eine ausführliche Beschreibung findet man bei rsyslog.com.
Folgend findet man Beispiele, wie man Templates einsetzen kann.
MessageFormat
Format einer Syslog Nachricht ersetzt um ein rfc3339 konformes Datum.
template(name="FileFormat" type="list") { property(name="timestamp" dateFormat="rfc3339") constant(value=" ") property(name="hostname") constant(value=" ") property(name="syslogtag") property(name="msg" spifno1stsp="on" ) property(name="msg" droplastlf="on" ) constant(value="\n") }
Man könnte das Template auch wie folgt schreiben (Wichtig: Dabei muss die Definition des Templates in einer einzelnen Zeile geschrieben werden):
template(name="FileFormat" type="string" string= "%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n")
Hier noch ein Beispiel, welches ich verwendet habe um einen Syslogtimestamp durch ein rfc3339 (bei den Logstash-Patterns ist das ein TIMESTAMP_ISO8601) Datum zu ersetzen.
template(name="Daterfc" type="string" string="%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag% %msg%\n") *.* /var/log/syslog;Daterfc
DynamicFileNameFormat
template(name="FileNameDateToday" type="string" string="/var/log/syslog_%$year%-%$MONTH%_%$DAY%.log") *.* ?FileNameDateToday
Nachrichten senden
Mit dem Tool logger
lassen sich Syslog-Nachrichten versenden.
logger -n <IP_OR_HOST> -P <PORT> [--tcp|--udp] -p <FACILITY>.<PRIORITY> -t <SYSLOG_TAG> "<NACHRICHTENTEXT>"
oder mit Netcat (-n: keine neue Zeile; -4: IPv4; -u: UDP; -w: wait)
echo -n "Test" | nc -4 -u -w 1 <IP_OR_HOST> <PORT>
Log-Analyse
Man kann die Textdateien manuell mit cat
, grep
oder tail
untersuchen.
Eine andere schöne Webbasierte Lösung ist LogAnalyzer.
Installiert wird dieser wie folgt:
wget http://download.adiscon.com/loganalyzer/loganalyzer-3.4.3.tar.gz tar xfz loganalyzer-3.4.3.tar.gz cd /var/www mkdir logs cd logs cp -a <PFAD_ZU_ENTPACKTEM_VERZEICHNIS>/src* . chown -R www-data.www-data /var/www/logs
In MySQL muß noch eine Datenbank und ein User angelegt werden.
mysql -uroot -p
Hier folgendes eintippen:
create datebase loganalyzer; GRANT ALL PRIVILEGES ON loganalyzer.* TO 'loganalyzer'@'localhost' IDENTIFIED BY '<PASSWORD>' WITH GRANT OPTION;
Hiernach einfach im Browser die Seite http:<HOSTNAME>/logs aufrufen und den Installer abarbeiten.