Raspberry Pi: Push Benachrichtigung bei SSH Anmeldung
Angreifer versuchen, wenn sie einmal in ein System eingedrungen sind, ihre Spuren zu verwischen. Wenn sie z.B. erfolgreich die SSH Zugangsdaten ergattert haben, können sie ihr Unwesen treiben und anschließend alles so säubern, dass ihre Aktivitäten in keinen Logfiles sichtbar sind und der Angriff folglich nicht direkt erkannt werden kann. Wenn jedoch bei dem Login in SSH direkt eine Benachrichtigung über die Anmeldung an ein drittes Gerät versendet wird, ist dies schwer zu verhindern – insbesondere, da der Angreifer wahrscheinlich das System noch nicht kennt. In Zeiten von Smartphones kann man solche Benachrichtigungen auf dieses direkt als Push Benachrichtigung senden lassen. Und für alle, die meinen, dies auch für ihren Raspberry Pi zu brauchen, ist das auch möglich. Im Folgenden werde ich erklären, wie man eine Push Benachrichtigung bei SSH Anmeldung auf dem Raspberry Pi einrichtet.
Voraussetzung: Raspbian oder vergleichbare Distribution installiert
Zunächst installieren wir die App Pushbullet auf Android oder iOS. Diese App ist kostenlos und bietet neben der Möglichkeit, eigene Benachrichtigungen zu scripten auch das Spiegeln aller Android Benachrichtigungen auf einen Computer.
Des Weiteren benötigen wir einen kostenlosen Account bei dem Dienst, den wir beim ersten Start der App am Smartphone anlegen können. Melden wir uns in dem Account auf der Webseite von Pushbullet an, so bekommen wir über den Button rechts oben mit der eigenen E-Mail Adresse und einen weiteren Klick auf Account Settings den API Key, den wir später noch benötigen.
In Pushbullet hat jedes verwendete Smartphone eine eindeutige ID (iden genannt). Wenn wir folgenden Befehl auf dem Raspberry Pi ausführen und dabei APIKEY durch unseren API Key ersetzen, erhalten wir eine Rückgabe in JSON, aus der wir die ID auslesen können.
curl -u APIKEY: https://api.pushbullet.com/api/devices
Beispielsausgabe
{"shared_devices": [], "devices": [{"iden": "uZyKca1g1w3djzWIEVDzXK", "extras": {"android_version": "4.2.2", "sdk_version": "17", "app_version": 60, "model": "HTC One X+", "manufacturer": "HTC"}, "id": 1629699524217220}]}
ID (iden)
uZyKca1g1w3djzWIEVDzXK
Auf dem Raspberry Pi benötigen wir das kleine Programm gawk, welches wir über den Paketmanager installieren.
sudo apt-get install gawk
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="v1OOYX5znV69XdgGyhIGW7qMloGRAXfptKujyKUa1g1w4" IDEN="uZyKca1g1w3djzWIEVDzXK" DISABLEDNOTIFICATIONIP="NONEIP" 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=\"Raspberry Pi SSH login\" -d body=\"User %s has logged in from %s\" -X POST", $9, $11); system(cmd) } }'
Dem soeben angelegten Script müssen wir nun noch Rechte geben, um ausgeführt zu werden.
sudo chmod 777 /usr/local/bin/pushbullet-ssh
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
Abschließend müssen wir den Raspberry Pi einmal neustarten.
sudo reboot
Das wars! Ab sofort solltest du, wenn sich jemand auf dem Raspberry Pi via SSH anmeldet, eine Push Benachrichtigung auf dein Smartphone erhalten.
Das Tutorial wurde am 20. März 2014 überarbeitet.
60 Kommentare. Hinterlasse eine Antwort
Haha, ein IDS für Arme 😉
Aber gute Idee, danke!
LG Thomas
Ah, gute Idee eigentlich und da ich Pushover eh schon benutze…Danke für den Artikel
Kann man sich nicht einfach eine eMail schicken lassen? Die wird doch auch gepusht.
@KNOCHI könnte man, ist aber nur halb so elegant, müllt die die Inbox voll und ist nicht so einfach separat zu behandeln 😉 (notifications usw.)
Hallo Jan, was hältst du von Pushbullet? Zumindest auf Android funktioniert es und es ist kostenlos. Dabei wird ein normales REST Interface benutzt und ein Plugin für Firefox gibt es auch
Hat mich heute auch schon jemand drauf hingewiesen. Ich werde es mir am Wochenende ansehen und ggf. das Tutorial überarbeiten.
Erledigt 🙂
Müllt ein „tail -F“ nicht den Speicher langsam zu? Wie lange läuft ein RPi ohne ihn neu starten zu müssen?
Naja wenn der PI komplett fertig eingerichtet wurde und keine neustarts mehr nötig sind, solange bis dass System nicht mehr gebraucht wird bzw. bis der nächste Neustart wegen einer änderung nötig wird
Coole Beispiel mit viel Potential für andere Szenarion
Hey wie immer cool,
nur hab ich da gleich eine Frage,
wäre es irgendwie möglich bestimmte IP´s (Private IP´s Bereiche) davon auszuschließen.
Ehrlich gesagt ist es total nervig wenn jedes mal ne Message rausgeschickt wird, obwohl ich mich von intern über SSH anmelde 😉
Wäre es bestimmt. Werde ich, wenn ich Zeit finde, noch einbauen.
Hab diese Funktion hinzugefügt 🙂
Hallo, cooles Tutorial, vielen Dank. Einzig die Adressraumeinschränkung funktioniert bei mir nicht. Hab‘ 192.168.1 eingetragen und trotzdem gibt’s Meldungen. lg, Lukas
Mittlerweile funktioniert’s.
Mir würde im Prinzip das ganze auch mit einer mail ausreichen.
kann man bei dem dienst den auch mehrere Rechner einrichten.
z.b 2 pi’s 1 nas …
Logo geht das. Auf alle gewünschten Geräte das Script und ab gehts!
Hier mal mein Script für Pushbullet:
#!/bin/bash
tail -F /var/log/auth.log | gawk ‚{if(NR>10 && $0 ~ /sshd/ && $0 ~ /Accepted/){ cmd=sprintf(„PFADZUMSCRIPT“); system(cmd)}}‘
Das passende Script & erklärung findet man hier:
http://www.forum-raspberrypi.de/Thread-noch-ein-weg-nachrichten-vom-pi-via-push-auf-ein-android-device
Habe das Tutorial nun für Pushbullet umgeschrieben 😉
Super Idee und gute Erklärung!
Hey Jan!
Erstmal danke für das tolle Tutorial. Aber jetzt zu meiner Frage: Gäbe es auch eine Möglichkeit, statt auf dem Smartphone auf dem Rechner (Ubuntu GNOME) auf dem Desktop eine Benachrichtigung anzuzeigen?
Gruß
Leon
Hallo Leon, wie gesagt es gibt ein Plugin für Firefox. Oder du baust dir was eigenes.
Ah ok, danke für den Hinweis. Dann nutze ich erstmal das und guck mal, ob sich da simpel was zusammencoden lässt.
Das könnte man bestimmt auch basteln, wobei das ein eigenes Tutorial wäre. Außerdem wäre es nicht besonders sinnvoll, da dein Comouter, im Gegensatz zu deinem Smartphone, ja wahrscheinlich nicht permanent an ist.
Mahlzeit,
um einen openvpn-server auf Connects zu überwachen:
in die openvpn-server.conf:
script-security 2
client-connect /etc/openvpn/connect
und ins /etc/openvpn-Verzeichniss eine ausführbare Datei namens connect:
#!/bin/bash
APIKEY="hier_den_APIKEY_rein"
IDEN="hier_das_Empfangs_Device_rein"
TO="https://api.pushbullet.com/api/pushes"
/usr/bin/curl -s $TO -u $APIKEY: \
-d device_iden=$IDEN \
-d type=note \
-d title="Openvpn connect" \
-d body="Client $common_name has connected" \
-X POST
mach mal ein schönes Tut draus! 😉
Gruss Björn
Sehe darin ehrlich gesagt nicht so den großen Nutzen wie bei SSH. Aber habe deinen Kommentar nun mal schön formatiert, sodass interessierte Leser deine Snippet verwenden können 😉
Auch von mir an dieser Stelle ein großes Dankeschön! Für mich newbie auf der Linux-Seite ein sehr gutes Tutorial. Eine Frage hätte ich noch: Da Pushbullet an die Messages leider keinen Zeitstempel anhängt stelle ich mal hier die Frage, wie man den Messagetext so anpassen kann, dass das aktuelle Datum und die Uhrzeit angezeigt werden? DAnke schon mal!
Wenn du in die Pullbullet App rein gehst und dort auf die jeweilige Benachrichtigung klickt siehst du den Zeitstempel. Er ist lediglich in der Notification Bar nicht angezeigt.
In der iPhone-App leider nicht 🙁
Schreib am Besten mal an die Jungs von Pushbullet, sind nett und offen für Anregungen. Dies ist nämlich etwas Problem, dass bestimmt nicht nur bei diesem Anwendungsfall existierten wird.
Im Script könntest du das Datum mit Uhrzeit als Parameter an gawk übergebe und dort, wie z.B. auch bei dem APIKEY, das Datum in den Text einbinden.
An Deinem letzten tipp hatte ich mich schon im Vorfeld versucht; leider bin ich damit noch nicht so erfahren und so zeigt er mir derzeit immer nur Datum und Uhrzeit des letzten RasPi-Starts an.
Die Jungs von Pushbullet werde ich mal aktivieren, vielleicht haben die ja schon eine Lösung in der Schublade.
Super Idee! Ich habe folgende Zeile in meine .bashrc eingetragen, sodass ich mir den cron job spare:
curl https://api.pushbullet.com/api/pushes -u YourApiKey: -d device_iden=YourIden -d type=note -d title=“RaspBerry Pi Login“ –data-urlencode body=“$(tail /var/log/auth.log)“ -X POST -s >/dev/null
[…] wenn jeman sich per SSH auf den Raspberry Pi einloggt. Als Basis diente diese sehr ausführliche Seite die sowas mit Pushbullet realisiert […]
Hi,
ich habe ClamAV als Virenscanner installiert und wollte nun haben das ich gerne eine Benachrichtigung bei Virusbefund bekomme.
Hab dies schon mit sendmail versucht, aber leider geht es irgendwie nicht.
Jetzt meine Frage ob das eventuell mit pushbullet geht?
Wobei ich glaube der Fehler liegt eher an der freshclam.conf
Ist „VirusEvent /pfadzumscript“ richtig?
Ich kenne persönlich ClamAV nicht. Wenn du so etwas machen möchtest musst du bspw. aus einem Logfile die entsprechende Information raus parsen und dadurch das Push Event auslösen.
Hi du…
Kannst du den mir sagen warum ich die Benachrichtigung nur auf dem pc bekomme und nicht auf das Handy???
Ich tippe mal du ID (iden) von deinem Desktop Client ausgelesen und im Script eingetragen 😉
könnte man darüber nicht auch irgendwie die öffentliche IP einmal täglich oder wenn diese sich ändert aufs handy gepusht bekommen?
braucht man kein dyndns-service mehr…
Das ist der Ansatz von DynDNS, nur, dass zusätzlich der DNS Record mit einer sehr kleinen TTL automatisch aktualisiert wird.
Hallo Jan,
Gibt es die alte Fassung des Tutorials für Pushover noch?
Vg Kai
Nicht mehr wirklich. Verwende doch Pushbullet. Diese Anwendung ist auch kostenlos.
Moin Jan
Vielen dank für den Artikel. Funktioniert auf dem Raspberry Pi super!
Gibt es auch eine Möglichkeit das Script ohne root rechte zu verwenden? Hintergrund ist das ich das auch gerne bei einem Webhosting (mit SSH, jedoch ohne root) verwenden möchte.
Gruss
Markus
Wenn du Lesezugriffe auf /var/log/auth.log auch dem dritten Nutzer gibst funktioniert es auch ohne Root-Rechte.
Interessant. Ist man unter Debian (nicht auf dem RPi) als root eingeloggt muss die crontab angabe anders gemacht werden.
1. „sudo“ braucht es nicht. – Eigentlich logisch.
2. Ich musste den ganzen Pfad zur ausführbaren Datei angeben.
Hab 20 Minuten gebraucht um zu kapieren *weshalb* das nicht geht. *Arrg!
Wenn das Script wie beschrieben unter /usr/local/bin abgelegt wird sollte da (mit Ausnahme von sudo) genau so funktionieren.
Hab das File mit „nano /usr/local/bin/pushbullet-ssh“ erstellt. Liegt soweit am richtigen Ort.
Ganz normal in der Konsole kann ich das script auch ohne die ganze Pfadangabe aufrufen. Nur via crontab ging es nicht.
Naja, seltsam. Hauptsache es geht jetzt. 🙂
gibt die Pushbullet-App bei euch auch keinen Ton von sich?
Habe in den Einstellungen den Benachrichtigungston und auch Vibration eingestellt, aber es kommt nichts wenn ich eine Pushnachricht empfange. In der Liste stehen die Nachrichten aber alle drin.
Ich habe mir PushBullet für Android heruntergeladen und möchte über den Eingang neuer Nachrichten per Benachrichtigungston und Android-Benachrichtigung informiert werden. Leider sehe auch ich die neuen Meldungen nur, wenn ich PushBullet manuell kontrolliere.
Problem gelöst… wird die Nachricht NICHT nur an ein einzelenes Ziel gesendet, dann meldet sich Android (bei mir).
Zustellung aber ohne Benachrichtung/Sound:
IDEN=“uZyKca1g1w3djzWIEVDzXK“
mit Benachrichtung/Sound:
#IDEN=“uZyKca1g1w3djzWIEVDzXK“
Danke für die Mühe, so viele tolle Tutorial zu erstellen!
Und nun auch noch die Ursache…Pushbullet und Anleitung funktionieren.
In Step 2 steht „ID (iden)“ und in der Beispielausgabe ist die „id“ rot hinterlegt. Verwendet werden muss aber die „iden“, dann klappt es auch mit einem einzelnen Ziel.
Danke für diese Tutorial. Bei mir läuft das gut so.
Kann man das Script noch so erweitern, dass man den Netzwerk-Namen zur IP-Adresse noch mitgeliefert bekommt? Also im Prinzip noch ein “’whois IPADDR | grep -i netname“‘ mitbekommt?
Bin leider kein Shell-Profi, was müsste ich wohl tun, damit das klappt?
Funktioniert super !
Kann man irgendwie auch nicht erfolgreiche Anmeldungen loggen ?
Das macht meines Wissens nach auch fail2ban, welches ich im Artikel SSH vor Angriffen absichern erwähnt habe.
Jake, wenn du fail2ban nutzt, ersetz in /usr/local/bin/pushbullet-ssh die Zeile 6 mal durch:
tail -F /var/log/auth.log | gawk -v APIKEY=$APIKEY -v IDEN=$IDEN -v DISABLEDNOTIFICATIONIP=$DISABLEDNOTIFICATIONIP '{ if(NR>10 && $0 ~ /sshd/ && $0 ~ /Failed/ && $0 !~ /'"$DISABLEDNOTIFICATIONIP"'/) { cmd=sprintf("curl https://api.pushbullet.com/api/pushes -u " APIKEY ": -d device_iden=" IDEN " -d type=note -d title=\"RaspPi SSH Login Rejected\" -d body=\"User %s tried to logged in from %s - Rejected\" -X POST", $9, $11); system(cmd) } }'
Also im Prinzip nur „Accepted“ durch „Failed“ ersetzt. Evl. noch Pfad zum Log anpassen, bei mir geht es damit.
Hi Jan,
wäre es möglich wenn du mir ein kleines TUT an die Hand gegeb könntest, wo ich die selbe Benachrichtigung bei einem PROFTPD login bekomme?
Wäre klasse, danke im Voraus
Gruß
Dazu musst du sehen wo ProFTPD seine Logs ablegt, diese analysieren und daraus eine Reaktion ableiten. Ich persönlich habe momentan leider nicht die zeitlichen Ressourcen hierfür.
Hallo Jan,
zunächst einmal danke für Deine ausführlichen Anleitungen!
Bei dieser komme ich allerdings nicht weiter, da sich anscheinend die Syntax bei pushbullet geändert hat. Zumindest komme ich mit Deinem Script nicht weiter.
Entsprechend der API habe ich folgendes gebastelt, komme aber nicht weiter:
TOKEN=“u8Ps9XXXXXXXXXXXvcmXXXXTr“
IDEN=“ujviWXXXXXX3P0Jl6″
DISABLEDNOTIFICATIONIP=“NONEIP“
tail -F /var/log/auth.log | gawk -v TOKEN=$TOKEN -v IDEN=$IDEN -v DISABLEDNOTIFICATIONIP=$DISABLEDNOTIFICATIONIP ‚{ if(NR>10 && $0 ~ /sshd/ && $0 ~ /Accepted/ && $0 ! /'“$DISABLEDNOTIFICATIONIP“‚/){ cmd=sprintf(„curl –header ‚Authorization: Bearer u8Ps9XXXXXXXXXXXvcmXXXXTr‘ -X POST https://api.pushbullet.com/v2/pushes –header ‚Content-Type: application/json‘ –data-binary ‚{„type“: „note“, „title“: „RaspPi SSH Login Rejected\“, „body“: „User %s tried to logged in from %s – Rejected\“, $9, $11); system(cmd)}}‘
Kannst Du Deine Anleitung auf die neue API anpassen?
Danke 🙂
Ich habe es gerade ausprobiert. Funktioniert einwandfrei. Außerdem, nur dem Verständnis halber, wenn sich eine API ändert wird diese neu versioniert, was bedeutet, dass die altere Version ohne Veränderung bis zur Abschaltung weiter läuft, denn ansonsten hätten alle Anwendungen ein Problem, was nicht sein darf.
Hi, bin raspberry Pi Anfänger und habe auch keine Ahnung was ein SSH ist 😀 meine Frage wäre, ob der Raspberry pi mir auch eine Pushbenachrichtigung senden kann, wenn sich jemand mit meinem Wlan verbindet?
Geniale Sache! Funktioniert von der Konsole aus ohne Probleme. Aber per cronjob will es einfach nicht.
Hab schon die cronlogs aktiviert, da wird zumindest erwähnt dass das pushbullet skript gestartet wird. Aber keine Fehlermeldung oder sonstwas hilfreiches.
Hab schon etliche Varianten durchprobiert. Mit Pfadangabe, mit & am Ende, mit >> logdatei, aber es ist einfach nichts zu sehen. Und wie gesagt, wenn ich es per Konsole starte läuft es einwandfrei. Es ist zum Mäuse melken.
Irgendeine Idee wie ich dem Problem auf die Schliche kommen kann?