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.