Vorwort:
Auch wenn man den SSH Zugriff des Systems absichert, z.B. durch das sperren aller Ports mittels „iptables“, oder „Fail2Ban“ installiert hat, 100% sicher ist man damit nicht. Das richtige Passwort genügt! Man könnte (sollte!) hier zusätzlich die zwei-wege Authentifizierung erwähnen, welche die beste aller Möglichkeiten ist sich abzusichern, jedoch in meinem Falle nicht in Frage kommt. Ich möchte von überall, zu jeder Zeit, auf meinen Server zugreifen.
Wenn ich also nicht zu 100% verhindern kann, dass sich jemand in mein System hackt, dann will ich es wenigstens mitbekommen.
Natürlich ist das Ganze ein alter Hut. Ein Shell Skript zur Alarmierung per E-Mail findet man fast überall. Jedoch bin ich ein Fan von Instant Messaging. Nachrichten via Telegram oder WhatsApp erreichen einen bedeutend schneller.
Also entschied ich mich, mir den Telegram-Bot zunutze zu machen. Er soll mir eine Nachricht schicken, wenn sich jemand an dem System anmeldet.

Das funktioniert wie folgt:
Schritt 1 – Botfather
Zuerst muss der Nutzer „@botfather“ hinzugefügt werden. Alternativ über diesen Link (https://telegram.me/botfather)
Schritt 2 – Bot erstellen
Nun dem „BotFather“ folgende Nachricht senden:
/newbot
Im Anschluss muss der Nutzer- und Bot-Name vergeben werden. Der Bot-Name muss mit „bot“ enden (z.B. BTbot oder BT_bot).
Ist das erledigt, wird ein Token generiert. Somit ist der Bot erstellt.
Schritt 3 – ChatID
Um eine Nachricht an einen Chat oder eine Gruppe zu versenden, wird eine ID benötigt.
Die findet man wie folgt heraus:
curl -X POST https://api.telegram.org/bot[BOT-TOKEN]/getUpdates
z.B.
curl -X POST https://api.telegram.org/bot123456789:ABCDE/getUpdates
Folgendes wird ausgegeben:
„chat“:{„id“:987654321,[…]}
Hier muss noch erwähnt werden, dass man zuvor dem Bot eine Nachicht schreiben muss.. der Text ist egal. Anderfalls bekommt man eine Ausgabe, in der die ChatID nicht vorhanden ist.
Schritt 4 – Test Nachricht senden
Um zu kontrollieren ob alles funktioniert, einfach eine kurze Nachricht senden. Das geht wie folgt:
https://api.telegram.org/bot123456789:ABCDEF/sendMessage?chat_id=987654321&text=Test
Schritt 5 – SSH Login Skript
Nun folgendes Skript als Root Benutzer in /etc/profile.d/ssh-telegram.sh speichern.
Die Variablen „USERID“ und „KEY“ durch die in Schritt 2 & 3 erhaltenen Daten ersetzen.
# save it as /etc/profile.d/ssh-telegram.sh
# use jq to parse JSON from ipinfo.io
# get jq from here http://stedolan.github.io/jq/
USERID="ChatID"
KEY="BOT-TOKEN"
TIMEOUT="10"
URL="https://api.telegram.org/bot$KEY/sendMessage"
DATE_EXEC="$(date "+%d %b %Y %H:%M")"
TMPFILE='/tmp/ipinfo-$DATE_EXEC.txt'
if [ -n "$SSH_CLIENT" ]; then
IP=$(echo $SSH_CLIENT | awk '{print $1}')
PORT=$(echo $SSH_CLIENT | awk '{print $3}')
HOSTNAME=$(hostname -f)
IPADDR=$(hostname -I | awk '{print $1}')
curl http://ipinfo.io/$IP -s -o $TMPFILE
CITY=$(cat $TMPFILE | jq '.city' | sed 's/"//g')
REGION=$(cat $TMPFILE | jq '.region' | sed 's/"//g')
COUNTRY=$(cat $TMPFILE | jq '.country' | sed 's/"//g')
ORG=$(cat $TMPFILE | jq '.org' | sed 's/"//g')
TEXT="$DATE_EXEC: ${USER} logged in to $HOSTNAME ($IPADDR) from $IP - $ORG - $CITY, $REGION, $COUNTRY on port $PORT"
curl -s --max-time $TIMEOUT -d "chat_id=$USERID&disable_web_page_preview=1&text=$TEXT" $URL > /dev/null
rm $TMPFILE
fi

Sven Singer
System Engineer
Hi,
Vielen Dank für dein Tutorial.
dein Script ohne tmp Datei: (nur als Vorschlag)
USERID=““
KEY=““
TIMEOUT=“10″
URL=“https://api.telegram.org/bot$KEY/sendMessage“
DATE_EXEC=“$(date „+%d %b %Y %H:%M“)“
if [ -n „$SSH_CLIENT“ ]; then
IP=$(echo $SSH_CLIENT | awk ‚{print $1}‘)
PORT=$(echo $SSH_CLIENT | awk ‚{print $3}‘)
HOSTNAME=$(hostname -f)
IPADDR=$(hostname -I | awk ‚{print $1}‘)
IPINFO=$(curl -s http://ipinfo.io/$IP)
CITY=$(echo $IPINFO | jq ‚.city‘ | sed ’s/“//g‘)
REGION=$(echo $IPINFO | jq ‚.region‘ | sed ’s/“//g‘)
COUNTRY=$(echo $IPINFO | jq ‚.country‘ | sed ’s/“//g‘)
ORG=$(echo $IPINFO | jq ‚.org‘ | sed ’s/“//g‘)
TEXT=“$HOSTNAME – $DATE_EXEC User: \“${USER}\“ logged in to $HOSTNAME ($IPADDR) from $IP – $ORG – $CITY, $REGION, $COUNTRY on port $PORT“
curl -s –max-time $TIMEOUT -d „chat_id=$USERID&disable_web_page_preview=1&text=$TEXT“ $URL > /dev/null
fi