Syslog Server unter Red Hat Linux mit Rsyslog

Aus Laub-Home Wiki

Installation Rsyslog

Rsyslog ist ab Red Hat Enterprise Linux 6 standarmäßig als Syslog Daemon installiert. Wenn man aber von einer früheren Version kommt, muss man diesen nachinstallieren.

yum install rsyslog
yum remove sysklogd

Konfiguration Rsyslog als Syslog Server

In der Datei /etc/rsyslog.conf muss zur Aktivierung des Syslog Servers einfach folgende Zeilen einkommentiert werden:
/etc/rsyslog.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:

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

Hierbei werden für jeden Host ein Logfile unter /var/log/ erzeugt welches messages-%HOSTNAME%.log heißt aber trotzdem werden für Debugging Zwecke die Einträge auch nach /var/log/messages 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.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/messages-*.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

Hierfür wird als erstes das MySQL-Rsyslog Modul und natürlich der MySQL Server selbst benötigt:

yum install rsyslog-mysql mysql mysql-server
chkconfig mysqld on

Nun legen wir die Datenbank Dateien noch nach /srv/mysql um:

mv /var/lib/mysql /srv/

/etc/my.cnf

[mysqld]
datadir=/srv/mysql
/etc/init.d/mysqld start

Als nächstes richten wir die Datenbankbenutzer und die Datenbank selbst ein:

/usr/bin/mysqladmin -u root password 'newpassword'
mysql -u root -p

Der nächste Schritt ist das Erstellen der Datenbank. Dazu liefert Rsyslog ein eigenes Skript mit:

mysql -u root -p < /usr/share/doc/rsyslog-mysql-5.8.10/createDB.sql

und nun im MySQL:

grant all on *.* to 'root'@'%' identified by 'newpassword';
CREATE USER 'syslog'@'localhost' IDENTIFIED BY 'syslogpassword';
GRANT ALL PRIVILEGES ON `Syslog` . * TO 'syslog'@'localhost';
use Syslog;
ALTER TABLE SystemEvents ADD COLUMN `ProcessID` char(8) default NULL;

Nachdem nun der MySQL Server konfiguriert ist, müssen wir dem Rsyslog noch sagen, das er in die DB schreiben soll:
/etc/rsyslog.conf

#### MySQL ####
$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

$ModLoad ommysql
*.*,Local6.none :ommysql:localhost,Syslog,syslog,syslogpassword;OurDBLog

dannach am besten beide Dienste neustarten:

/etc/init.d/mysqld restart
/etc/init.d/rsyslog restart

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="syslog"
password="syslogpassword"

# 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.sh
ln -s /usr/local/sbin/delete_mysql.sh /etc/cron.daily/delete_mysql

Loganalyzer einrichten

Installation Loganalyzer

Hersteller Homepage: http://loganalyzer.adiscon.com

Voraussetzung hierfür ist ein funktionierender Apache HTTPd inklusive PHP und dem PHP-MySQL Modul.

yum install httpd php php-mysql

Ist diese Voraussetzung erfüllt, 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

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

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