Einrichten eines Syslog Servers

  • Urspruenglicher Autor: Ramon Kukla
  • Urspruengliches Datum: 11.11.2011

Moeglicherweise ist ja Interesse an dem was ich die Tage eingerichtet habe. Es ging darum, dass ein Server installiert werden sollte, der Syslog Meldungen sammelt. Ich, als jemand der es gerne auch etwas sicherer hat, habe da auch an verschiedenen Stellen einiges „optimiert“, um Zugriff durch Unbefugte zu erschweren. Da durchaus mit einer groesseren Menge von Logs zu rechnen ist (>20.000/h), wollte ich, dass alles gleich in eine Datenbank laueft.

Basisinstallation und SSH Begonnen habe ich mit der Basisinstallation eines Ubuntu 10.04.3 LTS. Da SSH eines der Administrationszugaenge ist, lege ich da natuerlich Wert auf eine ordentliche Konfiguration. Also die /etc/sshd_config geoeffnet und dort folgendes angepasst (Erklaerungen fuege ich mal aus der man-Page hinzu).

# The server disconnects after this time if the user has not successfully logged in.
LoginGraceTime 60

# Specifies whether root can log in using ssh(1).
PermitRootLogin no

# Specifies the maximum number of concurrent unauthenticated connections to the SSH daemon.
MaxStartups 3:50:10

# Wohl selbst erklaerend
AllowUsers ramon

Ergaenzend empfehle ich auch noch PasswordAuthentication no zu setzen. Voraussetzung dafuer ist allerdings, dass man fuer alle berechtigen Benutzer die Anmeldung via SSH-Keys eingerichtet hat.

Des Weiteren kann man auch, bei Einsatz von mehreren Netzwerkkarten, den SSH-Daemon mit dem Schluesselwort ListenAddress an ein Interface binden. Leider hat das bei mir dazu gefuehrt, dass der Daemon nach dem Neustart des Servers nicht automatisch mit startete. Sehr seltsam.

Davon, den Port von 22 auf einen anderen Port zu legen, halte ich persoenlich nichts. Ich betreue einige Server im privaten und beruflichen Umfeld. Wenn da jeder seinen eigenen Port verwenden wuerde, wuerde ich ja verrueckt werden :) Ausserdem sehe ich hier keinen wirklichen Gewinn an Sicherheit. Aber das ist natuerlich subjektiv.

Das Netzwerk Um zumindest noch eine weitere Huerde einzubauen habe ich ueber /etc/hosts.deny und /etc/hosts.allow den Zugriff auf ssh etwas weiter reglementiert.

root@server:/etc# cat /etc/hosts.deny
# /etc/hosts.deny: list of hosts that are _not_ allowed to access the system.
#                  See the manual pages hosts_access(5) and hosts_options(5).
#
# Example:    ALL: some.host.name, .some.domain
#             ALL EXCEPT in.fingerd: other.host.name, .other.domain
#
 
sshd: ALL
 
root@server:/etc# cat /etc/hosts.allow
# /etc/hosts.allow: list of hosts that are allowed to access the system.
#                   See the manual pages hosts_access(5) and hosts_options(5).
#
# Example:    ALL: LOCAL @some_netgroup
#             ALL: .foobar.edu EXCEPT terminalserver.foobar.edu
#
 
sshd: 192.168.150.0/255.255.255.0

Anmeldung an einem AD Da die Maschine nicht nur von mir, sondern auch weiteren Anwendern genutzt werden soll, habe ich die Anbindung an ein AD konfiguriert. Das macht es, wenn man beispielsweise keinen Key hat, etwas leichter. Damit koennen sowohl bei der Anmeldung via SSH, aber auch beispielsweise beim sudo, einfach die Windows-Anmeldedaten verwendet werden. Die Einrichtung hierfuer geht relativ flockig von der Hand.

