Mal wieder ein bisschen Tech-Stuff zur Abwechslung.
Viele kennen vermutlich das ungute Gefühl, wenn man einen Server mit aktiviertem SSH-Login im Internet hängen hat. Man weiß trotz Absicherung der SSH-Konfiguration und dem Einsatz von Fail2Ban oder ähnlichem nie genau, ob nicht doch irgendwo etwas schief geht. Ein etwas ungutes Gefühl hinterlassen stellenweise auch so genannte VServer welche bei diversen Unternehmen bezogen werden können.
Das folgende Skript bietet weder einen 100%igen Schutz noch kann es in allen Fällen einen Zugriff auf das System entdecken. Es bietet aber einen gute Basis um im Fall der Fälle vielleicht doch eine E-Mail zu bekommen um schnell zu reagieren.
Ich versuche mal die Einrichtung des Skripts anhand eines Debian-Servers und meiner QNAP zu beschreiben. In beiden Fällen funktioniert es bei mir problemlos. Kombiniert mit einem Dienst wie z.B. ifttt.com lassen sich aus den Mails auch SMS oder Telefonanrufe generieren.
Debian
Die Einrichtung unter Debian geht ziemlich einfach von statten. Normalerweise sollten alle benötigten Pakete (postfix, bsd-mailx) bereits installiert und funktionsfähig sein. Wenn nicht, kann auch die folgende Installation der QNAP mit nail als Mailer herangezogen werden.
Mehr Informationen zum einrichten eines Mail-Servers unter Debian gibts z.B. hier:
http://wiki.ubuntuusers.de/Postfix
Im ersten Schritt wird ein Skript welches die benötigten Informationen sammelt irgendwo im Filesystem abgelegt. Für dieses Beispiel hier nennen wir das Skript einfachmal “alert.sh” und legen es nach “/usr/local/bin/”
#!/bin/bash
echo "Login detected at $(hostname) / $(date +%d.%m.%Y) $(date +%H:%M:%S)"
FROM=`echo $SSH_CONNECTION | awk '{ print $1 }'`
echo "Benutzer: $USER@$FROM"
echo
echo -n "Uptime: "
uptime
echo
echo "Last Login Activity: "
last
echo
echo "Logged in Users: "
finger |
Wer möchte kann dieses Skript natürlich nach seinen Wünschen anpassen und verbessern.
Das Skript bekommt jetzt noch die passenden Rechte, damit es auch jeder Benutzer beim Login ausführen kann.
chmod 755 /usr/local/bin/alert.sh |
Im “Normalfall” werden bei jedem Login die Profil-Daten gelesen. Erste Anlaufstelle ist meistens die /etc/profile. Genau da setzt der 2.Schritt dann an. Die Datei /etc/profile wird um folgendes erweitert:
...
# send mail on successful login
/usr/local/bin/alert.sh | mailx -s "SSH Login at $(hostname) detected" mail@domain.de
... |
QNAP
Auch auf den QNAP-Systemen lässt sich dieser Schritt vollziehen. Das Skript fällt an dieser Stelle aber etwas kürzer aus, da die Busybox der QNAP ziemlich sparsam bestückt ist und das IPKG-Paket z.B. Dinge wie “finger” oder “last” nicht mitliefert.
Zuallererst brauchen wir auf der QNAP einen mailer. Hier bietet sich im Gegensatz zum Debian-Server nail an. nail kommt als IPKG-Paket mit und kann einfach angepasst werden.
Das Skript selbst kommt hier in einer minimalen Version
#!/bin/bash
echo "Login detected at $(hostname) / $(date +%d.%m.%Y) $(date +%H:%M:%S)"
FROM=`echo $SSH_CONNECTION | awk '{ print $1 }'`
echo "Benutzer: $USER @ $FROM"
echo
echo -n "Uptime: "
uptime |
Der Schritt mit der /etc/profile ist auch hier identisch, mit der Ausnahme, dass der Mailer mailx durch nail ersetzt wird.
# send mail on successful login
/opt/bin/catch | nail -s "SSH Login at $(hostname) detected" mail@domain.de |
Damit nail auch noch ohne MTA den passenden Mailserver findet, kann dieser in der /opt/etc/nail.rc eingetragen werden:
...
set smtp=smtp://smtp.domain.de
set from="qnap@domain.de (QNAP <MODELL>)"
set smtp-auth=login
set smtp-auth-user=qnap
set smtp-auth-password=blubber123
... |
Anschließend auch hier noch das Skript mit den passenden Rechten versorgen
chmod 775 /opt/bin/alert.sh |
ACHTUNG
Wie gesagt. Das Skript bietet nur rudimentäre Sicherheit. Es geht an dieser Stelle nichts über eine sinnvolle Härtung des Systems und sicheren Passwörtern oder Schlüsseln.
Trotzdem bietet das Skript zumindest einen kleinen Informationswert und funktioniert auch bei Logins in virtuellen Umgebungen (z.B. “vzctl enter <vid> (OpenVZ)” oder “vserver <vid> enter”).
Erfolgt der Zugriff allerdings direkt auf das Filesystem, in dem z.B . über den Root-Server
auf das Verzeichnis oder Volume zugegriffen wird, passiert gar nichts.