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

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


UNIT=sshd # в некоторых дистрибутивах этот юнит не содержит "d".
UNIT=sshd # в некоторых дистрибутивах этот юнит не содержит "d".
USER={1:-admin} # умолчальный юзер, если не задан иной.
USER=${1:-admin} # умолчальный юзер, если не задан иной.
KEYS=`eval echo ~$USER`/.ssh/authorized_keys # ключ-файл.
KEYS=`eval echo ~$USER`/.ssh/authorized_keys # ключ-файл.



Версия от 06:02, 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=sshd # в некоторых дистрибутивах этот юнит не содержит "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 за настырность блокирует), однако выходить после неудач вынуждены, что журналируется и забивает выходы честных бродяг. Посему длительность сессии приходится прикидывать наугад, выявляя глазами ближайшие от логина по ключу логауты.