Wolf
Roman Grossi
Tobishua
Digital nomad and originality

SSH

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

В моём примере оповещения отправляются мне в Telegram с некоторым форматированием.

Создание скрипта, принимающего данные

Для начала нам нужен скрипт, который будет доступен по HTTP и который будет принимать запросы от сервера. У меня есть подходящий для этого endpoint в виде коллекции всяких полу-приватных API, поэтому просто создам там endpoint ssh
Итоговый код на PHP:

<?php
$message = '⚠️ <b>Someone logged into '.$_GET['hostname'].'</b>'.PHP_EOL.'<b>IP:</b> '.$_GET['ip'].PHP_EOL.'<b>Date:</b> '.$_GET['date'].PHP_EOL.'<b>User:</b> '.$_GET['user'];

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://api.telegram.org/bot111111111:AAAAA-BBBBBBBBBBBBB-DDDDDDD/sendMessage'); //Заменить на актуальные данные вашего бота
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, "chat_id=TELEGRAM_ID&text=".$message."&parse_mode=html&disable_web_page_preview=false"); //Здесь нужно заменить TELEGRAM_ID на ID вашего аккаунта или чата
$out = json_encode(curl_exec($curl));
curl_close($curl);
?>

Теперь нужно добавить в .bashrc пользователей, которые имеют доступ по SSH следующие строки:

IP="$(echo $SSH_CONNECTION | cut -d " " -f 1)"
HOSTNAME=$(hostname)
DATE=$(date +"%F %H:%M:%S")
# URL ниже нужно указать свой
wget -q "https://example.com/ssh?ip=$IP&hostname=$HOSTNAME&date=$DATE&user=$USER" -O /dev/null

Можно сделать это глобально, добавив эти строки в /etc/bash.bashrc, я делал это с помощью Ansible сразу на все серверы.

На это всё, уведомления приходят, всё хорошо.

Комментарии к этому хорошему посту: