Raspberry Pi: Push Benachrichtigung bei SSH Anmeldung

12 Mrz
12. März 2014

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

Step 1

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.

Step 2

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

ID (iden)

Step 3

Auf dem Raspberry Pi benötigen wir das kleine Programm gawk, welches wir über den Paketmanager installieren.

sudo apt-get install gawk

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

Step 4

Dem soeben angelegten Script müssen wir nun noch Rechte geben, um ausgeführt zu werden.

sudo chmod 777 /usr/local/bin/pushbullet-ssh

Step 5

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

Step 6

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.

Dir hat der Artikel gefallen?
Teile ihn mit deinen Freunden!
56 Antworten
  1. Thomas says:

    Haha, ein IDS für Arme 😉
    Aber gute Idee, danke!

    LG Thomas

    Antworten
  2. Marco says:

    Ah, gute Idee eigentlich und da ich Pushover eh schon benutze…Danke für den Artikel

    Antworten
  3. Knochi says:

    Kann man sich nicht einfach eine eMail schicken lassen? Die wird doch auch gepusht.

    Antworten
    • Marco says:

      @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.)

      Antworten
  4. Marc says:

    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

    Antworten
  5. lighthouse says:

    Müllt ein „tail -F“ nicht den Speicher langsam zu? Wie lange läuft ein RPi ohne ihn neu starten zu müssen?

    Antworten
    • Marcus says:

      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

      Antworten
  6. Hagen Bauer says:

    Coole Beispiel mit viel Potential für andere Szenarion

    Antworten
  7. Marcus Penzer says:

    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 😉

    Antworten
  8. Markus says:

    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 …

    Antworten
  9. Mat says:

    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

    Antworten
  10. Frank says:

    Super Idee und gute Erklärung!

    Antworten
  11. Leon says:

    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

    Antworten
    • Marc says:

      Hallo Leon, wie gesagt es gibt ein Plugin für Firefox. Oder du baust dir was eigenes.

      Antworten
      • Leon says:

        Ah ok, danke für den Hinweis. Dann nutze ich erstmal das und guck mal, ob sich da simpel was zusammencoden lässt.

        Antworten
    • Jan Karres says:

      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.

      Antworten
  12. Bjoern says:

    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

    Antworten
    • Jan Karres says:

      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 😉

      Antworten
  13. Olaf Wagner says:

    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!

    Antworten
    • Jan Karres says:

      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.

      Antworten
      • Olaf Wagner says:

        In der iPhone-App leider nicht 🙁

        Antworten
        • Jan Karres says:

          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.

          Antworten
          • Olaf Wagner says:

            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.

  14. Robin says:

    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

    Antworten
  15. Markus says:

    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?

    Antworten
    • Jan Karres says:

      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.

      Antworten
  16. Patrick says:

    Hi du…
    Kannst du den mir sagen warum ich die Benachrichtigung nur auf dem pc bekomme und nicht auf das Handy???

    Antworten
  17. bOOm_shacalaca says:

    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…

    Antworten
    • Jan Karres says:

      Das ist der Ansatz von DynDNS, nur, dass zusätzlich der DNS Record mit einer sehr kleinen TTL automatisch aktualisiert wird.

      Antworten
  18. Kai Hillecke says:

    Hallo Jan,

    Gibt es die alte Fassung des Tutorials für Pushover noch?

    Vg Kai

    Antworten
  19. Markus Ritzmann says:

    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

    Antworten
  20. Markus says:

    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!

    Antworten
    • Jan Karres says:

      Wenn das Script wie beschrieben unter /usr/local/bin abgelegt wird sollte da (mit Ausnahme von sudo) genau so funktionieren.

      Antworten
      • Markus says:

        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. 🙂

        Antworten
  21. marcel says:

    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.

    Antworten
    • Manfred says:

      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.

      Antworten
      • Manfred says:

        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!

        Antworten
        • Manfred says:

          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.

          Antworten
  22. Karsten says:

    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?

    Antworten
  23. Jake says:

    Funktioniert super !

    Kann man irgendwie auch nicht erfolgreiche Anmeldungen loggen ?

    Antworten
    • Jan Karres says:

      Das macht meines Wissens nach auch fail2ban, welches ich im Artikel SSH vor Angriffen absichern erwähnt habe.

      Antworten
    • Karsten says:

      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.

      Antworten
  24. midas says:

    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ß

    Antworten
    • Jan Karres says:

      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.

      Antworten
  25. ronnyst says:

    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 🙂

    Antworten
    • Jan Karres says:

      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.

      Antworten

Trackbacks & Pingbacks

  1. […] wenn jeman sich per SSH auf den Raspberry Pi einloggt. Als Basis diente diese sehr ausführliche Seite die sowas mit Pushbullet realisiert […]

Antworten

Kommentar verfassen

JanKarres.de © 2007-2016