Syslog-NG

Debian Swirl

http://www.black-board.net
Es ist nicht gestattet dieses Tutorial losgelöst von dem Namen BlackBoard und der URL zu verbreiten.


Das Tutorial befindet sich noch in der Entwicklung. Wenn du mitwirken möchtest, melde dich hier.
Dies ist ein Aufruf - wenn du Ahnung hast, mach mit!



1. Was ist Syslog-NG?


Eine der wichtigsten Funktionen eines Computers ist ein funktionierendes Log-System, es dient dem Festhalten besonderer Ereignisse um so bevorstehende Probleme vorherzusehen oder Fehler genauer zu analysieren. Auf den meisten Systemen läuft bis heute der klassische Syslog-Daemon (syslogd), dessen Grunddesign sich seit 1983 nicht wesentlich geändert hat. Syslogd ist heute aber nur noch selten den Anforderungen der Logbuchverwaltung gewachsen, Hauptkritikpunkt ist hier meistens die unflexible Konfiguration über die Datei /etc/syslog.conf. Er kann Meldungen nämlich nur nach 2 Kriterien filtern: anhand der Facility (Ursprungsdienst) und der Priority (Dringlichkeit). Um einige der Kritikpunkte aus der Welt zu schaffen wurde Syslog-NG (NG steht für Next Generation) enwickelt. Die Vorteile von Syslog-NG liegen vor allem in der erweiterten Filterfunktionalität und bei der Verwendung eines zentralen Log-Servers innerhalb eines Netzwerks.

Bedingt durch die große Anzahl an Konfigurationsmöglichkeiten werden in diesem Tutorial nur einige Optionen beschrieben. Weitere Beschreibungen zu den Optionen befinden sich als Kommentar in /etc/syslog-ng/syslog-ng.conf oder in der zugehörigen ManPage: man syslog-ng.conf


2. Installation


Die Installation des Paketes erfolgt mit dem Befehl:

apt-get install syslog-ng

Bei der Installation von Syslog-NG wird der klassische Syslog-Daemon entfernt, dies betrifft die Pakete klogd und sysklogd.

Während der Installation treffen folgende Meldungen in der Datei /var/log/messages ein:

Aug 4 23:01:24 thor kernel: Kernel logging (proc) stopped.
Aug 4 23:01:24 thor kernel: Kernel log daemon terminating.
Aug 4 23:01:25 thor exiting on signal 15
Aug 4 23:01:28 thor syslog-ng[4637]: syslog-ng version 1.6.8 starting


Jetzt sollte syslog-ng mit einer äquivalenten Konfiguration zu syslogd laufen. Die Funktion lässt sich leicht mit dem Programm logger testen:

logger -p kern.warn "Dies ist ein Test"

Dieser Befehl erzeugt in der Datei /var/log/messages folgende Nachricht:

Aug 5 00:37:01 thor he: Dies ist ein Test


3. Funktionsweise


Wie man der Grafik leicht entnehmen kann, ist Syslog-NG genauso wie sein Vorgänger nicht nur auf lokale Anwendungen beschränkt. Wird die Quelle entsprechend konfiguriert kann Syslog-NG durchaus auch mehrere source-Einträge verarbeiten (siehe auch 4.2). Um den Netzwerkverkehr zu minimieren bietet es sich an, die Daten bereits auf dem Client vorzufiltern und die verbleibenden Daten dann an den Loggingserver zu senden.

Neben der Art, wie mit den Daten umgegangen wird, gibt es noch einen weiteren Unterschied zum klassischen syslog: syslog-ng meldet sich nicht wie gewohnt alle 20 Minuten, sondern alle 10 Minuten in /var/log/messages mit dem Eintrag:

Aug 5 00:01:30 thor syslog-ng[4637]: STATS: dropped 0

Diese Meldung soll dem User lediglich anzeigen, dass Syslog-NG noch funktioniert, da nicht ständig irgendwelche Meldungen vom System produziert werden.


4. Konfiguration


Die Konfiguration erfolgt über die Datei /etc/syslog-ng/syslog-ng.conf. Die Konfigurationsdatei wirkt auf den ersten Blick wesentlich komplexer als die vom syslogd gewohnten Einstellungen, sie folgt jedoch einem einfachen Prinzip: Logmeldungen entstammen definierten Quellen (source) und werden auf definierten Zielen (destination) ausgegeben. Die Unterscheidung der Meldungen übernehmen hierbei die Filter (filter). Die Syntax ist an Sprachen wie C/Java/PHP angelehnt und sehr einfach gehalten.

