Syslog Server als Shared System aufsetzten

Aus Laub-Home Wiki

In dieser Dokumentation geht es darum einen bestehenden Syslog Server als Shared System aufzusetzen. Hat man zum Beispiel mehrere Kunden Systeme, oder aber auch verschiedene Systeme, wie zum Beispiel Switches, Linux Server oder Windows Kisten und will diese in verschiedene Ordner und Datenbanken Loggen lassen, dann sollte man dieses Tutorial dazu verwenden. Die Lösung sieht wie folgt aus:

Systemgruppe A --> Loggt auf TCP Port 10514 --> schreibt Logfiles in /srv/syslog/SYSGROUP-A --> und Loggt in Datenbank syslog_A --> Loganalyzer greift auf diese Datenbank dann per Policy A zu

Das Ganze dann für Systemgruppe B usw....

Systemgruppe B --> Loggt auf TCP Port 10515 --> schreibt Logfiles in /srv/syslog/SYSGROUP-B --> und Loggt in Datenbank syslog_B --> Loganalyzer greift auf diese Datenbank dann per Policy B zu

Das Tutorial baut auf den folgenden Anleitungen auf:

Und wie das Ganze nun konfiguriert wird, kommt jetzt:

Konfiguration der Datenbank

Zuerst muss man nun für alle Benötigten "Syslog Gruppen" eine eigene Datenbank anlegen. Dafür gibt es unter Debian und Red Hat schon ein vorgefertigtes SQL Script, welches editiert und verwendet werden kann.

  • Unter Debian/Ubuntu: /usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql
  • Unter Red Hat: /usr/share/doc/rsyslog-mysql-5.8.10/createDB.sql

Es sollte dann wie folgt aussehen. Wichtig hierbei ist, das CREATE DATABASE und USE angepasst werden muss!

CREATE DATABASE syslog_A;
USE syslog_A;

CREATE DATABASE syslog_B;
USE syslog_B;
CREATE DATABASE syslog_A;
USE syslog_A;
CREATE TABLE SystemEvents
(
        ID int unsigned not null auto_increment primary key,
        CustomerID bigint,
        ReceivedAt datetime NULL,
        DeviceReportedTime datetime NULL,
        Facility smallint NULL,
        Priority smallint NULL,
        FromHost varchar(60) NULL,
        Message text,
        NTSeverity int NULL,
        Importance int NULL,
        EventSource varchar(60),
        EventUser varchar(60) NULL,
        EventCategory int NULL,
        EventID int NULL,
        EventBinaryData text NULL,
        MaxAvailable int NULL,
        CurrUsage int NULL,
        MinUsage int NULL,
        MaxUsage int NULL,
        InfoUnitID int NULL ,
        SysLogTag varchar(60),
        EventLogType varchar(60),
        GenericFileName VarChar(60),
        SystemID int NULL
);

CREATE TABLE SystemEventsProperties
(
        ID int unsigned not null auto_increment primary key,
        SystemEventID int NULL ,
        ParamName varchar(255) NULL ,
        ParamValue text NULL
);

Nachdem das Script angepasst wurde muss es für jede anzulegende Datenbank editiert und gestartet werden:

# RED HAT LINUX
mysql -uroot -p < /usr/share/doc/rsyslog-mysql-5.8.10/createDB.sql

# DEBIAN / UBUNTU
mysql -uroot -p < /usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql

Nun zu guter Letzt noch den Datenbank SYSLOG Benutzer die Rechte auf die anderen, gerade generierten DBs geben:

mysql -uroot -p -e "GRANT ALL PRIVILEGES ON `syslog\_A` . * TO 'syslog'@'localhost';"
mysql -uroot -p -e "GRANT ALL PRIVILEGES ON `syslog\_B` . * TO 'syslog'@'localhost';"

Nachdem wir ja nicht wollen, dass die Datenbanken volllaufen, hier das angepasste Aufräumscript. Wichtig hierbei ist, das es nur funktioniert wenn die Datenbanken den Namen "syslog" beinhalten! /usr/local/sbin/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.
dbhost="localhost"
export table=SystemEvents
sqluser="root"
password="yourpassword"
database=$(mysql -u$sqluser -p$password -e 'show databases' | grep -i syslog)


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

for i in $database; do

# 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$i
$mysqld -u$sqluser -p$password -h$dbhost -e"$SQL_OPT" -D$i

done
chmod +x /usr/local/sbin/delete_mysql.sh

Und falls noch nicht geschehen noch in den Daily Cronjob linken:

ln -s /usr/local/sbin/delete_mysql.sh /etc/cron.daily/delete_mysql

Konfiguration Syslog

