opened image

Как отслеживать SSH подключения к серверу с помощью телеграм бота

Для того, чтобы отправить уведомление об успешном входе на сервер по SSH, необходимо отследить момент такого входа. Воспользуемся встроенными средствами Linux, а именно, настройками глобального профиля, которые находятся в папке /etc/profile. Этот профиль (а по сути, это первоначальные настройки пользователя) будет применяться для всех пользователей, которые залогинены в систему и для которых запущена командная оболочка. Настройки глобального профиля очень гибкие, но нас интересует прописанный в нем по умолчанию запуск всех bash фалов (*.sh) из папки /etc/profile.d  Создадим в этой папке простой bash скрипт, роль которого запустить python скрипт, а уже этот python скрипт выполнит выборку данных по ssh соединению, сформирует информационную строку и отправит ее в телеграм канал администратора сервера.

 

Приступим к выполнению.

 

1. Если у Вас до сих пор нет своего телеграм бота, создайте его, а также канал, в который будут поступать сообщения. Для этого восспользуйтесь п.1-2 из Инструкции. Как администратор телеграм канала, Вы можете также добавлять в него других участников для совместного мониторинга SSH подключений к серверам.

 

2. В папке /usr/bin/ создадим файл python скрипта. Для этого выполним команду

 

vim /usr/bin/ssh_notification.py

 

и разместим код скрипта

 

# ---------- settings ---------
# dont send message to telegram if IP includes in  whitelist IP, for example, admin IP.
# send notificatiob for all IPs: wlip = []
wlip = ['123.123.45.67','98.76.54.32']
# users to track. For all users to track: 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)
 

 

В верхней части скрипта есть 2 необязательные настройки:

 

 -  В переменной wlip находится whitelist список IP, при соединении с сервеом с которых не будет отправляться уведомление. Это может быть один или  несколько IP администратора сервера. Если необходимо отправлять сообщение о входе на сервер не зависимо от IP, установите значение переменной в [] (просто очистите все внутри квадратных скобок)

 

wlip = []

 

 -  В переменной userstrack можно указать один или несколько логинов, которые необходимо отслеживать. Для отправки уведомлений не зависимо от имени пользователя, очистите все внутри скобок:

 

userstrack = []

 

-  Также замените TOKEN и CHAT_ID на соответствующие значения, полученніе при создании телеграм бота и канала.

 

3. В папке /etc/profile.d/ создадим простой bash скрипт, который будет запускать созданный ранее python скрипт. Для этого выполните команду

 

vim /etc/profile.d/ssh_notification.sh 

 

и разместите код скрипта:

 

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

 

Мониторинг SSH подключений к серверу с отправкой уведомлений в телеграм, настроен. 

 

В результате Вы сможете получать такие уведомления: