Я хотел бы знать, как я могу регистрировать командные строки SSH, которые пользователь использует на сервере. Например, если пользователь Alex на моем сервере выполняет следующий набор команд:
$ cd /tmp
$ touch myfile
$ ssh staff@10.0.0.1
$ ssh staff@10.0.0.2
$ vim anotherfile
$ ssh alex@192.168.0.12
Я хотел бы записать команды ssh, используемые на сервере, в файл, который выглядит так:
[2014-07-25 10:10:10] Alex : ssh staff@10.0.0.1
[2014-07-25 10:18:20] Alex : ssh staff@10.0.0.2
[2014-07-25 11:15:10] Alex : ssh alex@192.168.0.12
Мне все равно, что он делал во время своего сеанса ssh, я просто хочу знать, КОГДА и ГДЕ он подключился к другому серверу.
Пользователь не использует bash, и я хотел бы в любом случае избежать манипулирования .bash_history, поскольку пользователь может его изменить.
Есть какие-нибудь подсказки по этому поводу?
Спасибо :)
изменить: чтобы быть более конкретным:
пользователь подключается к серверу A, а затем подключается с сервера A к серверу B. Я хочу отслеживать, к какому серверу он подключается через ssh с сервера A.
На мой взгляд, вы можете сделать это тремя разными способами. Скорее всего, есть много других способов сделать это! Лучшим способом было бы прикрепить инструмент аудита к вызовам sysexec ядра, чтобы пользователь не мог его отслеживать и т. Д. Двумя другими способами было бы просто изменить среду оболочки для его регистрации.
Вместо меня (взяв код / ответы из Google) показываю, как это делать. Я дам вам ссылки на сайты, которые уже объясняли это подробно. Надеюсь, это именно то, что вам нужно.
Кстати, самый простой способ - это просто включить что-то в свой основной bashrc / профиль, чтобы повлиять на всех пользователей.
В любом случае, вот ссылки на решения bashrc.
1) Решение Bashrc: Как регистрировать команды, выполняемые всеми пользователями Linux? 2) Решение Bashrc / trap: Bash: история в системный журнал
Другой способ (на уровне ядра) - изучить инструменты audit или acct. Есть много сайтов, которые рассказывают вам, как настроить ведение журнала команд с помощью вызовов sysexec ядра.
Вот сценарий, который вы можете использовать для записи идентификатора пользователя и другой информации, чтобы поместить ее в файл журнала перед запуском ssh. Я тестировал его с помощью нескольких очень сложных многострочных команд ssh.
#!/bin/bash
# Title......: ssh (wrapper)
# Description: this script replaces the ssh binary and runs the real binary after logging the connection attempt
# variables
#----------------------------------
REALBINARY=/usr/bin/sshu
THISHOST=$(uname -n)
LOGFILE=/var/log/sshclient.log
CALLINGPROC=$(ps -o comm= $PPID)
log() { # creates a basic log entry; $LOGFILE must be defined
echo "$(date '+%Y-%m%d %H:%M:%S %Z') $$ $*">>$LOGFILE
}
SSHTARGETOPTS=$(echo "$@" | head -1)
while getopts :l: OPT 2> /dev/null
do
case "$OPT" in
l) TARGETUSER="$OPTARG" ;;
esac
done
#after parsing with getopts, OPTIND will be the positional parameter number of the first argument after the options
FIRSTARG=$(echo $SSHTARGETOPTS | awk "{print \$$OPTIND}")
#if there is an '@' symbol in the FIRSTARG, parse out the LOGIN and TARGETSERVER, if not, TARGETSERVER is FIRSTARG
if [[ "$FIRSTARG" =~ '@' ]] ; then
TARGETUSER="${FIRSTARG%@*}"
TARGETSERVER=${FIRSTARG##*@}
else
TARGETSERVER="$FIRSTARG"
fi
TARGETUSER="${TARGETUSER:-$LOGNAME}"
if [[ "$SUDO_USER" ]] ; then
log "$THISHOST CallingProc='$CALLINGPROC' SUDO_USER='$SUDO_USER' became LOGNAME='$LOGNAME' ssh to TARGETSERVER='$TARGETSERVER' as TARGETUSER='$TARGETUSER' with command '$0 $SSHTARGETOPTS'"
else
log "$THISHOST CallingProc='$CALLINGPROC' LOGNAME='$LOGNAME' ssh to TARGETSERVER='$TARGETSERVER' as TARGETUSER='$TARGETUSER' with command '$0 $SSHTARGETOPTS'"
fi
exec $REALBINARY "$@"
Наиболее очевидным методом, не зависящим от оболочки, будет замена ssh сценарием / программой-оболочкой, которая выполняет необходимое протоколирование, а затем запускает ssh.
Использование программы-оболочки означает, что не имеет значения, какую оболочку используют пользователи (да, существуют оболочки, отличные от bash!), И «экранирование оболочки» из других программ (таких как emacs, vi, mailx и т. Д.) Будет также быть зарегистрированным.