Telegram Nachricht bei SSH Login

14.06.2020
In diesem kurzen Beitrag möchte ich euch zeigen, wie ihr unter Debian 10 'buster' eine automatische Telegram Nachricht bei einem Login via SSH einrichten könnt. Der Vorteil gegenüber der klassischen Methode via E-Mail liegt vor Allem darin, dass ihr keinen Mailserver bzw. MTA auf dem jeweiligen Server benötigt.

Hinweis: Ihr benötigt für viele oder alle Schritte dieser Anleitung einen User mit sudo Rechten oder den root User. Ich nutze den root User, tut ihr dies nicht, müsst ihr bei den angegebenen Befehlen "sudo" voranstellen, z.B. "sudo apt update".

Sprungmarken: Telegram Bot Chat ID & Test SSH Login Script

Server Update

Bevor ihr mit der eigentlichen Anleitung beginnt, solltet ihr vorab den Server updaten!

apt update && apt dist-upgrade && apt autoremove && apt clean

Mit dieser Befehls-Kombination aktualisiert ihr die Paketquellen, sucht nach Upgrades für installierte Pakete, entfernt überflüssige Abhängigkeiten und leert den Paket-Cache. "dist-upgrade" hat gegenüber "upgrade" den Vorteil, dass zusätzlich geprüft wird, ob durch geänderte Abhängigkeiten bestimmte Pakete deinstalliert bzw. neu installiert werden sollten.

Telegram Bot

Zuerst müsst ihr einen Telegram Bot erstellen. Dies könnt ihr bequem direkt über die Telegram App bzw. Telegram Web (web.telegram.org) machen, sucht dazu einfach nach "Botfather" (telegram.me/botfather) und startet einen Chat mit diesem. Sendet anschließend die Nachricht /newbot und vergebt wie aufgefordert einen Anzeigenamen für diesen (einfach als Nachricht senden). Danach müsst ihr noch einen Usernamen für den Bot vergeben, dieser muss mit "bot" enden (z.B. meinserver_bot). Nach dem Absenden des Usernamens wird der Bot erstellt und ein Token generiert. Dieses Token benötigt ihr im nächsten Schritt. Zudem solltet ihr euren Bot direkt in Telegram hinzufügen (gewählten Usernamen in die Suche eingeben) und diesem eine Nachricht schreiben, das ist ebenfalls für den nächsten Schritt nötig.

Chat ID & Test

Zuerst solltet ihr cURL installieren, falls noch nicht auf dem Server vorhanden.

apt install curl -y

Nun sendet ihr eine Anfrage an euren erstellten Bot, um die ebenfalls benötigte Chat ID heraus zu finden. Das funktioniert allerdings nur, wenn ihr dem Bot bereits eine Nachricht geschrieben habt, wie im vorherigen Schritt erklärt. Wichtig: 012345:XYZABC müsst ihr natürlich mit dem im ersten Schritt erhaltenen Token austauschen.

curl -X POST https://api.telegram.org/bot012345:XYZABC/getUpdates

Innerhalb der Ausgabe findet ihr den Part "chat":{"id":1010101010, woraus ihr die ID entnehmt (im Beispiel wäre das "1010101010"). Anschließend könnt ihr das Versenden einer Nachricht über euren Bot ausprobieren. Wichtig: 012345:XYZABC und 1010101010 müsst ihr natürlich mit eurem Token und eurer Chat ID austauschen.

curl "https://api.telegram.org/bot012345:XYZABC/sendMessage?chat_id=1010101010&text=test123"

Ihr solltet nun eurer Telegram App die Nachricht "test123" von eurem Bot bekommen haben. Hat das geklappt, ist euer Bot einsatzbereit und ihr könnt im nächsten Schritt das Script für die Nachricht bei einem SSH Login erstellen.

SSH Login Script

Nun könnt ihr auch schon den SSH Login Alarm einrichten. Erstellt dazu eine Datei im profile.d Ordner, damit diese bei einem SSH Login automatisch ausgeführt wird.

nano /etc/profile.d/telegram_sshalert.sh

Füllt diese dann mit folgendem Inhalt:

#!/bin/sh
CHATID="1010101010"
TOKEN="012345:XYZABC"
URL="https://api.telegram.org/bot$TOKEN/sendMessage"
if [ -n "$SSH_CLIENT" ]; then
  IP=$(echo $SSH_CLIENT | awk '{print $1}')
  HOSTNAME=$(hostname -f)
  IPADDR=$(hostname -I | awk '{print $1}')
  TEXT="Login as ${USER} on $IPADDR ($HOSTNAME) from $IP"
  curl -s --max-time 10 -d "chat_id=$CHATID&disable_web_page_preview=1&text=$TEXT" $URL > /dev/null
fi

Anschließend passt ihr noch die Rechte der Datei an, damit diese ausführbar ist.

chmod +x /etc/profile.d/telegram_sshalert.sh

Damit seid ihr fertig und bekommt nun bei jedem SSH Login eine automatische Nachricht via Telegram mit dem angemeldeten User, IP und Hostname des Servers und der IP der Person die sich eingeloggt hat.

Wer möchte, kann das Script noch um die Anzeige des Standorts der Login IP Adresse erweitern. Dafür wird allerdings das Paket jq benötigt.

apt install jq -y

Das Script sieht entsprechend erweitert dann wie folgt aus:

#!/bin/sh
CHATID="1010101010"
TOKEN="012345:XYZABC"
URL="https://api.telegram.org/bot$TOKEN/sendMessage"
TMPFILE='/tmp/ipinfotemp.txt'
if [ -n "$SSH_CLIENT" ]; then
  IP=$(echo $SSH_CLIENT | awk '{print $1}')
  HOSTNAME=$(hostname -f)
  IPADDR=$(hostname -I | awk '{print $1}')
  curl https://ipinfo.io/$IP -s -o $TMPFILE
  CITY=$(cat $TMPFILE | jq '.city' | sed 's/"//g')
  COUNTRY=$(cat $TMPFILE | jq '.country' | sed 's/"//g')
  TEXT="Login as ${USER} on $IPADDR ($HOSTNAME) from $IP ($CITY, $COUNTRY)"
  curl -s --max-time 10 -d "chat_id=$CHATID&disable_web_page_preview=1&text=$TEXT" $URL > /dev/null
  rm $TMPFILE
fi

Die Ausgabe ist dann etwa Login as sshuser on 127.0.0.1 (domain.tld) from 11.22.33.444 (Stadt, Länderkürzel).

Zuletzt bearbeitet: 04.07.2020