Zum Inhalt springen

Absicherung eines Debian Servers

  • Jonas 

Absicherung eines Debian Servers

Dieser Artikel beschreibt die Absicherung eines Debian Root Servers und optionale Einrichtung von Monitoring.

Inhaltsverzeichnis

  • 1 Minimale Installation
  • 2 SSH Login absichern
  • 3 SSH Port ändern
  • 4 Benachrichtigung bei SSH Login
  • 5 Regelmäßige Systemupdates
  • 6 Alle Ports sperren und mit Whitelists arbeiten
  • 7 Brute Force Attacken mit Fail2Ban verhindern
  • 8 Rootkits mit rkhunter aufspüren
  • 9 Dienste mit Monit überwachen
  • 10 Festplatten mittels smartmontools überwachen
  • 11 Einzelnachweise

Minimale Installation

Installieren Sie Ihren Server stehts nur mit den notwendigen Paketen. Jeder Overhead an Software bedeutet auch mehr potentielle Angriffsfläche.

SSH Login absichern

Es empfiehlt sich dem Root Benutzer keinen direkten SSH Login zu erlauben. Sie können ausserdem eine Gruppe von Benutzern festlegen, die SSH nutzen dürfen.

Die genauer Anleitung finden Sie unter SSH Root Login unter Debian verbieten

Sicherer und komfortabler ist es ausserdem, den Login mit Passwort zu verbieten und dafür einen SSH Key zu verwenden.

Die genaue Anleitung finden Sie unter SSH Key Login

SSH Port ändern

Die Mehrzahl der (automatisierten) Loginattacken auf SSH erfolgt auf den Standardport 22. Eine einfache und effektive Methode ist es, den SSH Port auf einen anderen zu ändern. Öffnen Sie dazu die Konfigurationsdatei von SSH

nano /etc/ssh/sshd_config

und ändern Sie den SSH Port von

Port 22

auf einen anderen Port nach Ihrer Wahl ab. Der SSH Dienst muss danach mit

/etc/init.d/ssh restart

neu gestartet werden.

Beachten Sie bitte, dass Sie keinen festen Port eines anderen Dienstes benutzen. Eine Liste mit Ports und Diensten finden Sie unter

more /etc/services

Aktive SSH Verbindungen bleiben offen. Öffnen Sie nun ein neues Terminalfenster und testen Sie ob Sie SSH mit Ihrem angegebenen Port erreichen, bevor Sie das aktive Fenster schließen.

Benachrichtigung bei SSH Login

Mit folgendem Skript erhalten Sie eine E-Mail, sobald sich ein Benutzer per SSH einloggt.

Erstellen Sie dazu ein ausführbares Shell Skript /opt/shell-login.sh mit folgendem Inhalt:

#!/bin/bash
  
echo "Login auf $(hostname) am $(date +%Y-%m-%d) um $(date +%H:%M)"
echo "Benutzer: $USER"
echo
finger

Damit die Mails beim Login versendet werden, muss folgende Zeile

/opt/shell-login.sh | mailx -s "SSH Login auf IHR-HOSTNAME" ihre-emailadresse@example.com

in der Datei

/etc/profile

eingetragen werden.

Die Datei /opt/shell-login.sh muss die Rechte 755 besitzen:

chmod 755 /opt/shell-login.sh

Die Mail wird nun automatisch versendet, sobald sich ein Benutzer per SSH einloggt. Der User bekommt davon nichts mit.

Regelmäßige Systemupdates

Das Debian Security Team veröffentlicht regelmäßig Sicherheitsupdates und neue Kernelversionen. Die Updates sollten Sie (sofern Sie keinen eigenen, angepassten Kernel verwenden) regelmäßig durchführen. Um nicht jeden Tag Updates manuell prüfen zu müssen, gibt es das Paket apticron, welches Sie per Mail über neue Updates informiert. Installieren Sie zunächst das Paket mit

aptitude install apticron

und legen Sie unter

/etc/apticron/apticron.conf

Ihre Mailadresse und den Hostnamen des Systems (optional) fest. Die Updates könnten natürlich auch per Cronjob jeden Tag automatisch installiert werden, war wir jedoch nicht empfehlen. Sie haben so nie die Kontrolle darüber was installiert wird und können evtl. Fehler nur schwer nachvollziehen.

Weiterführender Link: Debian E-Mail Updatebenachrichtigung mit apticron

Alle Ports sperren und mit Whitelists arbeiten

Diese Methode bedarf großer Vorsicht bei der Einrichtung, damit Sie sich nicht aussperren.

Sobald alle Dienste installiert sind und Sie wissen, welche Ports benötigt werden, können Sie alle anderen Ports mittels iptables blocken.

Weitere Informationen dazu finden Sie auf folgenden Webseiten:

Brute Force Attacken mit Fail2Ban verhindern

Das Packet fail2ban kann verwendet werden um verschiedene Dienste gegen Bruteforce Attacken abzusichern. Nach einer Anzahl X Logins wird die IP Adresse des Angreifers für X Minuten/Stunden/Tage gesperrt.

Die genaue Anleitung finden Sie unter SSH_Login_unter_Debian_mit_fail2ban_absichern

Rootkits mit rkhunter aufspüren

Sollte es einem Angreifer gelingen das System zu kompromittieren, ist es meist schwer nachzuvollziehen wo der Einbruch erfolgte. Mit dem Tool rkhunter wird der Server auf häufige Rootkits, verdächtige Strings, etc. überprüft und der Benutzer beim Fund informiert.

Installieren Sie das Paket mit

aptitude install rkhunter

und tragen Sie in der Datei

/etc/rkhunter.conf

Ihre Mailadresse beim Punkt

MAIL-ON-WARNING="user@domain.tld"

ein. Führen Sie nun einen ersten Test mittels

rkhunter --check

aus. Sollten Sie hier Warnungen erhalten, bei denen Sie wissen dass diese false-positive sind, können Sie Whitelists unter

/etc/rkhunter.conf

erstellen. Diese könnten ungefähr so aussehen

ALLOWHIDDENDIR=/dev/.mdadm
RTKT_FILE_WHITELIST=/etc/init.d/.depend.boot
SCRIPTWHITELIST=/etc/init.d/hdparm

Genaue Ergebnisse der Tests finden Sie unter

/var/log/rkhunter.log

Dienste mit Monit überwachen

Die Dienste auf Ihrem Server können Sie (soweit nicht bereits durch ein anderes Managementsystem eingerichtet) mit dem Tool Monit überwachen. Je nach Konfiguration sendet Monit Ihnen Mails, z.B. wenn ein Dienst nicht erreichbar ist oder von Monit neu gestartet wurde. Sie können den Platz auf den Festplatten, Offene Ports, Dienste und vieles mehr überwachen.

Installieren Sie das Paket mit

aptitude install monit

und ändern Sie per

nano /etc/default/monit

den wert

startup=0

auf

startup=1

damit Monit als Dienst laufen kann. Nun müssen die Dienste, die überwacht werden sollen in die Konfigurationsdatei eingetragen werden:

nano /etc/monit/monitrc

