User Tools

Site Tools


historial_en_bash_sin_perder_comandos

Evitar perdida de comandos del historial con múltiples sesiones abiertas / Trucos antiforenses para el historial

Agregar la siguiente linea al fichero .bashrc del usuario en cuestión o bien de forma global en “/etc/bashrc” o “/etc/bash.bashrc” (Algunas distribuciones).

shopt -s histappend

Sin la opción histappend activada (así es por defecto), la terminal Bash lee los registros del historial al inicio de su ejecución y los mantiene en memoria. Justo antes de cerrar la sesión, los comandos ejecutados dentro de ella son agregados a partir del último comando del historial registrado en el momento de abrir la sesión. Si se tienen varias sesiones abiertas, la última en terminar superpone su historial, siendo ese el motivo de que no todos los comandos ejecutados en una terminal queden en el historial.

Si se tienen configuradas las variables pertinentes para mostrar fechas en el historial, debemos tener en cuenta que saldrán en el orden dado por el cierre de las sesiones. Si se quiere tener fechas en el historial y registrar todos los comandos de todas las sesiones y que las fechas estén medianamente ordenadas, lo mejor sería recurrir al registro de comandos en el historial en tiempo real.

Otra forma de obtener el mismo resultado es forzar el comando “history -a” después de cada comando introducido, para ello se puede usar la variable unset PROMPT_COMMAND.

unset PROMPT_COMMAND
PROMPT_COMMAND='history -a'

Este comando escribe en .bash_history los comandos introducidos tras crear la sesión antes de mostrar el prompt tras terminar cada comando. Recordemos que esto no es en tiempo real, es decir, aunque el fichero .bash_history tenga los comandos de todas las sesiones realizadas por el usuario, hace falta salir de la sesión actual y volver a entrar para ver el historial con los comandos realizados bajo todas las sesiones, eso o bien ejecutar el comando “history -r”.

Diferencias entre histappend y history -a

  • histappend: Agrega al final de la sesión los comandos en memoria sin sobrescribir .bash_history.
  • history -a: Al ejecutarse agrega las lineas en memoria al fichero .bash_history.

Opciones útiles para el comando history.

  • -a Lee el historial en memoria y lo agrega al fichero .bash_history.
  • -c Limpia la pila dejándola vacía (borra el historial en memoria, no toca .bash_history)
  • -r Lee el historial de .bash_history y lo agrega al listado en memoria.
  • -w Escribe en .bash_history.

Conocer como almacena Bash el historial.

La variable de entorno HISTCONTROL nos ofrece la información necesaria para conocer como son almacenados los comandos en el historial.

  • ignorespace: No guarda los comandos precedidos por un espacio.
  • ignoredups: Si se repite un comando seguidamente sólo se almacenará el primero.
  • erasedups: Similar a ignoredups pero quedando el más reciente en el historial.
  • ignoreboth: Combina “ignorespace” y “ignoredups”. Equivalente a HISTCONTROL=“ignoredups:ignorespace”.

Listar valor de las variables de entorno del historial.

echo $HISTFILE$HISTCONTROL$HISTFILESIZE$HISTIGNORE$HISTTIMEFORMAT
/home/busi/.bash_history  ignorespace 10000    %m/%d/%y %T # Personalizado
/root/.bash_history  ignoredups 1000# CentOS 7 por defecto.

Borrar el historial completo (Dos opciones).

history -c && history -w
history -c && rm ~/.bash_history

Borrar una linea en concreto del historial (SSH)

history -d 444
# Para poder esquivar el modo "no interactivo" de ssh se podría usar este comando.
ssh usuario@dominio -t 'bash -ic "bash;history -d 444"'

Desactivar el historial / medidas antiforenses

shopt -u -o history # Deja marca en el historial.
set +o history # Deja marca de su ejecución en el historial.
unset HISTFILE # No deja huella de su ejecución en el historial.
ssh -T xx@xx   # Desactiva la asignación de pseudoterminales y po lo tanto no se registran comandos.

Comenzar una sesión ssh evitando el uso del historial.

Útil para ejecutar determinados comandos sin dejar huella en el historial. Se basa en arrancar una shell no interactiva, por lo que estará algo limitada con algunos comandos, entre ellos el “history, top, more, etc”

ssh root@businagios.mooo.com -p 65535 "bash"
# NOTA: No usar la opción "-t" de ssh

Si se quiere usar el modo interactivo se aconseja usar “unset HISTFILE” como primer comando para no deja marca en el historial. Si se usa “set” o “shopt” para desactivar el registro de comandos, es posible borrarlos posteriormente con “history -d XXX”. Si se está dentro una sesión no interactiva el comando history no funcionará (history position out of range) los comandos del historial se pueden borrar editando el fichero .bash_history.

Cambios en el historial entre sesiones en tiempo real

Con la configuración mostrada anteriormente solo se podían ver los comandos realizados en otra sesión al crear otra nueva o bien ejecutando el comando history con la opción “-r”. Si queremos que los cambios sean en tiempo real y poder ver en el historial los comandos realizados en otras sesiones de forma automática se haría lo siguiente.

PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

NOTA: Debido a que el contenido de PROMPT_COMMAND se ejecuta tras finalizar cada comando, debemos ejecutar un comando en la sesión que queramos antes de poder visualizar los cambios realizados en las otras. Esto está indicado para uso personal en entornos de confianza, nunca como herramienta de monitorización / control. Si se quiere tener un método para monitorizar todo lo que pasa en las terminales, lo mejor es usar PAM.

Proteger el historial de comandos de modificaciones y borrados

Establecer el modo “+a” (append) a los ficheros de configuración para que el usuario solo pueda escribir de manera concatenada. No podrá modificar ni borrar comandos.

chattr +a /home/user/.bash_history
chattr +a /home/user/.bash_profile
chattr +a /home/user/.bash_login
chattr +a /home/user/.profile
chattr +a /home/user/.bash_logout
chattr +a /home/user/.bashrc

Definir que siempre se escriban los comandos en el historial y establecer las variables de configuración del historial de solo lectura (en “/etc/bashrc” o “/etc/bash.bashrc”).

shopt -s histappend
 
readonly PROMPT_COMMAND="history -a"
readonly HISTFILE
readonly HISTFILESIZE
readonly HISTSIZE
readonly HISTCMD
readonly HISTCONTROL
readonly HISTIGNORE

Desactivar acceso a otras shells.

chmod 750 csh
chmod 750 tcsh
chmod 750 ksh
historial_en_bash_sin_perder_comandos.txt · Last modified: 2022/10/19 23:06 by busindre