Как зарегистрировать соединение / команду клиента ssh?

Я хотел бы знать, как я мог бы регистрировать 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.

4 ответа

Решение

Вы можете сделать это тремя разными способами, как я вижу - скорее всего, есть много других способов сделать это! Наилучшим способом было бы присоединить инструмент аудита к вызовам sysexec в ядрах, чтобы он не мог быть отслежен пользователем и т. Д. Двумя другими способами было бы просто изменить среду оболочки для ее регистрации.

Вместо меня (взяв код / ​​ответы из гугла) я покажу вам, как это сделать. Я дам вам ссылки на сайты, которые уже объяснили это подробно. Я надеюсь, что это именно то, что вам нужно.

Кстати, самый простой способ - это просто включить что-то в свой основной bashrc / профиль, чтобы повлиять на всех пользователей.

В любом случае, вот ссылки на решения bashrc.

1) Решение Bashrc: Как регистрировать команды, выполняемые всеми пользователями в Linux?2) Решение Bashrc/trap: Bash: история в системный журнал

Другой способ (на уровне ядра) - изучить инструменты аудита или действий. Существует множество сайтов, на которых рассказывается, как настроить ведение журнала команд с помощью вызовов ядра 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 "$@"

Проверьте SSHLog https://github.com/sshlog/agent/.

Я участник кода этого проекта.

Вы можете использовать этот инструмент для записи записи журнала для каждого сеанса ssh (как подключений, так и исходящих подключений). Конфигурационный файл будет выглядеть так:

      events:
  - event: ssh_connections_in
    triggers:
      - connection_established
      - connection_close
    filters:
      ignore_existing_logins: True
    actions:
      - action: log_events
        plugin: eventlogfile_action
        log_file_path: /var/log/ssh_connections_in.log
        max_size_mb: 10
        number_of_log_files: 5

  - event: ssh_connections_out
    triggers:
      - command_start
    filters:
      command_name: ssh
    actions:
      - action: log_events
        plugin: eventlogfile_action
        log_file_path: /var/log/ssh_connections_out.log
        max_size_mb: 10
        number_of_log_files: 5

Это создаст два файла журнала в /var/log/.

Первый будет писать сообщение даже всякий раз, когда пользователь заходит на ваш сервер. Во второй файл журнала будет записываться событие всякий раз, когда пользователь выполняет команду «ssh», и оно будет включать в себя любые переданные аргументы (т. е., к какому серверу он подключился).

Дополнительные параметры конфигурации можно найти здесь:https://github.com/sshlog/agent/tree/master/daemon/config_samples.

Наиболее очевидным способом, независимым от оболочки, было бы заменить ssh сценарием / программой-оболочкой, которая выполняет необходимое ведение журнала, а затем запустить ssh.

Использование программы-оболочки означает, что не имеет значения, какую оболочку используют пользователи (да, есть оболочки, отличные от bash!), И "экранирование оболочки" от других программ (таких как emacs, vi, mailx и т. Д.) Будет также быть зарегистрирован.

Другие вопросы по тегам