Nun erstellen wir eine eigene Konfigurationsdatei im /etc/rsyslog.d/ Ordner und konfigurieren diese nach unseren Wünschen. Im unten stehenden Beispiel wird pro Rule in eine eigene Datenbank und in einen eigenen Logfile Folder geloggt.
/etc/rsyslog.d/syslogserver.conf

# Ruleset for SYSLOG_A
$RuleSet SYSLOGA
$ModLoad ommysql
*.*,Local6.none :ommysql:localhost,syslog_A,syslog_A,password1;OurDBLog
$template SYSLOG1DynaFile,"/srv/syslog/SYSLOG_A/%HOSTNAME%/messages-%HOSTNAME%.log"
*.* -?SYSLOGADynaFile
$InputTCPServerBindRuleset SYSLOGA
$InputTCPServerRun 10514

# Ruleset for SYSLOG_B
$RuleSet SYSLOGB
$ModLoad ommysql
*.*,Local6.none :ommysql:localhost,syslog_B,syslog_B,password1;OurDBLog
$template SYSLOG1DynaFile,"/srv/syslog/SYSLOG_B/%HOSTNAME%/messages-%HOSTNAME%.log"
*.* -?SYSLOGADynaFile
$InputTCPServerBindRuleset SYSLOGB
$InputTCPServerRun 10514

Nun müssen noch alle benötigten Ordner für die einzelnen "Syslog Gruppen" angelegt werden:

mkdir /srv/syslog/SYSLOG_A
mkdir /srv/syslog/SYSLOG_B

Zum Aktivieren muss nun der Syslog Server neugestartet werden.

/etc/init.d/rsyslog restart

Konfiguration Loganalyzer

Der Loganalyzer hat die Möglichkeit mit verschiedenen "Sources" klarzukommen. Jede Source entspricht einer Datenbank, also einer "Syslog Gruppe". Konfiguriert werden die Sources in der folgenden Datei ganz unten. /srv/httpd/vhosts/yourhost.domain.tld/htdocs/loganalyzer/config.php

*/

$CFG['DefaultSourceID'] = 'Policy1';

$CFG['Sources']['Policy1']['ID'] = 'Policy1';
$CFG['Sources']['Policy1']['Name'] = 'A_Syslog_Messages';
$CFG['Sources']['Policy1']['ViewID'] = 'SYSLOG';
$CFG['Sources']['Policy1']['SourceType'] = SOURCE_DB;
$CFG['Sources']['Policy1']['DBTableType'] = 'monitorware';
$CFG['Sources']['Policy1']['DBType'] = DB_MYSQL;
$CFG['Sources']['Policy1']['DBServer'] = 'localhost';
$CFG['Sources']['Policy1']['DBName'] = 'syslog_A';
$CFG['Sources']['Policy1']['DBUser'] = 'syslog_A';
$CFG['Sources']['Policy1']['DBPassword'] = 'password1';
$CFG['Sources']['Policy1']['DBTableName'] = 'SystemEvents';
$CFG['Sources']['Policy1']['DBEnableRowCounting'] = false;


$CFG['DefaultSourceID'] = 'Policy2';

$CFG['Sources']['Policy2']['ID'] = 'Policy2';
$CFG['Sources']['Policy2']['Name'] = 'B_Syslog_Messages';
$CFG['Sources']['Policy2']['ViewID'] = 'SYSLOG';
$CFG['Sources']['Policy2']['SourceType'] = SOURCE_DB;
$CFG['Sources']['Policy2']['DBTableType'] = 'monitorware';
$CFG['Sources']['Policy2']['DBType'] = DB_MYSQL;
$CFG['Sources']['Policy2']['DBServer'] = 'localhost';
$CFG['Sources']['Policy2']['DBName'] = 'syslog_B';
$CFG['Sources']['Policy2']['DBUser'] = 'syslog_B';
$CFG['Sources']['Policy2']['DBPassword'] = 'password2';
$CFG['Sources']['Policy2']['DBTableName'] = 'SystemEvents';
$CFG['Sources']['Policy2']['DBEnableRowCounting'] = false;

// ---

Client Konfiguration und Test

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 10514, also SYSLOG_A

*.*                             @192.168.1.1:10514

für TCP 10514, also SYSLOG_A

*.*                             @@192.168.1.1:10514

für UDP 10515, also SYSLOG_B

*.*                             @192.168.1.1:10515

für TCP 10515, also SYSLOG_B

*.*                             @@192.168.1.1:10515

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:10514

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

Dann zum Schluss den Dienst neustarten:

/etc/init.d/rsyslog restart

und testen ob im Loganalyzer wie auch in den Logfiles alles richtig ankommt:

logger "Dies ist ein TEST"