Syslog Server unter Debian Linux mit Rsyslog

Aus Laub-Home Wiki

Installation Rsyslog

Rsyslog ist ab Debian Lenny standarmäßig als Syslog Daemon installiert. Wenn man aber von einer früheren Debian Version (z.B.: Etch) kommt, muss man diesen nachinstallieren. Wie man an den Meldungen von aptitude sieht wird der andere Syslog Daemon deinstalliert.

aptitude install rsyslog

Konfiguration Rsyslog als Syslog Server

Zur Konfiguration des Rsyslog als Syslogserver lege ich eine Neue Konfigurationsdatei an, in der ich meine gewünschten Syslogserver Einstellungen vornehme: /etc/rsyslog.d/syslogserver.conf

# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

Eigenes Logfile für jeden Syslog Client

Will man nun auf dem Syslog Server ein eigenes Syslog Logfile für jeden einzelnen Host erstellen funktioniert dies so:
/etc/rsyslog.d/syslogserver.conf

# Logfile for each host
$template DynaFile,"/var/log/syslog-%HOSTNAME%.log"
*.* -?DynaFile

Hierbei werden für jeden Host ein Logfile unter /var/log/ erzeugt welches syslog-%HOSTNAME%.log heißt aber trotzdem werden für Debugging Zwecke die Einträge auch nach /var/log/syslog geschrieben.

Eigenes Logfile für einzelne Dienste

Um ein eigenes Logfile zum Beispiel für den Dienst "noflushd" zu erstellen muss man folgendes der Datei
/etc/rsyslog.d/syslogserver.conf anhängen:

# Logfile for noflushd
if $programname == 'noflushd' then /var/log/noflushd

Dienst Logeinträge nicht an Syslogserver schicken

Wenn man zum Beispiel die FTP Logeinträge nicht an den Syslogserver schicken mag kann das mit folgender Zeile getan werden:

*.*,ftp.none                    @192.168.1.1

Lokales Logging deaktivieren

Will man die Logeinträge nur an den Syslog Server schicken, reicht es direkt unterhalb des Syslogeintrages, der als erstes beim den "Rules" stehen sollte, folgende Zeile zu ergänzen:

*.*                             ~

Ab dieser Zeile werden alle Logeinträge einfach weggeschmissen.

Die neuen Logfiles rotieren

Die neu angelegten Logfiles sollten nun natürlich auch noch von Logrotate rotiert werden, damit das System nicht volläuft. Hierzu kann die Datei folgende Datei erstellt werden:
/etc/logrotate.d/rsyslog-newlogs

/var/log/syslog-*.log
{
        rotate 7
        daily
        missingok
        notifempty
        delaycompress
        compress
        postrotate
                invoke-rc.d rsyslog reload > /dev/null
        endscript
}

/var/log/noflushd
{
        rotate 4
        weekly
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                invoke-rc.d rsyslog reload > /dev/null
        endscript
}

Konfiguration Rsyslog als Syslog Client

um alle Logeinträge zum Syslog Server zu schicken muss folgende Zeile in die Konfigurationsdatei eingetragen werden:
/etc/rsyslog.conf Bei der neusten Ubuntu in folgender Datei:
/etc/rsyslog.d/50-default.conf

# für UDP
*.*                             @192.168.1.1
# für TCP
*.*                             @@192.168.1.1

Wo man diese Zeile einfügt ist eigentlich egal, aber das beste ist denke ich wenn man sie vor den lokalen Logdateien einhängt:

.......
#
# First some standard log files.  Log by facility.
#
#Send all to Syslog Server
*.*                             @192.168.1.1

auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                         /var/log/cron.log
.......

Will man das Lokal keine Syslog Logfiles geschrieben werden, sollte man sämtliche Logfile einträge kommentieren:
z.B.: Kein /var/log/syslog:

#*.*;auth,authpriv.none          -/var/log/syslog

Konfiguration Windows Client "Eventlog-To-Syslog"

Man kann auch Windows Systeme in den Syslog Server schreiben lassen, wie das geht wird hier beschrieben:
Windows Eventlog und Syslog Server

Testing

Um das Konstrukt zu testen schaut man sich am besten einfach das syslog Logfile auf dem Syslogserver an:

tail -f /var/log/syslog

und lässt auf einem der Syslog Clients folgenden Befehl los:

logger "Es funktioniert"

Im Syslog sollte dann dies auftauchen:

May 15 10:47:11 hostname root: Es funktioniert

Rsyslog mit MYSQL Anbindung und PHPLogcon

Rsyslog und Mysql

Unter Debian ist dies recht simpel, einfach folgenden Befehl ausführen und die Pakete installieren.

aptitude install rsyslog-mysql

Es wird hierbei ein eigener MySQL Server installiert und dort eine Datenbank Namens Syslog angelegt, in die nun der Rsyslog Dienst die Einträge schreibt. Man wird lediglich nach 2 Passwörtern gefragt, die man sich auf jedenfall merken sollte.
Zum testen des Konstruktes kann man sich zur Datenbank verbinden und nachschauen ob die Tabelle SystemEvents Einträge bekommt.

mysql -u root -p PASSWORT

Dann in der MySQL Konsole

use Syslog;
select * from SystemEvents;

Rsyslog und ein nicht lokaler MySQL Server

Will man wie ich einen bereits vorhandenen MySQL Server im Netzwerk nutzen, wird es ein wenig komplizierter. Als erstes braucht man den mysql-client:

aptitude install mysql-client

Nun sollte man prüfen ob der MySQL Benutzer "root" sich auch vom SyslogServer verbinden darf:

mysql -u root -p PASSWORT -h 192.168.1.1

mit "quit" kommt man nach einer erfolgreichen Anmeldung wieder aus der MySQL Shell.
So nun kann das rsyslog-mysql Paket ohne Abhängigkeiten installiert werden:

aptitude install rsyslog-mysql -R

Bei der Frage ob man via dbconfig-common Die Datenbank einrichten will sagt man "no". Wenn beim nächsten Schritt ein Fehler angemeckert wird diesen ignorieren (also "ignore" wählen).
Nun wird das Konstrukt mittels folgendem Befehl eingerichtet:

dpkg-reconfigure rsyslog-mysql

Nun einfach den Anweisungen folgen und dann noch den Rsyslog Dienst neustarten:

/etc/init.d/rsyslog restart

Dieser Assistent sollte nun auf dem angegebenen MySQL Server eine neue Datenbank anlegen und alle Syslog Einträge dorthin schicken.

Rsyslog und MySQL - Datenbank aufräumen

Wenn man mehrere Systeme in die Datenbank schreiben lässt, kommt nach und nach eine ganze Menge Daten zusammen und die Datenbank wächst und wächst. Hierfür gibt es aber eine tolle Lösung direkt von den Rsyslog Programmierern. Es handelt sich um ein kleines Skript Namens delete_mysql.sh, welches standardmäßig alle Einträge älter als 30 Tage löscht und danach die Datenbank aufräumt.
delete_mysql.sh:

#!/bin/bash

# Database maintance script which can be used for rsyslog
# and phplogcon default database schema.
# Michael Mansour suggested it to be included - thx!

# This program was original part of of PHPloghost
# Copyright (C) 2004 Tuatha de Dana
# some modifications for rsyslog by mmeckelein at 2007-08-08
# 2007-08-13 mmeckelein: added dbhost and some other improvements
# suggested by Michael Mansour - thx a lot!

# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111- 1307, USA.

# Change these variables to reflect your situation.
database=Syslog
dbhost="localhost"
export table=SystemEvents
sqluser="user"
password="password"

# Location of the mysql daemon:
mysqld=/usr/bin/mysql

# A couple of steps should be taken to maintain your database.
# If not, the number of messages will fill your database.
# By default, logs are deleted after they're 30 days old.
# Change this to meet your requirements.
# rsyslog's default database template use two date columns
# ReceivedAt and DeviceReportedTime. You can use either of
# the two and in most cases it doesn't make a huge difference.
# See the property replacer doc at http://www.rsyslog.com/doc
# for details on the two dates.
SQL_DELETE="DELETE FROM $table WHERE ReceivedAt < CURDATE() - INTERVAL 30 DAY;"

