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

Якщо на сервер зайшов хтось сторонній, про це краще дізнатися одразу, а не під час розбору журналів. Невеликий скрипт надсилатиме повідомлення в Telegram під час кожного входу по SSH: хто підключився, з якої адреси й коли.
Як це працює
Система автентифікації PAM уміє запускати довільну команду під час відкриття сесії. Ми підключимо до неї скрипт, який надсилає повідомлення через Telegram Bot API. Додаткові програми не потрібні — лише curl.
Крок 1. Створіть бота
- Відкрийте в Telegram діалог із @BotFather і надішліть команду
/newbot. - Задайте ім’я та логін бота. У відповідь надійде токен на кшталт
123456789:AAH...— збережіть його. - Відкрийте діалог зі своїм новим ботом і надішліть йому будь-яке повідомлення.
Крок 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 надійде повідомлення:

Якщо повідомлення немає, запустіть скрипт вручну й перегляньте відповідь 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. Тим самим ботом можна отримувати сповіщення про високе навантаження на сервер.
Відеоінструкція



