SSH-Security: Login-Benachrichtigung

Um den SSH-Zugriff auf einen Server abzusichern, ist es neben den „üblichen“ Vorkehrungen wie dem Verbieten des Root-Logins hilfreich, bei jedem erfolgreichen Anmeldevorgang per E-Mail über diesen benachrichtigt zu werden.

Dies hat sich bei mir vor einigen Jahren bereits als sinnvoll erwiesen, nachdem sich Angreifer über Brute-Force Zugriff auf einen (weniger wichtigen) User verschafft haben.

Bei jedem Login bekomme ich eine Mail in folgender Form:

Betreff: SSH Login auf hostname

Login auf x.de am 2016-09-13 um 18:46
Benutzer: x
IP: 2003:c6:xxxx:xxxx:4593:cba3:xxxx:xxxx
Hostname: p200300C6xxxxxxxx4593CBA3xxxxxxxx.dip0.t-ipconnect.de.
Whois: 
org-name:       Deutsche Telekom AG address:        Ammerlaender Heerstrasse 138
address:        D-26129
address:        Oldenburg
address:        GERMANY
address:        Deutsche Telekom AG
address:        Internet Services
address:        Ammerlaender Heerstrasse 138
address:        DE 26129 Oldenburg
address:        Germany 


Wie man sieht, bekomme ich nicht nur die Loginzeit ausgeliefert, sondern auch:

  • den SSH-Benutzer,
  • die IP des Clients,
  • den Hostname des Clients,
  • sowie ein WHOIS der Client-IP.

Dadurch kann ich mit ziemlicher Sicherheit feststellen, ob ich das war.

Ist beispielsweise irgendein russischer Provider aufgeführt, merke ich sofort, dass etwas nicht so ist wie es sein sollte, und man kann entsprechende Aktionen einleiten.

Die Umsetzung ist auch relativ simpel:

Zunächst braucht man ein paar Pakete:

  • bsd-mailx für den mailx-Befehl
  • dnsutils für dig
  • whois für die whois-Abfrage
apt-get install bsd-mailx dnsutils whois

Zunächst muss in der Datei /etc/profile (Erklärung hier) ein Befehl definiert werden, der die eigentliche Benachrichtigung definiert und per Mail versendet:

/opt/shell-login.sh | mailx -a "From: postmaster@x.de" -s "SSH Login auf hostname" empfänger@example.com

Hier wird das Script „shell-login.sh“ in /opt aufgerufen (was natürlich auch woanders liegen kann), der Output zu Mailx gepiped und mit entsprechendem „From“-Header und Betreff versendet.

Das eigentliche Script ist auch relativ simpel:

#!/bin/bash

echo "Login auf $(hostname) am $(date +%Y-%m-%d) um $(date +%H:%M)"
echo "Benutzer: $USER"
ip=$(echo $SSH_CLIENT | awk '{ print $1}' )
echo "IP: $ip"
echo "Hostname: $(dig +short -x $ip)"
echo "Whois: "
echo "$(whois $ip | grep OrgName) $(whois $ip | grep org-name) $(whois $ip | grep address:) $(whois $ip | grep person)"

Zunächst wird das Script als Bash-Script definiert.

In Zeile 3 wird der Servername sowie das Datum ausgegeben, gefolgt von dem ausführenden (d.h. angemeldeten) User.

Zeile 5 greift sich über die SSH-Variable die Client-IP.

Zeile 6 gibt diese direkt aus, und Zeile 7 führt mittels dig einen Reverse-DNS-Lookup durch, um den Hostnamen (und dadurch den Provider) des Clients zu ermitteln.

Die letzten beiden Zeilen des Scripts holen sich schließlich mittels grep noch die interessanten Infos aus der Whois-Abfrage raus, und nun hat man alle für mich wichtigen Infos.

Ich hoffe, der Beitrag hilft bei eurer Serverabsicherung.

Gibt es vielleicht noch weitere interessante Daten, die mit in die Benachrichtigung sollten? Wie sieht eure Lösung aus?

Ich freue mich über eure Kommentare 🙂