<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>sephi.de</title>
	<atom:link href="http://sephi.de/wp/feed/" rel="self" type="application/rss+xml" />
	<link>http://sephi.de/wp</link>
	<description></description>
	<lastBuildDate>Fri, 06 Jan 2012 09:59:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Zentraler Syslog Server + MySQL + logAnalyzer-Webinterface unter CentOS 5</title>
		<link>http://sephi.de/wp/2011/06/01/zentraler-syslog-server-mysql-loganalyzer-webinterface-unter-centos-5/</link>
		<comments>http://sephi.de/wp/2011/06/01/zentraler-syslog-server-mysql-loganalyzer-webinterface-unter-centos-5/#comments</comments>
		<pubDate>Wed, 01 Jun 2011 10:38:40 +0000</pubDate>
		<dc:creator>Sephiroth</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Syslog]]></category>
		<category><![CDATA[zentral]]></category>

		<guid isPermaLink="false">http://sephi.de/wp/?p=6</guid>
		<description><![CDATA[&#160; Da mich dieses Setup vor Allem bei den Filter-Einstellungen sehr viele Nerven gekostet hat hier eine Zusammenfassung der wichtigsten Schritte und Konfigurationsparameter. &#160; Folgende Funktionen wird dieses System haben: Zentrale Speicherung der Syslog-Daten von mehreren Servern MySQL-Datenbank als Backend Sicherer Transport über TCP (wichtig für den nächsten Punkt) Lokaler Spool auf jedem Server falls [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Da mich dieses Setup vor Allem bei den Filter-Einstellungen sehr viele Nerven gekostet hat hier eine Zusammenfassung der wichtigsten Schritte und Konfigurationsparameter.</p>
<p>&nbsp;</p>
<p>Folgende Funktionen wird dieses System haben:</p>
<li>Zentrale Speicherung der Syslog-Daten von mehreren Servern</li>
<li>MySQL-Datenbank als Backend</li>
<li>Sicherer Transport über TCP (wichtig für den nächsten Punkt)</li>
<li>Lokaler Spool auf jedem Server falls der zentrale Syslog-Server nicht erreichbar ist</li>
<li>PHP Webinterface zur besseren Übersicht</li>
<li>Unterschiedliche Netze in mehrere Datenbanken(Quellen) aufteilen</li>
<p>Dieses System ist auch mit zweien meiner zukünftigen Artikel kombinierbar: mod_authz_ldap &amp; mod_ssl + mod_rewrite</p>
<p>&nbsp;</p>
<p><span id="more-6"></span></p>
<p>&nbsp;</p>
<p>Zunächst installiert man die benötigten Pakete über die normale Paketverwaltung nach. Für unsere Zwecke reicht die normale CentOS 5 Version von rsyslog (3.22.1) völlig aus:</p>
<pre class="brush:shell">yum install rsyslog rsyslog-mysql mysql-server httpd \
php php-mysql php-mcrypt php-gd</pre>
<p>Und noch die Dienste aktivieren:</p>
<pre class="brush:shell">chkconfig mysqld on
chkconfig httpd on
service mysqld start
service httpd start</pre>
<p>Mittels <em>/usr/bin/mysql_secure_installation</em> sichern wir unsere MySQL-Installation ab und vergeben ein Root-Passwort. Dieses notieren - wir brauchen es später für die Syslog-Konfiguration wieder.</p>
<p>Als nächstes erstellen wir unsere erste Syslog-Datenbank. Folgendes Schema dazu einfach per Texteditor in eine Datei - z.B. /root/createDB.sql:</p>
<pre class="brush:sql">CREATE DATABASE Syslog;
USE Syslog;
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
);</pre>
<p>(Code aus <em>/usr/share/doc/rsyslog-mysql-3.22.1/createDB.sql</em>)</p>
<p>Diese lesen wir nun in unsere MySQL-Datenbank ein:</p>
<pre class="brush:shell">mysql -u root -p &lt; /root/createDB.sql</pre>
<p>Jetzt können wir die Basiskonfiguration von rsyslog vornehmen. Dazu öffnen wir die Konfigurationsdatei <em>/etc/rsyslog.conf</em>:</p>
<pre class="brush:shell"># Traditionelles Timestamp-Format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# Aktiviere Kernellog und Socket
$ModLoad imklog
$ModLoad imuxsock

# UDP Einstellungen falls Bedarf
$ModLoad imudp
$UDPServerAddress *
$UDPServerRun 514

# TCP Einstellungen
$ModLoad imtcp
$InputTCPMaxSessions 500
$InputTCPServerRun 514

# White-List IPs
# Hier ist es wichtig die IP einzutragen mit der der Client
# auf den Server verbinden würde. Stichwort hier: NAT!
# Bei NAT muss natürlich die öffentliche IP des NAT-Gateway
# eingetragen werden
$AllowedSender UDP, 127.0.0.1
$AllowedSender TCP, 127.0.0.1, 192.168.0.0/24, 10.10.10.75

# Lade MySQL Modul
$ModLoad ommysql

# Verbessertes MySQL Template
$template sqltemplate,"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%')",SQL

#################################
# Hier kommen später die allgemeinen Filter hin

# Ende der Filterliste
#################################

# Spool einstellen - auch unser Server bekommt ein Spool
# falls der MySQL-Server nicht reagiert
# z.B. bei Datenbank-Dumps für Backups
# Achtung: rsyslog speichert immer zuerst im Arbeitsspeicher
# bevor eine Datei auf dem Dateisystem abgelegt wird auch
# falls der MySQL-Server nicht erreichbar ist.
# Erst wenn der zugewiesene Speicher voll wird lagert
# rsyslog die Daten vom RAM auf die Festplatte aus
$umask 0000
$FileCreateMode 0640
$WorkDirectory /tmp/
$ActionQueueType LinkedList
$ActionQueueFileName rsyslog_queue
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on
$MainMsgQueueMaxFileSize 1000M # Speicherplatz im $WorkDirectory
$ActionQueueMaxFileSize 50M # Speicherplatz im RAM

#################################
# Hier kommen später die Filter für die Aufteilung
# auf weitere Datenbanken hin

# Ende der Filterliste
#################################

# Speichere ALLES was ankommt direkt in die Datenbank.
*.* :ommysql:127.0.0.1,Syslog,root,&lt;mysql-root-passwort&gt;;sqltemplate</pre>
<p>Man kann hier natürlich auch vorher einen extra Benutzer in MySQL anlegen den man für den Rest auch benutzt.</p>
<p>Unsere ersten Client-Server können wir mit folgender einfachen Konfiguration in <em>/etc/rsyslog.conf</em>ausstatten:</p>
<pre class="brush:shell"># Traditionelles Timestamp-Format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# Aktiviere Kernellog und Socket
$ModLoad imklog
$ModLoad imuxsock

# Spool Konfiguration
$umask 0000
$FileCreateMode 0640
$WorkDirectory /tmp/
$ActionQueueType LinkedList
$ActionQueueFileName rsyslog_queue
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on
$MainMsgQueueMaxFileSize 250M
$ActionQueueMaxFileSize 25M

####################################
# Sende ALLE Events an unseren Server
# @@ beschreibt hier TCP - ein @ würde UDP beschreiben
# ACHTUNG - damit werden keine lokalen Logs mehr gespeichert
# und nur noch an den Server gesendet
*.* @@syslog.domain.tld

# Setzt man fail2ban für z.B. ssh ein kann man
# noch ein extra Log für z.B. authpriv.* angeben um
# ssh-Logins zu loggen:
#authpriv.* /var/log/secure</pre>
<p>Und schon funktioniert ein zentraler Syslog-Server.</p>
<p>Als nächstes kümmern wir uns um unser Webinterface. Am Besten eignet sich hierzu <a title="logAnalyzer" href="http://loganalyzer.adiscon.com/">logAnalyzer von Adiscon</a>. Die Installation gestaltet sich denkbar einfach - man läd das Interface nur herunter, entpackt es, passt die Dateirechte an und schon kann man über seinen Browser die Konfiguration einstellen:</p>
<pre class="brush:shell">cd /tmp/
wget http://download.adiscon.com/loganalyzer/loganalyzer-3.2.1.tar.gz
tar zxf loganalyzer-3.2.1.tar.gz
cp -ar loganalyzer-3.2.1/src/* /var/www/html/
chown -R apache:apache /var/www/html</pre>
<p>Allerdings brauchen wir jetzt noch eine Datenbank für die interne Userverwaltung - selbst wenn man eine eigene .htaccess oder mod_authz_ldap-Authentifizierung einsetzt sollte man unbedingt einen Admin-User anlegen da man ansonsten keinerlei Konfigurationsmöglichkeit im Webinterface hat und man alles über einen Texteditor direkt in der [i]config.inc.php[/i] machen muss.</p>
<pre class="brush:shell">echo "CREATE DATABASE loganalyzer" | mysql -u root -p</pre>
<p>Jetzt kann man den Server im Browser aufrufen und man bekommt die Konfigurationsoptionen angezeigt:</p>
<p style="text-align: center;"><a href="http://sephi.de/wp/wp-content/uploads/loganalyzer_01.jpg"></a><a href="http://sephi.de/wp/wp-content/uploads/loganalyzer_01.jpg"><img class="size-full wp-image-14 aligncenter" title="loganalyzer_01" src="http://sephi.de/wp/wp-content/uploads/loganalyzer_01.jpg" alt="logAnalyzer nach dem Entpacken" width="604" height="135" /></a></p>
<p>&nbsp;</p>
<p>Nach ein paar Tests die man durch <em>NEXT &gt; </em>bestätigt kommt der erste Dialog für Konfigurationseinstellungen. Hier ist es jetzt wichtig die <em>User Database</em> zu aktivieren und die MySQl-Zugangsdaten einzutragen:</p>
<p style="text-align: center;"><a href="http://sephi.de/wp/wp-content/uploads/loganalyzer_02.jpg"><img class="size-full wp-image-16 aligncenter" title="loganalyzer_02" src="http://sephi.de/wp/wp-content/uploads/loganalyzer_02.jpg" alt="logAnalyzer User Database Einstellungen" width="508" height="313" /></a></p>
<p>&nbsp;</p>
<p>Als nächstes wird man nach Zugangsdaten gefragt die man vergeben möchte - hier legt man also den Administrator-Account an.</p>
<p>Im darauffolgenden Dialog gibt man nun seine erste Quelle an - hier ist es wichtig zu beachten, dass der <em>Tablename</em> der Datenbank sowie auch die Datenbank selbst <em>case-sensitive</em> ist - d.H. man muss den Namen exakt so angeben wie man ihn anlegt - einschließlich der Großbuchstaben. Unser <em>Table type</em> ist übrigens <em>MonitorWare</em>:</p>
<p><a href="http://sephi.de/wp/wp-content/uploads/loganalyzer_03.jpg"><img class="aligncenter size-full wp-image-21" title="loganalyzer_03" src="http://sephi.de/wp/wp-content/uploads/loganalyzer_03.jpg" alt="logAnalyzer Datenbank-Quelle" width="607" height="242" /></a></p>
<p>Und schon ist auch unser Webinterface korrekt installiert. Loggt man sich nun als <em>Admin </em>ein, kann man weitere Quellen hinzufügen.</p>
<p><strong>Soweit hat man nun einen voll funktionierenden zentralen Syslog-Server mit MySQL als Datenbank und Spool bei Client und Server falls eine Verbindung einmal nicht möglich war. Dazu noch ein Webinterface zur besseren Ansicht der Daten.</strong></p>
<p>Jetzt können wir die weitergehende Konfiguration vornehmen. Ich zum Beispiel lasse auch Citrix XenServer in den Syslogserver schreiben. Da Poolmaster aber hier extrem viel unsinnige Meldungen produzieren habe ich einen Filter, der mir viele dieser sinnlosen Daten erspart. Der nachfolgende Code-Abschnitt muss beim Server in den Abschnitt <em>Filter</em> eingebaut werden. Theoretisch kann dies auch auf dem Client eingetragen werden und statt einem Verwerfen der Daten (~) kann auch eine extra Logdatei angegeben werden bei Bedarf.</p>
<pre class="brush:shell">if $msg contains 'NFS-ISO Storage Name hier einfuegen' \
or $msg contains ' exitted with code 0' \
or ( $syslogtag startswith 'stunnel' \
     and ( \
           $msg contains 'Connection closed' \
        or $msg contains 'xapi connected from' \
        or $msg contains 'Connection reset' \
         ) \
   ) then  ~</pre>
<p>In der ersten Zeile muss man den Wert zwischen den Apostrophen gegen seinen eigenen NFS-ISO-Storage Namen angeben da ein NFS-ISO Storage im Pool alle 30 Sekunden 4 Logmeldungen pro Pool produziert.</p>
<p>Möchte man nun die Syslog-Daten von bestimmten IP-Adressen in eine extra Datenbank speichern und diese im logAnalyzer als eigene Quelle konfigurieren kann man dies im unteren Abschnitt der Serverkonfiguration einstellen. Ein Beispiel wäre folgender Eintrag:</p>
<pre class="brush:shell">if $fromhost-ip startswith '10.10.10.' \
or $fromhost-ip == '192.168.0.1' \
then \
  :ommysql:127.0.0.1,Syslog_XenServer,root,&lt;mysql-root-passwort&gt;
  &amp; ~</pre>
<p>Dafür muss man aber zunächst nach dem Datenbank-Schema von oben eine neue Datenbank anlegen.</p>
<p>Unsere fertige Server-Konfiguration sieht dann wie folgt aus:</p>
<pre class="brush:shell"># Traditionelles Timestamp-Format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# Aktiviere Kernellog und Socket
$ModLoad imklog
$ModLoad imuxsock

# UDP Einstellungen falls Bedarf
$ModLoad imudp
$UDPServerAddress *
$UDPServerRun 514

# TCP Einstellungen
$ModLoad imtcp
$InputTCPMaxSessions 500
$InputTCPServerRun 514

# White-List IPs
# Hier ist es wichtig die IP einzutragen mit der der Client
# auf den Server verbinden würde. Stichwort hier: NAT!
# Bei NAT muss natürlich die öffentliche IP des NAT-Gateway
# eingetragen werden
$AllowedSender UDP, 127.0.0.1
$AllowedSender TCP, 127.0.0.1, 192.168.0.1, 10.10.10.0/24

# Lade MySQL Modul
$ModLoad ommysql
&lt;pre&gt;
&lt;pre&gt;# Verbessertes MySQL Template
$template sqltemplate,"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%')",SQL

#################################
# Hier kommen später die allgemeinen Filter hin
if $msg contains 'NFS-ISO Storage Name hier einfuegen' \
or $msg contains ' exitted with code 0' \
or ( $syslogtag startswith 'stunnel' \
     and ( \
           $msg contains 'Connection closed' \
        or $msg contains 'xapi connected from' \
        or $msg contains 'Connection reset' \
         ) \
   ) then  ~
# Ende der Filterliste
#################################

# Spool einstellen - auch unser Server bekommt ein Spool
# falls der MySQL-Server nicht reagiert
# z.B. bei Datenbank-Dumps für Backups
# Achtung: rsyslog speichert immer zuerst im Arbeitsspeicher
# bevor eine Datei auf dem Dateisystem abgelegt wird auch
# falls der MySQL-Server nicht erreichbar ist.
# Erst wenn der zugewiesene Speicher voll wird lagert
# rsyslog die Daten vom RAM auf die Festplatte aus
$umask 0000
$FileCreateMode 0640
$WorkDirectory /tmp/
$ActionQueueType LinkedList
$ActionQueueFileName rsyslog_queue
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on
$MainMsgQueueMaxFileSize 1000M # Speicherplatz im $WorkDirectory
$ActionQueueMaxFileSize 50M # Speicherplatz im RAM  

#################################
# Hier kommen später die Filter für die Aufteilung
# auf weitere Datenbanken hin  

if $fromhost-ip startswith '10.10.10.' \
or $fromhost-ip == '192.168.0.1' \
then \
  :ommysql:127.0.0.1,Syslog_XenServer,root,&lt;mysql-root-passwort&gt;;sqltemplate
  &amp; ~  

# Ende der Filterliste
#################################  

# Speichere ALLES was ankommt direkt in die Datenbank.
*.* :ommysql:127.0.0.1,Syslog,root,&lt;mysql-root-passwort&gt;;sqltemplate

# Setzt man fail2ban für z.B. ssh ein kann man
# noch ein extra Log für security angeben um
# ssh-Logins zu loggen:
#if $fromhost-ip == '127.0.0.1' \
#  and $syslogfacility == '10' \
#  then /var/log/secure</pre>
<a href="javascript:toggleStartStop();PicLensLite.start({feedUrl:'http://sephi.de/wp/wp-content/plugins/wp-piclens/mrss.php?id=6'});">Starte Slide Show <img src="http://sephi.de/wp/wp-content/plugins/wp-piclens/PicLensButton.png" alt="PicLens" width="16" height="12" border="0" align="top"></a>]]></content:encoded>
			<wfw:commentRss>http://sephi.de/wp/2011/06/01/zentraler-syslog-server-mysql-loganalyzer-webinterface-unter-centos-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

