SSH von ESXi absichern

Vor kurzem habe ich ja bereits über Syslog geschrieben. Jeder der schon mal einen Server in den weiten des Internets betrieben hat (damit meine ich nicht zu Hause im eigenen Netzwerk), der weiss, wie schnell es geht, bis die ersten Bots und Kiddies mit endlosen Versuchen probieren, das SSH-Passwort zu knacken.
Für Linux-Distributionen wie Ubuntu, Debian, RedHat oder was auch immer gibt es unzählige Tools und Applikationen, welche helfen entweder den SSH-Zugriff zu verstecken, oder aber zu verteidigen.

Beides gibt es leider nicht bei meinem ESXi Server. Noch nicht mal eine anständige iptable oder hosts.deny sind vorhanden, geschweige denn von einer Firewall, wie es bei ESX Standard ist.

Um jedoch mal zu sehen, wie viele Personen versuchen, mein SSH zu knacken, habe ich ein einfaches kleines Script für Nagios geschrieben.

Ich weiss es kann noch viel optimiert werden dabei, doch es erfüllt seinen Zweck:

#!/bin/bash

# ####################################################################
# Check Syslog /var/log/SPLVS002.log for Brute Force Attacks via SSH
# by Patrick Schmid
# Version 1.0
######################################################################

export STATE_OK=0
export STATE_WARNING=1

time=`date +%H.%M.%S |cut -d'.' -f1`
time=`echo $time|sed 's/^0*//'`
time2=$(( $time - 1))
time3=$(( $time - 2))

if [ $time -lt 10 ]; then
        time=0$time
fi

if [ $time2 -lt 10 ]; then
        time2=0$time2
fi

if [ $time3 -lt 10 ]; then
        time3=0$time3
fi

compare=`tail -300 /var/log/SPLVS002.log |grep "from" |grep "root" |grep "attempt" | cut -d' ' -f3`
compare=`echo $compare | cut -d' ' -f1`

if [ $compare -lt 10  ]; then
        attackers=`tail -300 /var/log/SPLVS002.log |grep "from" |grep "root" |grep "attempt" | cut -d' ' -f4,14 |cut -d':' -f1,2,3 |sed -e 's/://' | tee -a |sed -e 's/://' |tee -a |grep "^$time\|^$time2\|^$time3" |cut -d' ' -f2 |sort |uniq`
        computers=`tail -300 /var/log/SPLVS002.log |grep "from" |grep "root" |grep "attempt" | cut -d' ' -f4,14 |cut -d':' -f1,2,3 |sed -e 's/://' | tee -a |sed -e 's/://' |tee -a |grep "^$time\|^$time2\|^$time3" |cut -d' ' -f2 |sort |uniq |wc -l`
        attemps=`tail -300 /var/log/SPLVS002.log |grep "from" |grep "root" |grep "attempt" | cut -d' ' -f4,14 |cut -d':' -f1,2,3 |sed -e 's/://' | tee -a |sed -e 's/://' |tee -a |grep "^$time\|^$time2\|^$time3" |cut -d' ' -f2 |sort |wc -l`
else
        attackers=`tail -300 /var/log/SPLVS002.log |grep "from" |grep "root" |grep "attempt" | cut -d' ' -f3,13 |cut -d':' -f1,2,3 |sed -e 's/://' | tee -a |sed -e 's/://' |tee -a |grep "^$time\|^$time2\|^$time3" |cut -d' ' -f2 |sort |uniq`
        computers=`tail -300 /var/log/SPLVS002.log |grep "from" |grep "root" |grep "attempt" | cut -d' ' -f3,13 |cut -d':' -f1,2,3 |sed -e 's/://' | tee -a |sed -e 's/://' |tee -a |grep "^$time\|^$time2\|^$time3" |cut -d' ' -f2 |sort |uniq |wc -l`
        attemps=`tail -300 /var/log/SPLVS002.log |grep "from" |grep "root" |grep "attempt" | cut -d' ' -f3,13 |cut -d':' -f1,2,3 |sed -e 's/://' | tee -a |sed -e 's/://' |tee -a |grep "^$time\|^$time2\|^$time3" |cut -d' ' -f2 |sort |wc -l`
fi

