Table of Contents
Registrar los comandos de la terminal Bash en ficheros log
Debido a que esta forma de registrar los comandos de la terminal Bash (no válido para otras shells) no ofrece ninguna garantía en cuanto a seguridad, sería fácil ejecutar comandos sin que estos se registrasen, por ejemplo con vim, cambiando de shell o ejecutando el comando “history -c” al entrar en la sesión. Por lo tanto se recomienda su uso en entornos personales o de confianza sin finalidad de monitoración. Otra alternativa para monitorizar la actividad de la shell es registrar_comandos_con_snoopy_logger, aunque tampoco ofrece ninguna garantía en cuanto a seguridad. Si se quiere tener un método para monitorizar todo lo que pasa en las terminales, es posible usar PAM.
Editar el fichero /etc/bash.bashrc
Opción 1 (Solo registra los comandos que se han ejecutado correctamente).
readonly PROMPT_COMMAND='ERR_VAL=$?; if [ $ERR_VAL -eq 0 ]; then history -a >(tee -a ~/.bash_history | logger -p local1.debug -t "$USER $SSH_CLIENT"); fi'
Opción 2 (Registra todo).
readonly PROMPT_COMMAND='history -a >(tee -a ~/.bash_history | logger -p local1.debug -t "$USER $SSH_CLIENT")'
NOTA: la variable PROMPT_COMMAND: De estar fijada, su contenido se ejecuta antes de mostrar el prompt ($PS1).
Editar syslog.conf / rsyslog.conf
# history local1.* /var/log/history_bash
Opciones del comando logger
- -i Indica a logger que registre su PID (ID de proceso).
- -s Envia el mensaje a la herramienta de registro y envía la salida al error estándar (útil en scripts)
- -d Indica a loger que use datagramas en lugar de una conexión stream al socket del registrador del sistema.
- -f Direcciona el contenido de un archivo al registrador del sistema.
- -p prioridad: Le permite especificar la prioridad del mensaje a enviar al registrador del sistema.
- -t etiqueta: Le permite indicar una etiqueta para el mensaje a enviar al registrador del sistemas
- -u socket: Por defecto logger envía el mensaje al registrador del sistema, si usted quiere alterar este comportamiento y registrar directamente en un socket puede indicarlo con esta opción.
Ejemplo del contenido del fichero de logs
Se realiza una conexión ssh al servidor pollux.dominio desde el host 10.2.191.182 y se ejecutan los siguientes comandos.
root# history root# dmesg root# cat /var/log/history_bash root# su - busi busi$ id busi$ echo soy otro usuario busi$ exit root# echo ahora soy root de nuevo root# cat /var/log/history_bash
Contenido de /var/log/history_bash en relación a los comandos anteriores.
Mar 26 10:21:08 pollux root 10.2.191.182 53568 22: history Mar 26 10:21:18 pollux root 10.2.191.182 53568 22: dmesg Mar 26 10:21:26 pollux root 10.2.191.182 53568 22: cat /var/log/history_bash Mar 26 10:21:47 pollux busi : id Mar 26 10:21:54 pollux busi : echo soy otro usuario ** Mar 26 10:21:57 pollux root 10.2.191.182 53568 22: su - busi Mar 26 10:22:03 pollux root 10.2.191.182 53568 22: echo ahora soy root de nuevo Mar 26 10:22:17 pollux root 10.2.191.182 53568 22: cat /var/log/history_bash
Debido a que el contenido de la variable PROMPT_COMMAND se ejecuta antes de mostrar el prompt, si se produce un cambio de usuario madiante el comando “su”, el registro de ese comando no se obtiene hasta que root (en nuestro ejemplo) no recupere el prompt (marcado en el ejemplo con **).
Algunas formas de saltarse el registro de comandos
Ejecutar comandos dentro de 'more', 'less', 'man' con !comando
more fichero ... !dmesg
Usando el editor vi/vim para ejecutar comandos.
vi fichero ~ ~ ... :!dmesg
Cambiando de interprete de comandos.
[root@dominio ~]# sh sh-4.1#
Vaciar la pila del historial.
history -c