¿Cómo puedo registrar los comandos bash de los usuarios?

10

Estoy ejecutando un servidor debian etch donde los usuarios iniciarán sesión (con suerte) en una cárcel chroot a través de ssh. ¿Cómo puedo hacer que los comandos que ejecutan se registren de una manera que no puedan eliminar ni impedir?

Malfist
fuente
vea esta pregunta serverfault.com/questions/8851/…
hayalci el

Respuestas:

11

instalar Snoopy . Si solo desea registrar al único usuario, realice un filtrado de syslog fu.

Cian
fuente
Quiero registrar a cada usuario.
Malfist
Luego solo instálelo, "simplemente funcionará" (TM)
Cian
¿Puedo configurarlo para que inicie sesión en otro lugar además de /var/log/auth.log?
Malfist
Va a syslog, por lo que puede filtrarlo a cualquier lugar desde allí, iirc. Solo he hecho algo con syslog-ng, así que no tengo idea de los filtros con syslog regular, me temo.
Cian el
4

Escribí un método para registrar todos los comandos / bash 'bash' en un archivo de texto o un servidor 'syslog' sin usar un parche o una herramienta ejecutable especial.

Es muy fácil de implementar, ya que es un simple shellscript que debe llamarse una vez en la inicialización de 'bash'. (solo 'fuente' de .bashrc por ejemplo) Se basa en la idea de usar trampas bash DEBUG. Vea también esta publicación en 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  

vea el método explicado en detalle aquí: http://blog.pointsoftware.ch/index.php/howto-bash-audit-command-logger

aplausos Francois Scheurer

Francois Scheurer
fuente
2

Puedes probar ttyrpld . Es más de lo que deseas porque registrará todo el tty.
No lo he usado yo mismo, pero la forma en que funciona (en el núcleo) hace que el usuario no pueda alterar los registros.

radio
fuente
Genial, lo comprobaré. Si juega bien con todo, será lo que necesito. Puedo cambiar sus archivos de registro para que solo se
agreguen
La respuesta de Cian usando snoopy parece ser más como lo que estás buscando.
radio
0

Use un kernel parcheado de seguridad . Hay una opción de kernel exactamente para este propósito.

cstamas
fuente
-1

Podría habilitar la auditoría del sistema.

Geoff Fritz
fuente
1
¿Y cómo se hace eso?
Rory
Comience con las páginas de manual para auditar y avance desde allí. Puede que no sea parte de la instalación base de Debian, pero la instalación de auditoría es un componente del kernel de Linux, por lo que las herramientas de usuario pueden instalarse y usarse en cualquier distribución.
Geoff Fritz
-3

bash mantiene un historial de comandos de un tamaño especificado. Usted, el administrador, puede establecer ese tamaño y escribir fácilmente un script que vaya y obtenga ese historial por usuario a través de cron.

Recursividad
fuente
1
.bash_history es por conveniencia, no por seguridad. Hay una serie de razones para esto, entre las cuales la editable por el usuario (o al menos adjunta).
Matt