Существует полный применимый метод для отслеживания/регистрирования соединений SSH ключом с expention к имени пользователя.
В дополнение к anwer @Caleb я хотел бы совместно использовать некоторые небольшие приемы там:
Nota: я работаю над Debian 6.0.
Сначала гарантируя, что конфигурация сервера имеет достаточный уровень входа:
как корень, это установит и активный подробный вход:
sed '/^[^#]*LogLevel.*\(QUIET\|FATAL\|ERROR\|INFO\)/{s/^/# /;h;s/$/\nLogLevel VERBOSE/};${p;g;/./!{iLogLevel VERBOSE'$'\n;};D}' -i /etc/ssh/sshd_config
Мог быть записан:
sed '
/^[^#]*LogLevel.*\(QUIET\|FATAL\|ERROR\|INFO\)/{
s/^/# /;
h;
s/$/\nLogLevel VERBOSE/
};
${
p;
g;
/./!{
iLogLevel VERBOSE
};
D
}' -i /etc/ssh/sshd_config
или в sed сценарии:
#!/bin/sed -f
/^[^#]*LogLevel.*\(QUIET\|FATAL\|ERROR\|INFO\)/{
s/^/# /;
h;
s/$/\nLogLevel VERBOSE/
};
${
p;
g;
/./!{
iLogLevel VERBOSE
};
D
}
Который мог быть выполнен как:
patchSshdConfigLogLevel.sed -i /etc/ssh/sshd_config
Чем для активации этого:
service ssh restart
Теперь возьмите цифровые отпечатки в пользователе читаемый файл:
echo ':msg, regex, "Found matching .* key:" -/var/log/sshdusers.log' \
> /etc/rsyslog.d/ssh_key_user.conf
echo ':msg, regex, "Accepted publickey for" -/var/log/sshdusers.log' \
>> /etc/rsyslog.d/ssh_key_user.conf
service rsyslog restart
Попробуйте к (пере-) вход в систему от ssh для обеспечения нового файла sshdusers.log
создается (и содержите что-то), затем
chmod 644 /var/log/sshdusers.log
Это распечатает цифровой отпечаток текущих сессий:
sed -ne "/sshd.$PPID.:.*matching .SA key/{s/^.* //g;h};\${x;p}" /var/log/sshdusers.log
sed -ne "/sshd.\($(($(ps ho ppid $PPID)))\|$PPID\).:.*\(Accepted publickey\|matching .SA key\)/{s/^.* //g;h};\${x;p}" /var/log/sshdusers.log
.bashrc
И наконец, существует немного дополнения для помещения в конце Вашего /etc/bash.bashrc
или пользователь .bashrc
:
ssh_oPwd=$OLDPWD
ssh_oUmask=$(umask)
umask 077
ssh_tempdir=$(mktemp -d /tmp/ssh-id-XXXXXXX)
cd $ssh_tempdir || exit 1
ssh_crtFp=$(
sed -ne "/sshd.\($(($(ps ho ppid $PPID)))\|$PPID\).:.*\(Accepted publickey\|matching .SA key\)/{s/^.* //g;h};\${x;p}" /var/log/sshdusers.log
)
for ((ssh_i=1;ssh_i<=$(wc -l <$HOME/.ssh/authorized_keys);ssh_i++));do
export ssh_line="$(sed -ne ${ssh_i}p <$HOME/.ssh/authorized_keys)"
echo "$ssh_line" >tempKey
export ssh_lFp=($(ssh-keygen -l -f tempKey))
if [ "${ssh_lFp[1]}" == "$ssh_crtFp" ] ;then
export SSH_KEY_USER=${ssh_line##* }
break
fi
done
cd $OLDPWD
OLDPWD=$ssh_oPwd
rm -fR $ssh_tempdir
umask $ssh_oUmask
unset ssh_lFp ssh_line ssh_i ssh_crtFp ssh_tempdir ssh_oUmask ssh_oPwd
таким образом, после перевхода в систему от SSH, Вы будете видеть:
set | grep ^SSH
SSH_CLIENT='192.168.1.31 43734 22'
SSH_CONNECTION='192.168.1.31 43734 192.168.1.2 22'
SSH_KEY_USER=user@mydesk
SSH_TTY=/dev/pts/2
Nota На некоторой установке, авторизованный файл ключей, возможно, что-то по-другому названное, как $HOME/.ssh/authorized_keys2
...
Вы могли активировать части Вашего .bashrc
только если это не вызывается через ssh
.
например, что-то как:
# within an SSH-session, ${SSH_TTY} will be set
if [ "x${SSH_TTY}" = "x" ]; then
/bin/watch ~/checker.bash
fi
Два пути:
Не используйте удар для этой сессии, попробуйте тире (или/bin/sh):
ssh 127.0.0.1 /bin/dash
Используйте удар с опциями команды отключить файлы запуска обработки:
ssh 127.0.0.1 "bash --noprofile --norc"
Можно заменить строкой/bin/watch.... с
if ps ax | grep /bin/watch | grep -v grep > /dev/null 2>&1
then
echo "Nothing to do"
else
/bin/watch ~/checker.bash
fi
или некоторая такая вещь.
watch
команда, но мне нравится решение.
– ljs.dev
03.11.2013, 22:11