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: