SSH-Login Notifications via Telegram

SSH – Login Notifications

Inhalt dieses Beitrags:
1. Generelle Infos
2. Telegram-Bot erstellen
3. Bot-Token erhalten
4. Chat mit Bot initial starten
5. Chat-ID erhalten
6. Script anpassen
7. Einbinden in pam.d

Ist ein Server aus dem Internet erreichbar und soll per SSH verwaltbar sein, ist es sinnvoll Benachrichtigungen über erfolgreiche Anmeldungen über SSH zu versenden. Dies ermöglicht es bei unerwünschten Anmeldungen schnell zu reagieren und die Sessions zu kappen.

Typischerweise werden solche Benachrichtigungen per Email versendet. Hier bietet ein Instand-Messaging-Dienst den Vorteil das die Benachrichtigung schneller über die App Telegram erhalten werden können. Weiterhin wäre es auch denkbar Telgram direkt als Rückkanal zu verwenden und Befehle an den Server zurück zu senden um damit direkt die Sessions zu terminieren. Mehr hierzu in einem späteren Beitrag.

Um SSH-Notifications über Telegram erhalten zu können sind folgdene Dinge nögtig:

  • Ein Telegram-Account
  • Ein Telegram-Bot-Account

Dies ist nicht mit Kosten verbunden. Somit lässt sich ein Benachrichtigungssystem im Stil von SMS-Notifications „um sonst“ realisieren.


Telegram Bot Erstellen

Zusätzlich zu dem (wahrscheinlich schon vorhandenem Telegram-Account muss ein Bot angelegt werden.
Dies erfolgt über den sogenannten @BotFather, welcher die zentrale Verwaltungsstelle für Bots bei Telegram darstellt.

[Bild BotFather]

Um einen Bot auf Telegram zu erstellen sucht man den Account @BotFather auf Telegram in der Benutzersuche und sendet diesem den Befehl zum Initieren:

/start

Der Vater der Bots antwortet mit einem entsprechendem Hinweis wie der Bot zu bedienen ist.
Mittels

/newbot

wird nun ein neuer Bot angelegt.
Der BotFather leitet einen durch den gesamten Prozess des Anlegens.


Bot-Token erhalten

Hat man den Bot erfolgreich erstellt kann man sich nun über die Einstellungen des Bots das Bot-Token ausgeben lassen.

/mybots
# Auswählen des Bots
-> API Token

Das Token sieht in etwa so aus:

0123456789:AB12CIOdlkasd2nCPalskdn125rliwjcxaca

Chat mit Bot initialisieren

Nachdem nun der Bot angelegt und das Token herausgefunden ist, sollte man den den Chat mit dem Bot initialisieren.

In Telegram ist es so, das Bot-Accounts keine Benutzer initiativ anschreiben dürfen um Spam zu verhindern.
Daher muss nun der Bot-Name in der Suche eingegeben werden.

Ist der Bot gefunden reicht erneut eine Nachricht mit

/start

und der Chat ist initialisiert. Der Bot kann nun Nachrichten an den eigenen Telegram-Account senden.


Chat – ID erhalten

Bots greifen auf die einzellnen Chats via Usernamen oder ID zu. Ich habe persönlich den Eindruck gewonnen das die Chat-ID die zuverässigere Wahl ist, da der Zugriff über Benutzernamen (jedenfalls bei mir) recht häufig in einer „Chat-Not-Found“-Response seitens der API quittiert wurde.

Um also nun an die Chat-ID heran zu kommen muss die erste Anfrage an die Telegram-API gestellt werden.

Die API ist via POST und GET erreichbar. In meinen Beispielen und Scripten verwende ich ersteres.

Die URL der API ist:

https://api.telegram.org/

Die Bots können mit Ihr über den URI bots gefolgt von dem entsprechenden Bot-Token kommunizieren.
Das ganze sieht dann also wie folgend aus:

https://api.telegram.org/bot[bot-token]/
https://api.telegram.org/bot1234567890:ABCDEFGHIJKLMN0987654321OPQRSTUVWXY/

Da der Chat bereits initialisiert ist kann die Chat-ID über die getUpdates-Methode geholt werden. Diese listet alle für den Bot vorhandenen Nachrichten auf.

https://api.telegram.org/bot[bot-token]/getUpdates

Die API sendet auf diesen Request einen JSON-Block zurück der die benötigten Informationen, also auch die Chat-ID, enthält.

Ich habe ein Script vorbereitet das diesen Prozess etwas vereinfacht.
In diesem Script müssen lediglich der eigene Telegram-Benutzername und das Bot-Token ausgetauscht werden.

md5: d48fdd17c7767daf67d6979f39be3b22  tgGetChatId.sh
#!/bin/bash
# tgGetChatId.sh
#
# by:   fbo
# date: 09.03.2021
# use:  ./tgGetChatId.sh
# desc: calls Updates from telegram bot api to filter out the chat-id

username="your_username"
botToken="1234567890:ABCDEFGHIJKLMN0987654321OPQRSTUVWXY"
tgUrl="https://api.telegram.org/bot"$botToken"/getUpdates"
curl $tgUrl | grep "$username" | grep "chat\":{\"id"


Anpassungen am Script

Nach dem man nun auch die Chat-ID kennt hat man Alles um die SSH-Login Notifications einzurichten.

Weiter unten findet sich das Script das entsprechend angepasst und an einem entsprechenden Ort auf dem Server abgelegt werden sollte.
Das Script sollte mit den Berechtigungen 700 versehen werden und dem Benutzer root gehören.
Da das Script durch den PAM.D-Service genutzt werden wird sollte dies nicht durch andere modifizierbar sein.

Im folgenden Script müssen nun das Bot-Token, die Chat-ID (targetChat) angepasst werden.
Wer möchte kann seinen Benachrichtigungstext ebenfalls noch anpassen.
Die Variable $PAM_RHOST ist eine Environment-Variable die durch PAM.D gesetzt wird. Diese enthält die IP-Adresse, von welcher der Login erfolgt ist. Dieser Eintrag kann, bei Bedarf, ebenfalls entfernt werden.
In der Grundkonfiguration sieht die Benachrichtigung etwa wie folgt aus:

Login from: 123.456.789.123
md5: 57e31668f1dbc3fa4629416b8114ab85  tgLoginMsg.sh
#!/bin/bash
# tgLoginMsg.sh
#
# by:   fbo
# date: 09.03.2021
# use:  ./tgLoginMsg.sh
# desc: sends a customised message to the specified telegram chat.

if [ "$PAM_TYPE" != "close_session" ]; then
        botToken="1234567890:ABCDEFGHIJKLMN0987654321OPQRSTUVWXY"
        targetChat="123456789"
        message="Login from: "$PAM_RHOST
        tgUrl="https://api.telegram.org/bot"$botToken"/sendMessage"
        postData='{"chat_id":"'$targetChat'","text":"'$message'"}'

        curl -X POST \
                -H 'Content-Type: application/json' \
                -d "$postData" \
                $tgUrl
fi



Einbinden in PAM.D

Ist das Script soweit fertig gestellt kann dieses in PAM.D eingebunden werden.

Dazu editiert man folgende Datei:

sudo vim /etc/pam.d/sshd

In diese Datei trägt man nun, oberhalb des letzten Session-Statements (session [succses=ok …]) die folgende Zeile ein:

session optional pam_exec.so setuid /pfad/zum/script/tgLoginMsg.sh

Die Zeile führt bei der Anmeldung einer neuen Session das Script als root aus. Weiterhin ist das Script als optional eingetragen um zu verhindern das, wenn das Script nicht korrekt funktioniert, ein Anmelden dennoch möglich ist.

Treten bei der Ausführung des Scripts Fehler auf werden diese nach der Anmeldung im Terminal angezeigt.

Bei einer neuen Anmeldung über SSH sollte nun eine Nachricht über Telegram versendet werden.

Happy Scrippting!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.