1. Блог
  2. Мануали

Сповіщення в Telegram про вхід на сервер по SSH

Сповіщення в Telegram про вхід на сервер по SSH

Якщо на сервер зайшов хтось сторонній, про це краще дізнатися одразу, а не під час розбору журналів. Невеликий скрипт надсилатиме повідомлення в Telegram під час кожного входу по SSH: хто підключився, з якої адреси й коли.

Як це працює

Система автентифікації PAM уміє запускати довільну команду під час відкриття сесії. Ми підключимо до неї скрипт, який надсилає повідомлення через Telegram Bot API. Додаткові програми не потрібні — лише curl.

Крок 1. Створіть бота

  1. Відкрийте в Telegram діалог із @BotFather і надішліть команду /newbot.
  2. Задайте ім’я та логін бота. У відповідь надійде токен на кшталт 123456789:AAH... — збережіть його.
  3. Відкрийте діалог зі своїм новим ботом і надішліть йому будь-яке повідомлення.

Крок 2. Дізнайтеся ідентифікатор чату

Виконайте на сервері, підставивши свій токен:

curl -s "https://api.telegram.org/bot<ТОКЕН>/getUpdates"

У відповіді знайдіть фрагмент "chat":{"id":123456789 — це і є ідентифікатор чату. Якщо відповідь порожня, надішліть боту ще одне повідомлення й повторіть запит.

Щоб сповіщення отримувала команда, додайте бота в групу й використовуйте ідентифікатор групи — він починається зі знака мінус.

Крок 3. Створіть скрипт

sudo nano /usr/local/bin/ssh-login-notify.sh
#!/bin/bash
# Сповіщення в Telegram про вхід по SSH. Запускається через PAM.

TOKEN="123456789:AAH..."
CHAT_ID="123456789"

# Реагуємо лише на відкриття сесії
[ "$PAM_TYPE" = "open_session" ] || exit 0

TEXT="🔐 Вхід по SSH
Сервер: $(hostname)
Користувач: ${PAM_USER}
Адреса: ${PAM_RHOST}
Час: $(date '+%d.%m.%Y %H:%M:%S')"

curl -s --max-time 10 \
  --data-urlencode "chat_id=${CHAT_ID}" \
  --data-urlencode "text=${TEXT}" \
  "https://api.telegram.org/bot${TOKEN}/sendMessage" > /dev/null 2>&1 &

exit 0

Скрипт містить токен бота, тому доступ до нього повинен мати лише root:

sudo chown root:root /usr/local/bin/ssh-login-notify.sh
sudo chmod 700 /usr/local/bin/ssh-login-notify.sh

Дві деталі, важливі для надійності:

  • запит надсилається у фоні (&) і обмежений 10 секундами, тому вхід на сервер не сповільниться, навіть якщо Telegram недоступний;
  • скрипт завжди завершується з кодом 0, щоб помилка надсилання не завадила увійти.

Крок 4. Підключіть скрипт до PAM

Додайте рядок у кінець файлу /etc/pam.d/sshd:

echo "session optional pam_exec.so seteuid /usr/local/bin/ssh-login-notify.sh" | sudo tee -a /etc/pam.d/sshd

Слово optional означає, що збій скрипта не заблокує вхід. Файл /etc/pam.d/sshd є і в Debian/Ubuntu, і в AlmaLinux/Rocky Linux, тому спосіб працює однаково.

Крок 5. Перевірка

Відкрийте нове SSH-підключення до сервера. Протягом кількох секунд у Telegram надійде повідомлення:

Повідомлення від бота про нове SSH-підключення

Якщо повідомлення немає, запустіть скрипт вручну й перегляньте відповідь API:

sudo PAM_TYPE=open_session PAM_USER=test PAM_RHOST=127.0.0.1 bash -x /usr/local/bin/ssh-login-notify.sh

Часті причини: друкарська помилка в токені, неправильний ідентифікатор чату або ви не написали боту першими — бот не може почати діалог сам.

Як не отримувати сповіщення про власні входи

Щоб скрипт не спрацьовував для довірених адрес, додайте перевірку після рядка з PAM_TYPE:

case "$PAM_RHOST" in
  198.51.100.7|10.0.0.*) exit 0 ;;
esac

Чого цей спосіб не дає

Сповіщення повідомляє про вхід, але не запобігає йому. Використовуйте його разом з основними заходами захисту сервера: входом за ключами, зміною порту SSH та Fail2Ban. Тим самим ботом можна отримувати сповіщення про високе навантаження на сервер.

Відеоінструкція

YouTube video