sephi.de

1Jun/110

Zentraler Syslog Server + MySQL + logAnalyzer-Webinterface unter CentOS 5

tux_100

 

Da mich dieses Setup vor Allem bei den Filter-Einstellungen sehr viele Nerven gekostet hat hier eine Zusammenfassung der wichtigsten Schritte und Konfigurationsparameter.

 

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 der zentrale Syslog-Server nicht erreichbar ist
  • PHP Webinterface zur besseren Übersicht
  • Unterschiedliche Netze in mehrere Datenbanken(Quellen) aufteilen
  • Dieses System ist auch mit zweien meiner zukünftigen Artikel kombinierbar: mod_authz_ldap & mod_ssl + mod_rewrite

     

     

    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:

    yum install rsyslog rsyslog-mysql mysql-server httpd \
    php php-mysql php-mcrypt php-gd

    Und noch die Dienste aktivieren:

    chkconfig mysqld on
    chkconfig httpd on
    service mysqld start
    service httpd start

    Mittels /usr/bin/mysql_secure_installation sichern wir unsere MySQL-Installation ab und vergeben ein Root-Passwort. Dieses notieren - wir brauchen es später für die Syslog-Konfiguration wieder.

    Als nächstes erstellen wir unsere erste Syslog-Datenbank. Folgendes Schema dazu einfach per Texteditor in eine Datei - z.B. /root/createDB.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
    );

    (Code aus /usr/share/doc/rsyslog-mysql-3.22.1/createDB.sql)

    Diese lesen wir nun in unsere MySQL-Datenbank ein:

    mysql -u root -p < /root/createDB.sql

    Jetzt können wir die Basiskonfiguration von rsyslog vornehmen. Dazu öffnen wir die Konfigurationsdatei /etc/rsyslog.conf:

    # 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,<mysql-root-passwort>;sqltemplate

    Man kann hier natürlich auch vorher einen extra Benutzer in MySQL anlegen den man für den Rest auch benutzt.

    Unsere ersten Client-Server können wir mit folgender einfachen Konfiguration in /etc/rsyslog.confausstatten:

    # 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

    Und schon funktioniert ein zentraler Syslog-Server.

    Als nächstes kümmern wir uns um unser Webinterface. Am Besten eignet sich hierzu logAnalyzer von Adiscon. 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:

    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

    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.

    echo "CREATE DATABASE loganalyzer" | mysql -u root -p

    Jetzt kann man den Server im Browser aufrufen und man bekommt die Konfigurationsoptionen angezeigt:

    logAnalyzer nach dem Entpacken

     

    Nach ein paar Tests die man durch NEXT > bestätigt kommt der erste Dialog für Konfigurationseinstellungen. Hier ist es jetzt wichtig die User Database zu aktivieren und die MySQl-Zugangsdaten einzutragen:

    logAnalyzer User Database Einstellungen

     

    Als nächstes wird man nach Zugangsdaten gefragt die man vergeben möchte - hier legt man also den Administrator-Account an.

    Im darauffolgenden Dialog gibt man nun seine erste Quelle an - hier ist es wichtig zu beachten, dass der Tablename der Datenbank sowie auch die Datenbank selbst case-sensitive ist - d.H. man muss den Namen exakt so angeben wie man ihn anlegt - einschließlich der Großbuchstaben. Unser Table type ist übrigens MonitorWare:

    logAnalyzer Datenbank-Quelle

    Und schon ist auch unser Webinterface korrekt installiert. Loggt man sich nun als Admin ein, kann man weitere Quellen hinzufügen.

    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.

    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 Filter 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.

    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  ~

    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.

    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:

    if $fromhost-ip startswith '10.10.10.' \
    or $fromhost-ip == '192.168.0.1' \
    then \
      :ommysql:127.0.0.1,Syslog_XenServer,root,<mysql-root-passwort>
      & ~

    Dafür muss man aber zunächst nach dem Datenbank-Schema von oben eine neue Datenbank anlegen.

    Unsere fertige Server-Konfiguration sieht dann wie folgt aus:

    # 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
    <pre>
    <pre># 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,<mysql-root-passwort>;sqltemplate
      & ~  
    
    # Ende der Filterliste
    #################################  
    
    # Speichere ALLES was ankommt direkt in die Datenbank.
    *.* :ommysql:127.0.0.1,Syslog,root,<mysql-root-passwort>;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
    Starte Slide Show PicLens
    Kommentare (0) Trackbacks (0)

    Zu diesem Artikel wurden noch keine Kommentare geschrieben.


    Leave a comment

    (required)

    Noch keine Trackbacks.