# After a large amount of rows have been deleted, we should # optimize the table.
SQL_OPT="OPTIMIZE TABLE $table;";

$mysqld -u$sqluser -p$password -h$dbhost -e"$SQL_DELETE" -D$database
$mysqld -u$sqluser -p$password -h$dbhost -e"$SQL_OPT" -D$database

Download des Skriptes: Delete_mysql.zip
Diese Skript sollte am besten nach /usr/local/sbin/delete_mysql gelegt werden und täglich via cron gestartet werden:

chmod +x /usr/local/sbin/delete_mysql
ln -s /usr/local/sbin/delete_mysql /etc/cron.daily/delete_mysql

PHPLogcon/Loganalyzer einrichten

Achtung: PHPLogcon ist nun Loganalyzer

PHPLogcon heißt nun Loganalyzer, ist aber von der Installation genau gleich und unter folgender URL zu bekommen. Loganalyzer heißt das Program seit Version 3.0
Hier die Anleitung zur Loganalyzer Installation

Installation Loganalyzer

Hersteller Homepage: http://loganalyzer.adiscon.com
Zuerst wird das Paket heruntergeladen und entpackt:

cd /usr/src
wget http://download.adiscon.com/loganalyzer/loganalyzer-3.4.1.tar.gz
tar -xzvf loganalyzer-3.4.1.tar.gz

Nun den Webcontent Folder des Source Paketes in den vhost kopieren:

