Hier das Howto über einen Log-Server, aufbauend auf Syslog-NG.
Fragen, Anmerkungen sowie Verbesserungen sind ausdrücklich erwünscht
— 12.09.2005 21:13
Um ein mittleres bis großes heterogenes Netzwerk optimal verwalten zu können, ist es mitunter sinnvoll, einen dedizierten Logging-Server zu installieren, auf dem sämtliche Logging-Nachrichten der wichtigsten Rechner/Server zentral zusammenlaufen. Analyse und Fehlersuche im Netzwerk ist durch eine solche Lösung effektiver, effizienter und außerdem mit erheblichen Zeitersparnissen gegenüber einem dezentralen System verbunden.
Dieser Server empfängt über seine Netzwerkschnittstelle sämtliche von anderen im Intranet befindlichen Servern generierten Statusmeldungen, die sogenannten Log-Files. Diese Informationen werden über einen festgelegten Port versendet und empfangen. Möglich wird dies durch den neuen syslog-Daemon syslog-ng (ng = new generation), der inzwischen Einzug auf vielen UNIX-basierenden Betriebssystemen hält. Dieser umkonfigurierte syslog-ng-Daemon des Log-Servers „lauscht“ auf einem definierten Port auf ankommende UDP-Pakete und leitet diese in eine Fifo-Pufferdatei um. Die Logging-Informationen aus den empfangenen Paketen werden durch ein Template in eine Datenbank-konforme Syntax gebracht und der passende INSERT-Befehl hinzugefügt. Mittels eines Shellscripts, dass als Daemon im Hintergrund läuft, wird die Fifo-Datei kontinuierlich überwacht, direkt ausgelesen, und neue Inhalte sofort an die MySQL-Datenbank weitergeleitet. Auf dem Server läuft weiterhin ein Apache2-Webserver mit PHP4-Unterstützung. Für eine sowohl grafische als auch benutzerfreundliche Ausgabe der in den Tabellen der Datenbank gespeicherten Log-Dateien werden diese per PHP direkt ausgelesen und mittels einem HTML-Frontend übersichtlich ausgegeben. Verschiedene Möglichkeiten der Sortierung und Filterung der gewünschten Datenausgabe sind ebenso gegeben. Um die Log-Nachrichten auf Clientseite an den Server weiter zu leiten, wird auf Linux-Systemen eine Zeile in der entsprechenden syslog-Konfigurationsdatei hinzugefügt, auf Windows-Rechnern ein kleiner Client installiert. Das gesamte System läuft in „Echtzeit“ ab und die hier verwendete Software ist Freeware bzw. steht unter GPL-Lizenz.
Die beschriebene Installation ist nicht allgemein gültig. Je nach verwendeten Distributionen und Programmversionen kann die Einrichtung eines solchen Log-Servers von dieser Anleitung abweichen. Deshalb bitte immer die den verschiedenen Paketen beigelegten Dokumente lesen und gegebenenfalls berücksichtigen.
⇒ Das Projekt ist scheinbar nach http://code.google.com/p/php-syslog-ng/ umgezogen. Dort gibt es die Version 2.9.3f, die auch einen Web-Installer enthält.
⇒ Die verwendete Software ist Bestandteil der vorliegenden Suse Linux Distribution. Wer auf Aktualität besteht, kann sich die Sourcen selbstverständlich auch auf den oben angegebenen Seiten im Internet herunterladen und „per Hand“ Konfigurieren-Kompilieren-Installieren.
⇒ Nur die beiden Pakete php-syslog-ng und ntsyslog-1.13 wurden nachträglich installiert.
Wie schon anfangs beschrieben handelt es sich hierbei um ein heterogenes Netzwerk mit auf WindowsNT bzw. UNIX basierenden Betriebssystemen. Da beide Seiten unterstützt werden sollen, wird für Windows-Maschinen das kleine Tool ntsyslog-1.13 genutzt, um die Log-Dateien weiterzuleiten. (Alternative: http://www.kiwisyslog.com/). Weiterhin sollte beachtet werden, dass auf Linux-Rechnern mit älteren Distributionen möglicherweise noch kein syslog-ng verwendet wird.
Achtung: Die Synchronisation auf einen Schlag ist nicht zu empfehlen, da viele Protokolle damit nicht klarkommen. Gerade in Netzen in denen Kerberos verwendet darf man nur beim System(Re)Boot einmalig hart syncronisieren.
Besser ist es generell einen NTP-Client zu verwenden, der die Zeit ständig up2date hält und im Fehlerfall langsam wieder angleicht. Dazu ist ein zentraler NTP-Deamon im Netz zu implementieren mit dem sich dann alle Rechner synchronisieren. In heterogenen Netzen eignet sich ein Windows-Domänencontroller am besten, da sich die Windows-Systeme dort standardmässig ihr Zeit holen (sollten).
Unter *nix-betriebssystemen verwende ich ntp-simple oder openntpd, mehr Info hier: http://www.ntp.org/ntpfaq/NTP-a-faq.htm
*.* @<IP_LogServer/DNS_NAME>
destination log_udp { udp(„<IP_LogServer/DNS_NAME>“ port(514));};
log { source(src); destination(log_udp);};
oder alternativ über tcp :)
destination log_tcp { tcp(„<IP_LogServer/DNS_NAME>“ port(514));};
log { source(src); destination(log_tcp);};
Die Syslog-Clients auf den windowsbasierten Systemen werden als Dienst installiert. Die Konfiguration der Programme ist recht einfach und bezieht sich im wesentlichen darauf, den Syslog-Server als Ziel einzutragen und die Protokolle auszuwählen, die weitergeleitet werden sollen.
Hier sind 2. Syslog-Clients:
SYSLOG_DAEMON=“syslog-ng“
um sicher zu stellen, dass der neue syslog-ng Daemon aktiviert ist.
yast → System > Runlevel-Editor > Expertenmodus → mysql in den Runleveln 2, 3 und 5 starten.
tar xvzf phpsyslogng-2.8.tar.gz
cd phpsyslogng-2.8
define (´DEFAULTLOGTABLE´, ´logs´); define (´DBUSER´, ´sysloguser´); define (´DBUSERPW´, ´<password>´); define (´DBADMIN´, ´syslogadmin´); define (´DBADMINPW´, ´<password>´); define (´DBNAME´, ´syslog´); define (´DBHOST´, ´localhost´); deine (´DBPORT´, ´3306´); define(´URL´, ´http://<IP_LogServer>/´);
/etc/syslog-ng/syslog-ng.conf anfügen und gegebenenfalls editieren:
source src {
internal();
unix-dgram("/dev/log");
};
source net {
udp(ip("0.0.0.0") port(514));
};
destination d_mysql {
pipe("/var/log/mysql.pipe"
template("INSERT INTO logs
(host, facility, priority, level, tag, datetime, program, msg)
VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', '$TAG',
'$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC','$PROGRAM', '$MSG' );\n")
template-escape(yes));
};
log {
source(net);
destination(d_mysql);
};
INSERT INTO user (Host, User, Password) VALUES ('localhost','sysloguser',
password('PW_HERE'));
INSERT INTO db (Host, Db, User) VALUES ('localhost','syslog','sysloguser');
INSERT INTO user (Host, User, Password) VALUES ('localhost','syslogfeeder',
password('PW_HERE'));
INSERT INTO db (Host, Db, User) VALUES ('localhost','syslog','syslogfeeder');
INSERT INTO user (Host, User, Password) VALUES
('localhost','syslogadmin',password('PW_HERE'));
INSERT INTO db (Host, Db, User) VALUES ('localhost','syslog','syslogadmin');
mysql –u root –p < dbsetup.sql
mkfifo /var/log/mysql.pipe
#!/bin/bash # # sqlsyslogd This is a daemon that takes syslog-ng input and pipe it into # a MySQL database. # # chkconfig: 2345 92 10 # description: sqlsyslogd bridges syslog-ng and mysql. # author: Josh Kuo Thu 2004/08/12 13:21:56 PDT # Unter Suse nicht verfügbar, nicht relevant. #. /etc/rc.d/init.d/functions case "$1" in start) if [ -x /var/log/mysql.pipe ]; then mkfifo /var/log/mysql.pipe else # if the service is already running, do not start another one PIDS=`pidofproc mysql` if [ "$PIDS" ]; then printf "sqlsyslogd is already running.\n" exit 1 fi mysql -u syslogfeeder --password=<password> syslog < /var/log/mysql.pipe & fi ;; stop ) killproc mysql ;; *) printf "Usage: sqlsyslogd {start|stop}\n" exit 1; esac exit 0;
cat /var/log/mysql.pipe
16:29:31.420429 IP <IP_client>.syslog > <LogServer>.syslog: UDP, length: 49 16:29:31.420543 IP <IP_client>.syslog > <LogServer>.syslog: UDP, length: 30 16:29:31.429269 IP <IP_client>.syslog > <LogServer>.syslog: UDP, length: 73
config/ css/ includes/ scripts/ index.php