Im Rahmen der Installation der Pakete krb5-user, krb5-config und libpam-krb5 werden die wichtigsten Dinge soweit vorbereitet. Sollte, wie bei mir, die Abfrage wegen der Domaindaten nicht kommen kann man die Konfiguration via dpkg-reconfigure krb5-config nachholen oder die Datei /etc/krb5.conf von Hand anpassen. Die wichtigen Teile sind hier in libdefaults und realms zu finden.

[libdefaults]
         default_realm = Domaene

[realms]
         Domaincontroller = {
                 kdc = Domaincontroller
         }

Als „Domaene“ habe ich den Namen der DNS-Domaene eingetragen und bei Domaincontroller den voll qualifizierten Namen eines Domaincontrollers. Damit nun die Anmeldung via SSH auch mit Windows-Anmeldedaten funktioniert muss in der /etc/ssh/sshd_config nur noch was angepasst werden.

# Kerberos options
KerberosAuthentication yes
KerberosOrLocalPasswd yes
KerberosTicketCleanup yes

Bitte nicht vergessen anschliessend dem SSH-Daemon die Konfigurationsaenderung mitzuteilen. Das kann sowohl via service ssh reload, als auch via service ssh restart erfolgen. Es funktioniert auch noch ein albekanntes /etc/init.d/ssh restart bei Ubuntu. Das wird allerdings mit einer entsprechenden Meldung, dass das Script zu einem Upstart Job konvertiert wurde, kommentiert.

So, ob die Anmeldung mit AD-Credentials klappt kann man uebrigens auch wie folgt testen.

root@server:~# kinit ramon@Domaene
Password for ramon@Domaene: ****
root@server:~# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: ramon@Domaene
 
Valid starting Expires Service principal
11/10/11 10:28:51 11/10/11 20:27:43 krbtgt/Domaene@Domaene
renew until 11/10/11 20:28:51
root@server:~# kdestroy

Der Webserver Da soweit alles fertig ist, kann mit der Installation der eigentlichen Dienste begonnen werden. Aus den Paketquellen habe ich den Apache-Server und MySQL installiert.

Bei der Installation der zwei Dienste gibt es nichts besonderes zu beachten. Also einfach ein aptitude install apache2 mysql-client libapache2-mod-php5 php5-mysql und warten. Die beiden letztgenannten Pakete werden spaeter fuer LogAnalyzer benoetigt. Die Installation ist tatsaechlich relativ unkompliziert. Aber vorab noch schnell den rsyslog konfiguriert.

rsyslog Im Standard ist das Paket rsyslog bereits installiert, so dass wir nur noch, fuer die Nutzung von MySQL, das Paket rsyslog-mysql nachinstallieren muessen. Hier wird dann auch gleich eine Konfigurationsdatei in /etc/rsyslog.d/ erzeugt, die sich mysql.conf nennt. Im Rahmen der Paketinstallation kann die Konfiguration der Datenbank auch gleich erledigt werden. Nach Eingabe des Kennwortes fuer den Datenbankadministrator (root) kann ein Kennwort fuer den neuen Benutzer „rsyslog“, der dann Rechte auf der neuen Datenbank „Syslog“ haben wird, vergeben werden. Schaut man sich die mysql.conf anschliessend an, wird man etwas in der nachfolgenden Art finden.

root@server:/etc/rsyslog.d# cat mysql.conf
### Configuration file for rsyslog-mysql
### Changes are preserved
 
$ModLoad ommysql
*.* :ommysql:localhost,Syslog,rsyslog,rsyslog

Damit nun noch Logs angenommen werden muss noch die Datei /etc/rsyslog.conf angepasst werden. Fuer den Anfang reicht es aus, dass man die Module imudp und imtcp aktiviert, indem man in der genannten Konfiguration die entsprechenden Bereiche anpasst.

# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

Nach dem Uebernehmen der Konfiguration (service rsyslog restart) kann man auch sehen, dass nun auf dem Port 514 was lauscht.

root@server:/etc# netstat -tulpen | grep 514
tcp        0      0 0.0.0.0:514             0.0.0.0:*               LISTEN      0          36860       9598/rsyslogd
tcp6       0      0 :::514                  :::*                    LISTEN      0          36861       9598/rsyslogd
udp        0      0 0.0.0.0:514             0.0.0.0:*                           0          36856       9598/rsyslogd
udp6       0      0 :::514                  :::*                                0          36857       9598/rsyslogd

Die Profis unter uns nutzen natuerlich lsof, was dann wie folgt ausschauen wuerde.

root@server:/etc# lsof -i tcp:514 -i udp:514
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 677 syslog    3u  IPv4   3327      0t0  UDP *:syslog
rsyslogd 677 syslog    4u  IPv6   3328      0t0  UDP *:syslog
rsyslogd 677 syslog    5u  IPv4   3331      0t0  TCP *:shell (LISTEN)
rsyslogd 677 syslog    6u  IPv6   3332      0t0  TCP *:shell (LISTEN)

LogAnalyzer Da nun alles soweit konfiguriert ist kann der LogAnalyzer angegangen werden. Den gibt es nicht aus den Paketquellen, was aber nicht wild ist, da die Installation, wie oben schon angedeutet, nicht wirklich hart ist. Via wget wird sich das aktuelle Paket von der Herstellerseite herunter geladen und installiert.

root@server:/# mkdir /var/www/loganalyzer
root@server:~# wget http://download.adiscon.com/loganalyzer/loganalyzer-3.2.3.tar.gz
Saving to: loganalyzer-3.2.3.tar.gz
 
root@server:~# tar xzf loganalyzer-3.2.3.tar.gz
root@server:~# cd loganalyzer-3.2.3
root@server:~/loganalyzer-3.2.3# cp -R src/* /var/www/loganalyzer/
root@server:~/loganalyzer-3.2.3# cp contrib/* /var/www/loganalyzer/
root@server:~/loganalyzer-3.2.3# cd /var/www/loganalyzer
root@server:~/var/www/loganalyzer# chmod +x configure.sh secure.sh
root@server:~/var/www/loganalyzer# ./configure.sh
root@server:~/var/www/loganalyzer# cd ..
root@server:~/var/www# chown -R www-data:www-data loganalyzer/

Soweit so… ja, fast fertig. Jetzt sollte man noch das php5-Module fuer Apache mit a2enmod php5 aktivieren. Ist das geschehen kann man den LogAnalyzer konfigurieren. Dafuer verbindet man sich einfach per Webbrowser auf http://server/loganalyzer und geht die Punkte durch.

Was habe ich noch gemacht? Ergaenzend hierzu habe ich fuer Apache SSL aktiviert und einen entsprechenden Redirect konfiguriert, so dass der Aufruf nur noch ueber https moeglich ist. Ergaenzend habe ich noch AuthType Basic konfiguriert, so dass tatsaechlich nur berechtigte Benutzer auf die Seite zugreifen duerfen.

Fuer eine „mal eben“-Installation ist das aus meiner Sicht schon mal recht solide. Es gibt noch ein paar Dinge, die ich verbessern kann. Fuer ssh PasswordAuthentication no setzen. Die Authentifizierung fuer Apache auch an das AD „koppeln“. RELP (Reliable Event Logging Protocol) aktivieren. Eigene Logs des Servers auf einem anderen Server ablegen, um im Falle eines Vorfalls keine modifizierten oder geloeschten Logs vorzufinden. Den Zugriff auf den Webserver ueber /etc/hosts.allow und /etc/hosts.deny weiter reglementieren.

Da ich den Beitrag quasi aus dem Kopf erstellt habe hoffe ich, dass ich keine wichtigen Dinge vergessen habe. Wenn es Fragen, Anmerkungen oder Ergaenzungen gibt, einfach die Kommentare nutzen.

Zurück zur Uebersicht