Como posso registrar os comandos bash dos usuários?

10

Eu estou rodando um servidor debian etch onde os usuários estarão logando (espero) um chroot jail através do ssh. Como posso ter os comandos que eles executam registrados de uma forma que eles não podem excluir nem impedir?

    
por Malfist 13.07.2009 / 19:46

6 respostas

11

instale o snoopy . Se você quiser apenas registrar um usuário, faça alguns filtros de syslog.

    
por 13.07.2009 / 20:02
3

Eu escrevi um método para registrar todos os comandos / builtins 'bash' em um arquivo de texto ou em um servidor 'syslog' sem usar um patch ou uma ferramenta executável especial.

É muito fácil de implantar, já que é um simples shellscript que precisa ser chamado uma vez na inicialização do 'bash'. (apenas 'fonte' de .bashrc por exemplo) É baseado na idéia de usar armadilhas DEBUG bash. Veja também esta postagem no superuser.com

declare -rx HISTCONTROL=""                                  #does not ignore spaces or duplicates
declare -rx HISTIGNORE=""                                   #does not ignore patterns
declare -rx AUDIT_LOGINUSER="$(who -mu | awk '{print $1}')"
declare -rx AUDIT_LOGINPID="$(who -mu | awk '{print $6}')"
declare -rx AUDIT_USER="$USER"                              #defined by pam during su/sudo
declare -rx AUDIT_PID="$$"
declare -rx AUDIT_TTY="$(who -mu | awk '{print $2}')"
declare -rx AUDIT_SSH="$([ -n "$SSH_CONNECTION" ] && echo "$SSH_CONNECTION" | awk '{print $1":"$2"->"$3":"$4}')"
declare -rx AUDIT_STR="[audit $AUDIT_LOGINUSER/$AUDIT_LOGINPID as $AUDIT_USER/$AUDIT_PID on $AUDIT_TTY/$AUDIT_SSH]"
set +o functrace                                            #disable trap DEBUG inherited in functions, command substitutions or subshells, normally the default setting already
shopt -s extglob                                            #enable extended pattern matching operators
function audit_DEBUG() {
  if [ "$BASH_COMMAND" != "$PROMPT_COMMAND" ]               #avoid logging unexecuted commands after 'ctrl-c or 'empty+enter'
  then
    local AUDIT_CMD="$(history 1)"                          #current history command
    if ! logger -p user.info -t "$AUDIT_STR $PWD" "${AUDIT_CMD##*( )?(+([0-9])[^0-9])*( )}"
    then
      echo error "$AUDIT_STR $PWD" "${AUDIT_CMD##*( )?(+([0-9])[^0-9])*( )}"
    fi
  fi
}
function audit_EXIT() {
  local AUDIT_STATUS="$?"
  logger -p user.info -t "$AUDIT_STR" "#=== bash session ended. ==="
  exit "$AUDIT_STATUS"
}
declare -fr +t audit_DEBUG
declare -fr +t audit_EXIT
logger -p user.info -t "$AUDIT_STR" "#=== New bash session started. ===" #audit the session openning
#when a bash command is executed it launches first the audit_DEBUG(),
#then the trap DEBUG is disabled to avoid a useless rerun of audit_DEBUG() during the execution of pipes-commands;
#at the end, when the prompt is displayed, re-enable the trap DEBUG
declare -rx PROMPT_COMMAND="trap 'audit_DEBUG; trap DEBUG' DEBUG"
declare -rx BASH_COMMAND                                    #current command executed by user or a trap
declare -rx SHELLOPT                                        #shell options, like functrace
trap audit_EXIT EXIT  

veja o método explicado em detalhes aqui: link

felicidades Francois Scheurer

    
por 06.06.2012 / 13:25
2

Você pode tentar ttyrpld . É mais do que você quer, porque vai registrar todo o tty.
Eu não usei isso sozinho, mas a maneira como está funcionando (no kernel) faz com que o usuário não possa alterar os logs.

    
por 13.07.2009 / 19:52
0

Você pode ativar a auditoria do sistema.

    
por 13.07.2009 / 20:03
0

Use um kernel corrigido do grsecurity . Existe uma opção de kernel exatamente para este propósito.

    
por 13.07.2009 / 20:40
-3
O

bash mantém um histórico de comandos de um tamanho especificado. Você o administrador pode definir esse tamanho e facilmente escrever um script que vai e busca esse histórico por usuário via cron.

    
por 13.07.2009 / 20:35