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