Debian – Push Benachrichtigung bei SSH Anmeldungen

Debian – Push Benachrichtigung bei SSH Anmeldungen

Auch wenn ich meine Server und mein PI hinter Firewalls, CDN und mehr versteckt habe, gibt es Möglichkeiten SSH zu erreichen.
Wer möchte das denn nicht? Auch wenn man den Port verlegt, so das Root nicht mehr zugänglich ist und man einen neuen Benutzer erreicht, es gibt keine 100%ige Sicherheit.Bei korrekter Einrichtung von Fail2Ban wird auch schon vorher Alarm geschlagen.

Daher kann man sich für den Notfall oder auch bei Benutzung von mehreren Leuten, sich Benachrichtigungen zukommen lassen. Natürlich wäre das möglich per Email wie beim Tempcheck, doch man möchte das ja möglichst sofort.

In diesem Beispiel gehe ich nun mit Pushbullet vor, das ich vor einigen Jahren bei entdeckte und seit dem ein treuer Begleiter ist. (Auch wenn ich aktive externe Tools nicht gut heiße.)
Wichtig ist das man erst einmal Pushbullet besitzt, egal ob Windows, Chrome oder mobile Variante.

Anforderungen installieren:
sudo apt-get install gawk curl

API erstellen
Unter den Account Einstellungen klicken wir auf Create Access Token.
Dieser sieht dann ungefähr so aus.
b.vacH42DRLvGZ33hBauFLcen3wzvV5ige
Wichtig, den Api Key dürft ihr nicht einfach leichtsinnig teilen (gerade im Quellcode auf Github etc.), das steht auch noch einmal explizit dort.

ID ermitteln
Wichtig ist natürlich, das man Pushbullet an dem jeweiligen Gerät installiert und anmeldet, damit eine ID erzeugt werden kann. Ich persönlich bevorzuge den Browser, da die Windows App bei mir sonst nur gefühlt 100x Meldungen die Minute bringen würde.
Jedes Gerät was man direkt mit Pushbullet versehen kann, bekommt eine solche ID.
Mit curl ermitteln wir die ID des jeweiligen Gerätes.
curl -u APIKEY: https://api.pushbullet.com/api/devices

Die ganze Ausgabe sieht dann ungefähr so aus:
curl -u b.vacH42DRLvGZ33hBauFLcen3wzvV5ige: https://api.pushbullet.com/api/devices
{"devices":[{"id":1787473222222336,"iden":"ujBRRnV15234ftzTLrMxtk","extras":{"manufacturer":"samsung","model":"SM-LMAF","android_version":"","sdk_version":"","app_version":"256"}},{"id":9875042654342592,"iden":"ujBRRnV152GsjAfkAu7BVk","extras":{"manufacturer":"Google","model":"Chrome","android_version":"","sdk_version":"","app_version":"318"}},{"id":0,"iden":"ujBRRnV14687zWIEasdOK","extras":{"manufacturer":"apple","model":"Iphone 7","android_version":"","sdk_version":"","app_version":"153"}},{"id":0,"iden":"ujBR4f352GdjAiVsKnEfa","extras":{"manufacturer":"Mozilla","model":"SM-T800","android_version":"","sdk_version":"","app_version":"42"}},{"id":0,"iden":"ujBR156452Gdjz9U2kKfej","extras":{"manufacturer":"samsung","model":"SM-T400","android_version":"","sdk_version":"","app_version":"134"}}],"shared_devices":[]}

Möchten wir nun also die ID des Iphones, müssen wir den iden der manufactur apple nehmen.
In unserem Fall wäre das:
ujBRRnV14687zWIEasdOK

Script erstellen:
Jetzt legen wir noch ein Script an, das die Kontrollaufgaben übernimmt.
Step 4
Nun legen wir ein kleines Script an, dass später die Logs analysieren wird und ggf. die Nachricht, die über Pushbullet an das Smartphone gesendet wird, erzeugt. Dabei müssen wir in die beiden Variablen APIKEY und IDEN die in Step 1 und Step 2 erhaltenen Keys eintragen. Bei DISABLEDNOTIFICATIONIP kann man, falls gewünscht, noch eine IP-Adresse bzw. einen IP-Adressraum eintragen, für den bei einem SSH Login keine Push Notification erzeugt werden soll. Dies ist praktisch, wenn man z.B. nur benachrichtigt werden möchte, wenn sich jemand von außerhalb des eigenen Netzwerkes anmeldet. Wenn die internen IP-Adressen 192.168.178.xx lautet, muss man 192.168.178 in die Variable eintragen. Wenn alle Logins berücksichtigt werden sollen, muss in der Variable z.B. NONEIP stehen. In dem Editor nano speichert man mittels STRG + X, Y und Enter.

sudo nano /usr/local/bin/pushbullet-ssh
#!/bin/sh
APIKEY="b.vacH42DRLvGZ33hBauFLcen3wzvV5ige" # Your Api Key
IDEN="ujBRRnV14687zWIEasdOK" # Device ID
DISABLEDNOTIFICATIONIP="NONEIP" # If you did't want get Notifications from Internal Network
## Example
# DISABLEDNOTIFICATIONIP="192.168.178"
TITLE="Servername SSH Login " # Device ID

tail -F /var/log/auth.log | gawk -v APIKEY=$APIKEY -v IDEN=$IDEN -v DISABLEDNOTIFICATIONIP=$DISABLEDNOTIFICATIONIP '{
if(NR>10 && $0 ~ /sshd/ && $0 ~ /Accepted/ && $0 !~ /'"$DISABLEDNOTIFICATIONIP"'/) {
cmd=sprintf("curl https://api.pushbullet.com/api/pushes -u " APIKEY ": -d device_iden=" IDEN " -d type=note -d title=\"$TITLE\" -d body=\"User %s has logged in from %s\" -X POST", $9, $11); system(cmd)
}
}'

Berechtigungen erweitern:
Damit der Cronjob auch klappt, müssen die Ausführungs und Lese Rechte gegeben werden.
sudo chmod u+x /usr/local/bin/pushbullet-ssh

Cronjob anlegen:
Jetzt müssen wir das Script in eine Crontab legen, damit es beim Start des Raspberry Pis aufgerufen wird. Dazu fügen wir folgende Zeile am Ende der Crontab Datei in eine neue Zeile ein.
crontab -e
@reboot sudo pushbullet-ssh

Neustarten und nun das Script „geniesen“.
sudo reboot

Wichtig dabei ist, das es ein wenig Ressourcen frisst und das es noch weitere effektivere Möglichkeiten gibt.
Doch für das einfache reicht das hier und lässt sich dementsprechend auch auf andere Scripte anwenden.
Übrigens, das originale Script habe ich auf einem Forum für Raspis gefunden auf der Suche logstash Benachrichtigungen, leider finde ich den Link nicht mehr.