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

Материал из ALT Linux Wiki
Нет описания правки
Строка 49: Строка 49:


Посему длительность сессии приходится прикидывать наугад, выявляя глазами ближайшие от логина по ключу логауты.
Посему длительность сессии приходится прикидывать наугад, выявляя глазами ближайшие от логина по ключу логауты.
Можно ещё покостылить по признаку:
<pre>
Received disconnect from <ип.ад.ре.с> port <номер>
</pre>
Но сколько времени будет занимать такой поиск, угадать крайне затруднительно.


=Обратная связь=
=Обратная связь=

Версия от 06:38, 27 сентября 2023

Входы

Когда к одному логину на сервере приходится давать доступ нескольким персоналиям (например, разным разработчикам к логину webmaster для работы с сайтом), хотелось бы понимать, кто именно, откуда и когда входил.

И это далеко не столь сложно, как может представляться, поскольку в журнал SSHd сыплются в т.ч. сообщения формата:

<дата> <время> <хост назначения> <демон[пид]> Accepted publickey for <логин> from <IP-адрес> port <номер> ssh2: <алгоритм ключа> <контрольная сумма ключа>

В то же время, чек-суммы ключей для допущенных пользователей…

  • можно получить командой ssh-keygen -E SHA256 -lf ~/.ssh/authorized_keys из указанного в ней файла, где они хранятся в виде:
    ssh-<алгоритм> <публичный ключ> <его владелец>
  • и сопоставить их со входами этих пользователей.

Набросал для этих целей скриптец:

/usr/local/bin/sswho  
#!/bin/bash

UNIT=ssh
[ `awk -F= '/^NAME/{gsub("\"","");print $2}' /etc/os-release` != "ALT" ] ||
UNIT+=d
USER=${1:-admin} # умолчальный юзер, если не задан иной.
KEYS=`eval echo ~$USER`/.ssh/authorized_keys # ключ-файл.

case $LANG in
    ru*)printf "   Дата     Время   Логин      IP-адрес        Чей ключ\n";;
    *)  printf "   Date      Time   Login      IP address      Key owner\n"
esac

while read LOGINS; do
    LINE=($LOGINS)
    DATE=${LINE[0]%+*}
    LOGIN=${LINE[1]}
    IP=${LINE[2]}
    OWNER=`ssh-keygen -E SHA256 -lf $KEYS | grep "${LINE[3]}" | cut -d' ' -f3`
    printf "${DATE/T/ } %-10s %-15s %s\n" $LOGIN $IP $OWNER
done <<<`journalctl -o short-iso -u $UNIT | awk '/Accepted publickey/{print $1,$7,$9,$14}'`

Вывод выглядит так:

     Дата     Время   Логин      IP-адрес        Чей ключ
год-мес-день ЧЧ:ММ:СС логин      ип.ад.ре.с      владелец@ключа
...
год-мес-день ЧЧ:ММ:СС логин      ип.ад.ре.с      владелец@ключа

Выходы

Куда сложней обстоит дело с завершением таких сеансов ввиду перманентной долбёжки ботами, войти которые не могут (не только ввиду отключённого парольного доступа, но их ещё и fail2ban за настырность блокирует), однако выходить после неудач вынуждены — что журналируется, забивая выходы «честных бродяг».

Посему длительность сессии приходится прикидывать наугад, выявляя глазами ближайшие от логина по ключу логауты.

Можно ещё покостылить по признаку:

Received disconnect from <ип.ад.ре.с> port <номер>

Но сколько времени будет занимать такой поиск, угадать крайне затруднительно.

Обратная связь