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!