opened image

Jak śledzić połączenia SSH z serwerem za pomocą bota Telegram.

Aby wysłać powiadomienie o pomyślnym logowaniu na serwerze przez SSH, należy śledzić moment takiego logowania. Skorzystamy z wbudowanych narzędzi Linuxa, a mianowicie z ustawień globalnego profilu, które znajdują się w folderze /etc/profile. Ten profil (a w zasadzie, to początkowe ustawienia użytkownika) będzie stosowany dla wszystkich użytkowników, którzy są zalogowani w systemie i dla których uruchomiona jest powłoka. Ustawienia globalnego profilu są bardzo elastyczne, ale interesuje nas domyślne uruchamianie wszystkich plików bash (*.sh) z folderu /etc/profile.d. Stworzymy w tym folderze prosty skrypt bash, którego rolą będzie uruchomienie skryptu python, a ten skrypt python wykona zapytanie danych przez połączenie ssh, sformułuje informacyjną wiadomość i wyśle ją do kanału telegramowego administratora serwera.

 

Przystąpmy do realizacji.

 

1. Jeśli do tej pory nie masz swojego bota telegramowego, stwórz go, a także kanał, na który będą przychodzić wiadomości. W tym celu skorzystaj z punktów 1-2 z Instrukcji. Jako administrator kanału telegramowego możesz również dodawać do niego innych uczestników do wspólnego monitorowania połączeń SSH z serwerami.

 

2. W folderze /usr/bin/ stwórz plik skryptu python. W tym celu wykonaj polecenie

 

vim /usr/bin/ssh_notification.py

 

i umieść kod skryptu

 

# ---------- ustawienia ---------
# nie wysyłaj wiadomości do telegramu, jeśli IP znajduje się na  liście dozwolonych IP, na przykład, IP administratora.
# wysyłaj powiadomienia dla wszystkich IP: wlip = []
wlip = ['123.123.45.67','98.76.54.32']
# użytkownicy do śledzenia. Aby śledzić wszystkich użytkowników: userstrack = []
userstrack = ['root','admin']
#-----------------------------
import os
import datetime
import requests
import socket
def SendMsgToTelegramChanel_z(msg):
    token="TOKEN"
    chat_id = 'CHAT_ID'
    params = {'chat_id': chat_id,'text': msg}
    response = requests.get('https://api.telegram.org/bot'+token+'/sendMessage', params=params)

localip = socket.gethostbyname(socket.gethostname())
ip = os.popen("echo $SSH_CLIENT | awk -F' ' '{print $1}'").read().strip()
login = os.popen("whoami").read().strip()
dtime =  datetime.datetime.now().strftime("%d-%m-%Y %H:%M:%S")

if (ip not in wlip or not wlip) and (login in userstrack or not userstrack):
    SendMsgToTelegramChanel_z('SSH connect to ' + localip + '\nUser: ' + login + '\nFrom: ' + ip + '\n' + dtime)
 

 

W górnej części skryptu znajdują się 2 opcjonalne ustawienia:

 

 -  W zmiennej wlip znajduje się lista dozwolonych IP, przy połączeniu z serwerem z których nie będzie wysyłane powiadomienie. Może to być jeden lub  kilka IP administratora serwera. Jeśli chcesz wysyłać wiadomości o logowaniu na serwer niezależnie od IP, ustaw wartość zmiennej na [] (po prostu wyczyść wszystko wewnątrz nawiasów kwadratowych)

 

wlip = []

 

 -  W zmiennej userstrack możesz wskazać jeden lub kilka loginów, które należy śledzić. Aby wysyłać powiadomienia niezależnie od nazwy użytkownika, wyczyść wszystko wewnątrz nawiasów:

 

userstrack = []

 

-  Również zamień TOKEN i CHAT_ID na odpowiednie wartości, które otrzymasz przy tworzeniu bota telegramowego i kanału.

 

3. W folderze /etc/profile.d/ stwórz prosty skrypt bash, który będzie uruchamiał wcześniej stworzony skrypt python. W tym celu wykonaj polecenie

 

vim /etc/profile.d/ssh_notification.sh 

 

i umieść kod skryptu:

 

#!/bin/bash
python3 /usr/bin/ssh_notification.py

 

Monitorowanie połączeń SSH z serwerem z wysyłaniem powiadomień do telegramu zostało skonfigurowane. 

 

W rezultacie będziesz mógł otrzymywać takie powiadomienia: