Menu

Бот для Telegram, предупреждающий о входе по SSH на сервер

Когда парк серверов разрастается, а команда администраторов насчитывает больше одного человека, появляется необходимость отслеживать успешные попытки входа на сервер по протоколу SSH. Оповещение в Telegram, пожалуй, будет лучшим способом сообщить об удачной попытке входа на сервер. Напишем простой скрипт для bash, который будет отсылать сообщения в Телеграм.

Предварительные замечания

  1. Будем считать, что новый бот в Telegram уже создан, а его токен нам известен
  2. Считаем, что уже есть группа с оригинальным названием, в которую добавлен новый бот

Данная методика проверена на операционных системах Debian 11, Ubuntu 22.04. Также работает на Rocky 8.7 (а значит, и на AlmaLinux и RHEL).

Установка

В случае, если установлена утилита git, установка проходит в одну команду


cd /opt/ && git clone https://github.com/MyTheValentinus/ssh-login-alert-telegram

Если же у нас нет git, и его нельзя установить (да, бывает и такое), самостоятельно создаём три файла.

cd /opt

mkdir ssh-login-alert-telegram &&  cd ssh-login-alert-telegram/

touch alert.sh credentials.config deploy.sh

Вставляем в alert.sh:

#!/usr/bin/env bash

. /opt/ssh-login-alert-telegram/credentials.config
for i in "${USERID[@]}"
do
URL="https://api.telegram.org/bot${KEY}/sendMessage"
DATE="$(date "+%d %b %Y %H:%M")"

if [ -n "$SSH_CLIENT" ]; then
CLIENT_IP=$(echo $SSH_CLIENT | awk '{print $1}')

SRV_HOSTNAME=$(hostname -f)
SRV_IP=$(hostname -I | awk '{print $1}')

IPINFO="https://ipinfo.io/${CLIENT_IP}"

TEXT="Connection from *${CLIENT_IP}* as ${USER} on *${SRV_HOSTNAME}* (*${SRV_IP}*)
Date: ${DATE}
More informations: [${IPINFO}](${IPINFO})"

curl -s -d "chat_id=$i&text=${TEXT}&disable_web_page_preview=true&parse_mode=markdown" $URL > /dev/null
fi
done

 

Вставляем в deploy.sh:

#!/usr/bin/env bash

add_profiled(){
cat <<EOF > /etc/profile.d/telegram-alert.sh

bash $ALERTSCRIPT_PATH
EOF
}

add_zsh () {
cat <<EOF >> /etc/zsh/zshrc

bash $ALERTSCRIPT_PATH
EOF
}

ALERTSCRIPT_PATH="/opt/ssh-login-alert-telegram/alert.sh"

echo "Deploying alerts..."
add_profiled

echo "Check if ZSH is installed.."

HAS_ZSH=$(grep -o -m 1 "zsh" /etc/shells)
if [ ! -z $HAS_ZSH ]; then
echo "ZSH is installed, deploy alerts to zshrc"
add_zsh
else
echo "No zsh detected"
fi

echo "Success!"

Вставляем в credentials.config:

USERID=(-97160441299)
KEY="573414141899:AAFxoC51krUaLEInlPGJwEEQICUp8QvVs99"

Здесь USERID - это ID пользователя в Телеграм или ID канала; KEY - это токен нашего нового бота.

Внедрение

Делаем файлы скриптов выполнимыми:

chmod 700 deploy.sh && chmod 700 alert.sh

Одной командой единовременно проводим внедрение

bash deploy.sh

Использование

Для проверки попробуем вручную запустить скрипт:

./alert.sh

В Telegram должно появиться сообщение о входе.

Выходит, всё сделано правильно, теперь мы будем всегда предупреждены, если кто-то зашёл на сервер.

Оркестр

Для целого набора серверов можно воспользоваться средствами Ansible

_https://github.com/MyTheValentinus/Deploy-Telegram-SSH-Alerting-with-Ansible

 

Опробовано на боевых серверах билетной системы:

Калуга
Брянск
Обнинск
Серпухов
Смоленск
Тула
Орел
Чехов

 

Авторизуйтесь, чтобы получить возможность оставлять комментарии
Go to top