Die Datei könnte z.B. so aussehen (die // Kommentare sind nur zur Erklärung und dürfen in der Konfigurationsdatei nicht angegeben werden)[1]

 set daemon 120                                                 // Monit überprüft all 2 Minuten
 set logfile syslog facility log_daemon                         // Wo wird die Logdatei hingeschrieben
 set mailserver localhost                                       // Mailserver über den die Mails verschickt werden
 set mail-format { from: user@domain.tld }                      // Mailadresse Absender
 set alert user@domain.tld                                      // Empfänger der Mails
 
 check system localhost                                         // Lokalen Server überwachen
    if loadavg (5min) > 1 then alert                            // Wenn Loadaverage über 5 Minuten größer 1 ist, Alarm versenden
    if memory usage > 75% then alert                            // Wenn mehr als 75% des Speichers benötigt werden, Alarm versenden
    if cpu usage (user) > 70% then alert                        // Wenn mehr als 70% CPU Leistung benötigt wird, Alarm versenden (User)
    if cpu usage (system) > 30% then alert                      // Wenn mehr als 30% CPU Leistung benötigt wird, Alarm versenden (System)
    if cpu usage (wait) > 20% then alert                        // Wenn mehr als 20% CPU Leistung benötigt wird, Alarm versenden (Wait)
 
 check process sshd with pidfile /var/run/sshd.pid              // Dienst SSH durch PID File überwachen
    start program  "/etc/init.d/ssh start"                      // Wie kann SSH im Fehlerfall gestartet werden
    stop program  "/etc/init.d/ssh stop"                        // Wie kann SSH im Fehlerfall beendet werden
    if failed port 22 protocol ssh then restart                 // Wenn der SSH Dienst nicht läuft, neu starten
    if 5 restarts within 5 cycles then timeout                  // Wenn nach 5 Versuchen der Dienst nicht gestartet werden kann, mit Timeout beenden
 
 check process mysql with pidfile /var/run/mysqld/mysqld.pid    // Dienst Mysql durch PID File überwachen
    group database                                              // Gruppe definieren
    start program = "/etc/init.d/mysql start"                   // Wie kann der MySQL Server im Fehlerfall gestartet werden
    stop program = "/etc/init.d/mysql stop"                     // Wie kann der MySQL Server im Fehlerfall gestopt werden
    if failed host 127.0.0.1 port 3306 then restart             // Wenn Port 3306 (MySql) auf dem Lokalen Server nicht läuft, neu starten
    if 5 restarts within 5 cycles then timeout                  // Wenn nach 5 Versuchen der Dienst nicht gestartet werden kann, mit Timeout beenden
 

Natürlich gibts es eine Vielzahl anderer Überwachungssoftware auf dem Markt. Monit ist jedoch sehr schnell und unkompliziert eingerichtet. Sollten Sie mehr Details benötigen bzw. ganze Serverfarmen monitoren wollen, empfehlen wir Nagios für welches wir auch IPMI Plugins anbieten.

Festplatten mittels smartmontools überwachen

Wichtige Bauteile wie Festplatten sollten ebenfalls überwacht werden. Da es hier zu viele Konstellationen von Raid Controllern und Konfigurationen gibt, gehe ich hier nur auf die smartmontools ein. In dem Beispielszenario werden 2 SATA Platten mittels mdadm im Raid 1 auf dem onboard Raidcontroller verwendet. Die Installation von mdadm setze ich hier als Grundlage voraus.

Das Paket smartmontools wird mittels

aptitude install smartmontools 

installiert und der auskommentierte Wert

#start_smartd=yes

in der Datei

/etc/default/smartmontools

einkommentiert werden, damit der Dienst aktiv beim Systemstart gestartet wird.

start_smartd=yes

Nun werden die zu überprüfenden Festplatten in die Datei

/etc/smartd.conf

eingetragen. Kommentieren Sie zunächst folgende Zeile aus

DEVICESCAN -d removable -n standby -m root -M exec /usr/share/smartmontools/smartd-runner

und setzen Sie diese beiden Zeilen darunter

/dev/sda -n standby -a -I 194 -W 6,50,55 -R 5 -M daily -M test -m user@domain.tld
/dev/sdb -n standby -a -I 194 -W 6,50,55 -R 5 -M daily -M test -m user@domain.tld

Erklärung:

 /dev/sda               // Bezeichnung der zu überwachenden Festplatte
 -n standby             // Wenn die Festplatte im Standbymodus ist, diese nicht aufwecken
 -a                     // Alle Werte überprüfen
 -I 194                 // Temperature Wert auslassen
 -W 6,50,55             // Änderungen von 6 Grad oder mehr reporten. Temperaturhöchstwert 50 Grad. Bei 55 Grad warnen.
 -R 5                   // Reallocated Sectors beachten (ID 5)
 -M daily               // Tägliche Erinnerung versenden, auch wenn das Problem bereits gemeldet wurde
 -M test                // Testmail beim Neustart des Diensts schicken
 -m user@domain.tld     // Empfänger der Warnungen