Das Konfiguartionsfile lässt sich in 5 Bereiche aufteilen:

  • options { option; option; .. };
    Festlegung globaler Optionen
  • source <identifier> { source-driver(params); .. };
    mit jeder source-Zeile wird eine syslog-Quelle festgelegt
  • destination <destname> { destdriver params; destdriver params; ... ; };
  • filter <identifier> {expression; .. };
  • log log { source S1; ... filter F1; ... destination D1; ... };

4.1 options

Übersicht: Globale Optionen
Option Beschreibung
sync(Nummer) Anzahl der gepufferten Zeilen, bevor die Nachricht auf die Festplatte geschrieben wird
log_fifo_size(Nummer) Anzahl der Zeilen im Ausgabepuffer
chain_hostnames(yes/no) Bei aktiviertem chain_hostnames hängt Syslog seinen eigenen Hostnamen an den des Hosts an, welcher die Nachricht generiert hat
keep_hostname(yes/no) Umschreiben der Hostnamen
check_hostname(yes/no) prüft Hostnamen auf ungültige Hostnamen
use_dns(yes/no) gibt an, ob der Daemon den DNS benutzen soll; Während einer DNS-Anfrage blockiert Syslog, so dass sichergestellt ist, dass alle Hosts, die Nachrichten an den Server absetzen können, auflösbare Namen besitzen
dns_cache(yes/no) gibt an ob DNS-Antworten zwischengespeichert werden sollen
dns_cache_size(Nummer) Anzahl der gepufferten Hostnamen
dns_cache_expire(Nummer) Angabe in Sekunden, wie lange ein gepufferter Hostname im Cache verbleiben soll
dns_cache_expire_failed(Nummer) Angabe in Sekunden, die ein fehlgeschlagener Query im Cache verbleiben soll
use_fqdn(yes/no) Nutzung vollständiger Domainnamen, anstelle kurzer Hostnamen
stats(Nummer) Anzahl in Sekunden zwischen 2 Statistiken

4.2 source

Eine typische Quellendefinition, die lokal erzeugte Nachrichten entgegen nimmt, sieht folgendermaßen aus:


source s_all {
internal();
unix-stream("/dev/log");
file("/proc/kmsg" log_prefix("kernel: "));
};

Der Eintrag internal(); ist dabei dringend notwendig um die Funktion von Syslog-NG sicherzustellen. Das Auslesen der Datei /proc/kmsg, über die Kernelmeldungen zum Deamon gelangen, ersetzt dabei den vom klassischen syslogd bekannten klogd. Zur besseren Einordnung wird der Präfix kernel: vor jeder Kernelmeldung eingefügt.

Bei entsprechender Quellendefinition nimmt Syslog-NG auch Nachrichten aus dem Netz entgegen.


source s_net {
udp(ip("192.168.0.1"));
tcp(ip("192.168.0.1"));
};

Mit diesem Eintrag wird Syslog-NG an die IP-Adresse 192.168.0.1 (Achtung: dies ist die Adresse des Servers) gebunden und zwar sowohl über UDP als auch über TCP, was dem Verlust von Nachrichten vorbeugt. Standardmäßig lauscht der Daemon auf Port 514, über die Direktive port(...) kann er jedoch auf einen anderen Port verwiesen werden. Die Option max-connections(...) beschränkt zudem die Anzahl der simultanen Verbindungen, hier liegt der Defaultwert bei 10 gleichzeitigen Verbindungen.


4.3 destination

Syslog-NG definiert die Ausgabe in sogenannten destinations, in welche die verarbeiteten Logmeldungen geleitet werden. Die einfachste Form sieht dabei foldendermaßen aus:


destination df_kern {
file (
"/var/log/kern.log"
owner("root")
group("root")
perm(0640)
);
};

Entsprechend dieser Direktive schreibt Syslog-NG alle Meldungen, die an die destination df_kern übergeben werden, in die Datei /var/log/kern.log, welche ggf. mit den entsprechenden Rechten angelegt wird. Neben file werden noch weitere Ausgabearten unterstützt, so können z.B. Logmeldungen an eine Named Pipe übergeben und beispielsweise von Programmen wie xconsole verarbeitet werden:


destination dp_xconsole {
pipe("/dev/xconsole");
}

Es ist auch möglich sich wichtige Nachrichten direkt auf die Konsole schicken zu lassen:


