Como logar conexão / comando do cliente ssh?

4

Gostaria de saber como eu poderia registrar linhas de comando SSH que um usuário está usando em um servidor. Por exemplo, se o usuário Alex no meu servidor estiver fazendo o seguinte conjunto de comandos:

$ cd /tmp
$ touch myfile
$ ssh [email protected]
$ ssh [email protected]
$ vim anotherfile
$ ssh [email protected]

Eu gostaria de registrar os comandos ssh usados no servidor em um arquivo que se parece com:

[2014-07-25 10:10:10] Alex : ssh [email protected]
[2014-07-25 10:18:20] Alex : ssh [email protected]
[2014-07-25 11:15:10] Alex : ssh [email protected]

Eu não me importo com o que ele fez durante sua sessão ssh, eu só quero saber quando e para onde ele fez uma conexão com outro servidor.

O usuário não está usando o bash e eu gostaria de evitar manipular o .bash_history de qualquer forma, pois o usuário pode modificá-lo.

Alguma pista sobre isso?

Obrigado:)

edit: para ser mais específico:

um usuário se conecta a um servidor A e, em seguida, conecta-se a partir do servidor A para o servidor B. Eu quero rastrear para qual servidor ele se conecta através do ssh do servidor A.

    
por Kevin Merigot 25.09.2014 / 12:09

3 respostas

2

Você pode fazer isso de três maneiras diferentes, como eu vejo - provavelmente existem muitas outras maneiras de fazer isso também! O melhor método seria anexar uma ferramenta de auditoria às chamadas sysexec dos kernels para que ela não fosse rastreável pelo usuário, etc. As outras duas formas seriam simplesmente modificar o ambiente do shell para registrá-lo.

Em vez de mim (pegando o código / respostas do google) mostrando como fazer isso. Eu lhe darei links para sites que já explicaram isso detalhadamente. Espero que seja exatamente o que você precisa.

Btw, a maneira mais fácil é simplesmente incluir algo no seu bashrc / profile principal para afetar todos os usuários.

De qualquer forma, aqui estão os links para as soluções bashrc.

1) Solução Bashrc: Como registrar comandos executado por todos os usuários no Linux? 2) Solução Bashrc / trap: Bash: Histórico para o Syslog

A outra maneira (nível do kernel) seria examinar ferramentas ou auditoria. Existem muitos sites por aí que lhe dizem como configurar o registro de comandos via chamadas sysexec do kernel.

    
por 25.09.2014 / 15:32
1

Aqui está um script que você pode usar para capturar o ID do usuário e outras informações para colocar em um arquivo de log antes de iniciar o ssh. Eu testei com vários comandos ssh multilinhas muito complicados.

#!/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 "$@"
    
por 22.06.2017 / 22:29
-1

O mais óbvio, o método agnóstico de shell seria substituir o ssh por um script / programa de wrapper que faz o log necessário e, em seguida, o exec ssh.

Usar o programa wrapper significa que não importa qual shell os usuários estão usando (sim, há shells além de bash!) e "shell escapes" de outros programas (como emacs, vi, mailx, etc .) também será registrado.

    
por 25.09.2014 / 15:48