mv /usr/src/loganalyzer-3.4.1/src /srv/httpd/vhosts/domain.de/htdocs/loganalyzer
mv /usr/src/loganalyzer-3.4.1/contrib/*.sh /srv/httpd/vhosts/domain.de/htdocs/loganalyzer/
cd /srv/httpd/vhosts/domain.de/htdocs/loganalyzer/
chmod u+x configure.sh
chmod u+x secure.sh
./configure.sh

Nun im Browser die URL Aufrufen: http://hostname/loganalyzer/install.php
und den Konfigurationsschritten folgen. Die Standard Konfiguration nimmt /var/log/syslog als Logfile. Nun ist der Loganalyzer unter folgender URL erreichbar:
http://hostname/loganalyzer/

cd /srv/httpd/vhosts/domain.de/htdocs/loganalyzer/
./secure.sh
rm configure.sh secure.sh

Installation PHPLogcon

!!!Bitte nutzt den Loganalyzer!!!!
Hersteller Homepage: http://www.phplogcon.org
Zuerst wird das Paket heruntergeladen und entpackt:

cd /usr/src
wget http://www.phplogcon.org/Downloads-req-getit-lid-63.phtml
tar -xzvf phplogcon-2.8.1.tar.gz

Nun den PHPLogcon Folder in den vhost verschieben:

mv phplogcon-2.8.1/src /var/www/phplogcon
mv phplogcon-2.8.1/contrib/*.sh /var/www/phplogcon
cd /var/www/phplogcon
chmod u+x configure.sh
chmod u+x secure.sh
./configure.sh

Dann im Browser die URL aufrufen:
http://hostname/phplogcon/install.php
und den Konfiguartions Schritten folgen. Die Standard Konfig nimmt /var/log/syslog als Logfile. Nun ist PHPLogcon unter folgender URL erreichbar:
http://hostname/phplogcon/ Nun zum Schluss noch:

cd /srv/httpd/vhosts/domain.de/htdocs/loganalyzer/
./secure.sh
rm configure.sh secure.sh

PHPLogcon/Loganalyzer und MySQL

Ist im Prinzip die gleiche Installation der einzige Unterschied ist, dass man sich an die SYSLOG MySQL Datenbank verbindet. Man benötigt hierfür:

  • MySQL Server IP (192.168.1.1)
  • einen User der auf die Datenbank connecten darf (rsyslog@localhost)
  • Datenbank Name (Syslog)
  • Tabellen Name (SystemEvents)

Also auch hier

  • http://hostname/loganalyzer/install.php

aufrufen und den Anweisungen folgen, dann anstelle vom lokalen Syslogfile einfach MySQL Datenbank wählen und die Credentials eintragen. Zum Beispiel:

Name of the Source: My Syslog Source 	
Source Type: MySQL Native	
Select View: SyslogView
             Database Type Options
Table type: MonitorWare	
Database Host: localhost
Database Name: Syslog
Database Tablename: SystemEvents 	
Database User: rsyslog	
Database Password: yourpassword	
Enable Row Counting: No	

Nun ist der Loganaylzer unter folgender URL erreichbar:

  • http://hostname/loganalyzer/

Nun zum Schluss noch:

cd /srv/httpd/vhosts/domain.de/htdocs/loganalyzer/
./secure.sh
rm secure.sh configure.sh

PHPLogcon/Loganalyzer und MySQL Process ID Patch

Bei der Standard Installation wie sie oben Beschrieben ist gibt es ein Problem, die Prozess IDs landen nicht im der vorgegebene Tabellenspalte, dies kann durch dieses HowTo gefixt werden.
Als erstes muss das rsyslog und rsyslog-mysql Packet von den Lenny Backports installiert werden:
HowTo Backports installieren: Debian Linux - Backports hinzufügen

aptitude -t lenny-backports install rsyslog rsyslog-mysql

Als nächstes muss die Datenbak aktualisiert werden:

mysql -u root -p

Dann in der Mysql Shell:

use Syslog;
ALTER TABLE SystemEvents ADD COLUMN `ProcessID` char(8) default NULL;
quit

Nun muss das PHPLogcon noch angepasst werden, und zwar muss in der Datei include/constants_logstream.php unter folgende Zeile:

$dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_EVENT_USER] = "EventUser";

folgende Zeile einkommentiert oder hinzugefügt werden:

$dbmapping['monitorware']['DBMAPPINGS'][SYSLOG_PROCESSID] = "ProcessID";

Nun noch den Rsyslog anpassen:
/etc/rsyslog.d/mysql.conf

### Configuration file for rsyslog-mysql
### Changes are preserved

$ModLoad ommysql

$template OurDBLog,"INSERT INTO SystemEvents (Message, Facility, FromHost, Priority, \
     DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag, ProcessID) values \
     ( '%msg%',%syslogfacility%,'%HOSTNAME%',%syslogpriority%,'%timereported:::date-mysql%',\
     '%timegenerated:::date-mysql%',%iut%,'%programname%','%procid:R,ERE,0,ZERO:[0-9]+--end%')",SQL

*.* :ommysql:192.168.160.10,Syslog,rsyslog,rsyslog2009;OurDBLog

und den Rsyslog Dienst neustarten:

/etc/init.d/rsyslog restart

So, nun sollten die Process IDs schön in ihrer Spalte landen.

Tuning PHPLogcon MySQL Datenbank

Leider wird bei einer immer größer werdenden Datenbank das Analyse Frontend immer langsamer. Folgende Tuning Maßnahmen können deshalb angewandt werden:
Zusätzliche Indizies in die Syslog Datenbank einbauen:

mysql -u root -p

und nun folgende Befehle in der MySQL Shell eintippen:

use Syslog;
ALTER TABLE SystemEvents ADD KEY `FromHost` (`FromHost`);
ALTER TABLE SystemEvents ADD KEY `SysLogTag` (`SysLogTag`);
ALTER TABLE SystemEvents ADD KEY `Facility` (`Facility`);
ALTER TABLE SystemEvents ADD KEY `ReceivedAt` (`ReceivedAt`);
ALTER TABLE SystemEvents ADD KEY `DeviceReportedTime` (`DeviceReportedTime`);
ALTER TABLE SystemEvents ADD FULLTEXT KEY `Message` (`Message`);
CREATE INDEX index_DeviceReportedTime ON SystemEvents(DeviceReportedTime); 
CREATE INDEX index_FromHost ON SystemEvents(FromHost);
CREATE INDEX index_ReceivedAt ON SystemEvents(ReceivedAt);
CREATE INDEX index_SysLogTag ON SystemEvents(SysLogTag);
CREATE INDEX index_Facility ON SystemEvents(Facility);
CREATE INDEX index_Priority ON SystemEvents(Priority);

Nach diesen Maßnahmen war es bei mir gefühlt schneller.
Weiteres über MySQL Tuning hier:

Syslog Server für mehrere Gruppen

Quellen