[ "$attackers" ] && echo -e "$attemps attemps from $computers attackers\n$attackers"
[ "$attackers" ] || echo "No Attack running"

[ "$attackers" ] && exit $STATE_WARNING
[ "$attackers" ] || exit $STATE_OK

Und schon sieht man in Nagios selbst, was so abgeht:

So dann weiter im Konzept! Es gibt zwar keine Möglichkeit, Angreifer aussperren oder ähnliches, jedoch aber kann man verhindern, dass das Passwort erraten werden kann, indem man das Login mit einem zusätzlichen Zertifikat schützt. Wie das geht, lest ihr in den folgenden Zeilen!

Zuerst wird ein Key generiert, mit ssh-keygen.
Nun kann der Public-Key kopiert werden, denn dieser muss auf den ESX wie folgt eingefügt werden:

mkdir /.ssh
touch /.ssh/authorized_keys
chmod 0600 -R /.ssh
echo "ssh-rsa KEY_HIER_EINFÜGEN" >> /.ssh/authorized_keys

Update vom 30.08.2012: Unter ESXi5 muss der Key neu unter /etc/ssh/keys-root/authorized_keys abgelegt werden.

Nun kann man das Login schon mal prüfen. Hier sollte man bereits mit dem Key einloggen können.

Jetzt wird das ganze noch abgesichert, damit es auch einen Reboot übersteht. Einfach den obigen Part in die Datei /etc/rc.local einfügen und abspeichern.
Und zu guter Letzt wird noch das Login ohne Zertifikat deaktiviert. Dazu wird in der Datei /etc/inetd.conf den beiden Punkten „ssh“ der Parameter -s angefügt:

ssh      stream   tcp   nowait   root   /sbin/dropbearmulti   dropbear ++min=0,swap,group=shell -s -i -K60
ssh      stream   tcp6  nowait   root   /sbin/dropbearmulti   dropbear ++min=0,swap,group=shell -s -i -K60

Von nun an ist ein Login nur noch mit Zertifikat möglich, wodurch auch die lästigen Bots ausgebremst werden.

13 Kommentare bei „SSH von ESXi absichern

  1. Warum nicht einfach ssh-copy-id verwenden? Das Skript läuft ja auf dem Client, sollte also auch mit exotischen SSH-Servern funktionieren…

    1. Unter dem Punkt kann ich nur die laufenden Services steuern. Möglichweise hast du überlesen, dass ich die freie Version von ESXi benutze? Die vollwertige Version hat durchaus eine Firewall.

        1. Unter dem Punkt „Security Profile“ > „Propreties“ kann ich nur die
          einzelnen Dienste wie SSH, NTP, etc starten und stoppen. Weitere
          Einstellungen kann ich keine vornehmen.

        2. Bei mir gibt es den Punkt „Firewall“ nicht. Bei dir nur, weil du eine Pro-Lizenz hast. Das siehst du im Titel der Applikation wo noch „Evaluation (60 days remaining)“ steht. Nach 60 Tagen wirst du auch kein Punkt „Firewall“ mehr haben, da mach ich eine Wette mit dir 😉 Denn die Firewall gibt es nur in der Pro-Version, wie es schon in meinem Artikel steht 🙂

  2. Unter dem Punkt „Security Profile“ > „Propreties“ kann ich nur die einzelnen Dienste wie SSH, NTP, etc starten und stoppen. Weitere Einstellungen kann ich keine vornehmen.

  3. Zertifikate sind natürlich eine gute Sache und schotten den Server sicher ab. Leider sind sie auch unhandlich.
    Neben der Firewall mit iptables gibt es die Möglichkeit mit den host.deny bzw. host.allow Dateien (DenyHosts Script und TCP_wrappers)
    Auch nicht schlecht (natürlich absolut nicht sicher, verringert aber den Netzwerk-Traffic) ist, wenn man den Port (vom Standard-Port 22) auf einen andern Port verschiebt.

    1. Leider gibt es nichts davon in ESXi:

      „Beides gibt es leider nicht bei meinem ESXi Server. Noch nicht mal eine anständige iptable oder hosts.deny sind vorhanden, geschweige denn von einer Firewall, wie es bei ESX Standard ist.“

      Und über Methoden zum Absichern von normalen Linux-Servern habe ich auch schon im Blog berichtet (siehe früherer Kommentar).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.