Выявление сессий по ключу SSH: различия между версиями
Дым (обсуждение | вклад) (Новая страница: «Когда к одному логину на сервере приходится давать доступ нескольким персоналиям (например, нескольким разработчикам к логину <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]%+*} | ||
LOGIN=${LINE[1]} | |||
done <<<`journalctl -o short-iso | 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}'`