destination du_admin {
usertty("root");
usertty("user_xy");
};

Der Deamon kann die Nachricht aber auch an einen zentralen Loggingserver senden, und zwar sowohl über UDP als auch über TCP:


destination server {
udp ("192.168.0.1");
};

In diesem Beispiel wird die Meldung per UDP an den Server mit der IP 192.168.0.1 an den Port 514 (default) gesendet.

Übersicht: Variablenexpansion
Option Beschreibung
FACILITY Name des Ursprungsdienstes, welcher die Nachricht abgeschickt hat
PRIORITY/LEVEL Priorität mit der die Nachricht markiert wurde
TAG FACILITY + PRIORITY als 2-stelliger HEX-Wert
DATE Datum der Nachricht
FULLDATE Datum im langen Datumsformat
ISODATE Datum im ISO-Format
YEAR Jahr in dem die Nachricht erzeugt wurde
MONTH Monat in dem die Nachricht erzeugt wurde
DAY Tag an dem die Nachricht abgeschickt wurde
WEEKDAY Wochentag (Mon, Tue, Wed, Thu, Fri, Sat, Sun)
HOUR Stunde
MIN Minute
SEC Sekunde
TZOFFSET Zeitzonendifferenz zu GMT, z.B. +0100
TZ Abkürzung der Zeitzone, z.B. GMT oder CEST
HOST Hostname des sendenden Clients
FULLHOST langer Hostname
PROGRAM Name des Programms das die Nachricht erzeugt hat
MSG/MESSAGE Nachrichtentext inkl. des Programmnamens und der PID
MSGONLY nur der Nachrichtentext

Bei einer großen Anzahl von Rechnern ist es sinnvoll jeden Rechner in ein eigenes Logfile schreiben zu lassen um die Übersicht zu bewahren. Innerhalb einer file-destination expandiert Syslog-NG dafür zahlreiche Variablen, um z.B. automatisch eine Verzeichnisstruktur anzulegen:


destination df_hosts {
file (
"/var/log/$HOST/logfile"
owner("root");
group("root");
perm(0640);
create_dirs(yes)
dir_perm("600")
dir_owner("root")
dir_group("root")
);
};

Syslog-NG bietet auch die Möglichkeit das Format der Logdateien zu ändern (Achtung: viele Loganalyse-Werkzeuge haben Probleme mit nicht-standardkonformen Formaten) oder als destination ein anderes Programm zu wählen, welches die Logs weiterverarbeitet (so könnten die Logs z.B. in einer MySQL-DB gespeichert werden).


destination mysql {
program (
"/usr/bin/log_to_mysql.sh"
template("$HOUR $MIN $MSG")
template_escape(yes)
);
};

Mit der Direktive program werden die Meldungen an das Skript log_to_mysql.sh übergeben, template ermöglich dabei die Definition einer eigenen Logvorlage. Der Parameter template_escape sorgt dafür das alle Anführungszeichen innerhalb der Nachricht durch entsprechende Escape-zeichen maskiert werden.


4.4 filter

Sämtliche Ein -und Ausgaben wären sinnlos, könnte man sie nicht strukturieren. Hierfür hat Syslog-NG die Filterdirektiven. Die Logmeldungen durchlaufen im Filter eine Folge logischer Abfragen, in denen Nachrichten verworfen oder durchgelassen werden. Hierbei erlaubt Syslog-NG zahlreiche verschiedene Filter- optionen vom Hostnamen bis hin zu regulären Ausdrücken. Natürlich sind auch logiche Verknüpfungen möglich.

Übersicht: Filterfunktionen
Funktion Aufruf Beschreibung
facility facility(facility[,facility]) trifft auf eine der aufgelisteten Facilities zu (siehe Übersicht: facility)
priority level(pri[,pri1...pri2[pri3]) trifft auf Nachrichten der aufgelisteten Prioritäten zu (siehe Übersicht: priority)
program program(regexp) vergleicht das Programmfeld mit dem regulären Ausdruck
host host(regexp) vergleicht den Hostnamen mit dem regulären Ausdruck
match match(regexp) vergleicht die Nachricht selbst mit dem regulären Ausdruck
filter filter(filtername) Aufruf einer anderen Filterregel um ihre Auswertung zu verarbeiten
netmask netmask(ip/maske) prüft ob der Absender im angegebenen Subnetz liegt
and, or, not logisches UND, ODER, NICHT

Übersicht: facility
Einrichtung Beschreibung
kern der Kernel
user Benutzerprozesse
cron Cron-Deamon
mail das Mail-Subsystem
news News-Subsystem
uucp UUCP-Subsystem
lpr das Drucker-Subsystem
daemon Serverprozesse des Systems
auth Benutzer-Authentifizierungssystem (nicht-sensible Daten)
authpriv Benutzer-Authentifizierungssystem (sensible Daten)
local0-7 lokale Einrichtungen, normalerweise sind diese unbenutzt und können vom Administrator für weitere Subsysteme vergeben werden)

Übersicht: priority
Priorität Beschreibung
emerg System-Panik (Notfall)
alert ernsthafte Fehler
crit kritische Fehler, z.B. schwere Gerätefehler
err andere Fehler/normaler Fehler
warn Warnmeldungen
notice nichtkritische Nachrichten
info informative Nachricht/normale Nachricht
debug zusätzliche Infos, die beim Auffinden von Fehlern hilfreich sein könnten


Der folgende Filter lässt alle Nachrichten mit Priorität info, notice und warn durch, wenn diese von einem Ursprungsdienst ungleich auth,authpriv,cron,daemon, mail,news kommen. Des Weiteren werden Messages gefiltert welche den Ausdruck STATS enthalten, z.B. die unter (3) erwähnte Meldung:

Aug 5 00:01:30 thor syslog-ng[4637]: STATS: dropped 0


filter f_messages {
level(info..warn)
and not facility(auth,authpriv,cron,daemon,mail,news)
and not match(STATS);
};

4.5 log

Zum Schluss müssen die drei Komponenten source, filter und destination nur noch zusammengefügt werden. Diesen Schritt erledigt log, es erwartet als Parameter eine oder mehrere Quellen, eventuelle Filter und letztendlich ein oder mehrere Ziele:


log {
source(s_net);
filter(f_net);
destination(df_net);
};

4.6 Namenskonventionen

Innerhalb der Konfigurationsdatei gibt es einige Namenskonventionen, an die sich der User nicht halten muss, welche aber die Übersicht erleichtern.

source s_name
destination d
df_name für Files
dp_name für Pipes
du_name für die Konsole
filter f_name

5. FAQ


5.1 Wie verbinde ich Server und Client?

Client: (siehe auch 4.3 destination)


destination server {
udp ("192.168.0.1");
};

Server: (siehe auch 4.1 source)


source net {
udp (ip("192.168.0.1"));
};

5.2 Kann ich einen syslogd-Client (z.B. Router) mit einem syslog-ng-Server verbinden?

Die Verbindung des syslogd-Clients mit dem Server lässt sich ohne Probleme umsetzen. Die Konfiguration des Servers erfolgt dabei wie im Tutorial beschrieben. Clientseitig muss hier natürlich die Konfigurationsdatei /etc/syslogd.conf angepasst werden, mit @hostname kann man Nachrichten an einen Server senden.


5.3 Lohnt die Installation ohne die Verwendung eines Loggingservers?

Ja, da Syslog-NG nach der Installation mit einer äquivalenten Konfiguration zum klassischem syslogd läuft (der Benutzer merkt hier also anhand der Logs keinen Unterschied) und zudem über bessere Filtermöglichkeiten verfügt, bietet er eigentlich nur Vorteile.


6. root-tail


Für diejenigen die gerne wissen was auf ihrem Rechner passiert aber keine Lust haben ständig in die Logfiles zu schauen, empfiehlt sich das Programm root-tail. Root-tail ist ein Programm, das ein oder mehrere Logfiles direkt auf dem Desktop anzeigen kann. Die Handhabung des Programms ist sehr einfach und kann der Homepage oder der Man-Page entnommen werden (immerhin ist dies kein Tutorial zu root-tail).

An dieser Stelle sei nur darauf hingewiesen das der normale User keinen Zugriff auf die Logfiles besitzt und das Programm also mit

su-to-root -c " Aufruf von root-tail "

gestartet werden muss (Anführungszeichen nicht vergessen).


7. Links und Verweise


Homepage von Syslog-NG: http://www.balabit.com/products/syslog_ng/

O'Reilly "Building Secure Servers with Linux"
Probekapitel "Chapter 10:System Log Management and Monitoring":
http://www.oreilly.com/catalog/bssrvrlnx/chapter/ch10.pdf

Homepage von root-tail: http://www.goof.com/pcg/marc/root-tail.html

Verfasser


Letzte Aktualisierung 22.06.2006 von HazardEvil