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

Материал из ALT Linux Wiki
(Новая страница: «Когда к одному логину на сервере приходится давать доступ нескольким персоналиям (например, нескольким разработчикам к логину <code>webmaster</code> для работы с сайтом), хотелось бы понимать, кто именно, откуда и когда входил. И это далеко не столь сложно, как мо...»)
 
Нет описания правки
Строка 11: Строка 11:
<source lang=bash>
<source lang=bash>
#!/bin/bash
#!/bin/bash
UNIT=sshd # в некоторых дистрибутивах этот юнит не содержит "d".


case $LANG in
case $LANG in
Строка 20: Строка 22:
     LINE=($LOGINS)
     LINE=($LOGINS)
     DATE=${LINE[0]%+*}
     DATE=${LINE[0]%+*}
     printf "${DATE/T/ } %-10s %-15s %s\n" ${LINE[1]} ${LINE[2]} `ssh-keygen -E SHA256 -lf ~/.ssh/authorized_keys | grep "${LINE[3]}" | cut -d' ' -f3`
     LOGIN=${LINE[1]}
done <<<`journalctl -o short-iso -u sshd | awk '/Accepted publickey/{print $1,$7,$9,$14}'`
    IP=${LINE[2]}
    OWNER=`ssh-keygen -E SHA256 -lf ~/.ssh/authorized_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}'`


</source>
</source>

Версия от 04:46, 27 сентября 2023

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

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

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

В то же время, чек-суммы ключей для допущенных пользователей можно извлечь из файла ~/.ssh/authorized_keys командой ssh-keygen -E SHA256 -lf ~/.ssh/authorized_keys — и сопоставить их со входами этих пользователей.

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

#!/bin/bash

UNIT=sshd # в некоторых дистрибутивах этот юнит не содержит "d".

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 ~/.ssh/authorized_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}'`