Выявление сессий по ключу SSH: различия между версиями
Дым (обсуждение | вклад) Нет описания правки |
Дым (обсуждение | вклад) (→Входы) |
||
Строка 17: | Строка 17: | ||
UNIT=sshd # в некоторых дистрибутивах этот юнит не содержит "d". | UNIT=sshd # в некоторых дистрибутивах этот юнит не содержит "d". | ||
USER={1:-admin} # умолчальный юзер, если не задан иной. | |||
KEYS=`eval echo ~$USER`/.ssh/authorized_keys # ключ-файл. | |||
case $LANG in | case $LANG in | ||
Строка 28: | Строка 30: | ||
LOGIN=${LINE[1]} | LOGIN=${LINE[1]} | ||
IP=${LINE[2]} | IP=${LINE[2]} | ||
OWNER=`ssh-keygen -E SHA256 -lf | OWNER=`ssh-keygen -E SHA256 -lf $KEYS | grep "${LINE[3]}" | cut -d' ' -f3` | ||
printf "${DATE/T/ } %-10s %-15s %s\n" $LOGIN $IP $OWNER | 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}'` | done <<<`journalctl -o short-iso -u $UNIT | awk '/Accepted publickey/{print $1,$7,$9,$14}'` | ||
Строка 40: | Строка 42: | ||
год-мес-день ЧЧ:ММ:СС логин ип.ад.ре.с владелец@ключа | год-мес-день ЧЧ:ММ:СС логин ип.ад.ре.с владелец@ключа | ||
</pre> | </pre> | ||
=Выходы= | =Выходы= | ||
Куда сложней обстоит дело с завершением таких сеансов ввиду перманентной долбёжки ботами, войти которые не могут (не только ввиду отключенного парольного доступа, но их ещё {{cmd|fail2ban}} за настырность блокирует), однако выходить после неудач вынуждены, что журналируется и забивает выходы честных бродяг. | Куда сложней обстоит дело с завершением таких сеансов ввиду перманентной долбёжки ботами, войти которые не могут (не только ввиду отключенного парольного доступа, но их ещё {{cmd|fail2ban}} за настырность блокирует), однако выходить после неудач вынуждены, что журналируется и забивает выходы честных бродяг. | ||
Посему длительность сессии приходится прикидывать наугад, выявляя глазами ближайшие от логина по ключу логауты. | Посему длительность сессии приходится прикидывать наугад, выявляя глазами ближайшие от логина по ключу логауты. |
Версия от 06:01, 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 за настырность блокирует), однако выходить после неудач вынуждены, что журналируется и забивает выходы честных бродяг. Посему длительность сессии приходится прикидывать наугад, выявляя глазами ближайшие от логина по ключу логауты.