Una de las características que le falta al history del bash (por lo menos de mi punto de vista) es poder saber quien y a que hora se ejecutaron los comandos. Para poder solucionar esto existen muchas soluciones, desde agregar keylogers al sistema hasta parchear el mismo fuente del Bash.
Pero los otros dias navegando por un blog encontré una solución que me pareció muy buena y limpia a través del mismo syslog. La idea es agregar en alguno de los scripts de inicio de la sesión de los usuarios una pequeña función que guarda el ultimo comando ejecutado en el syslog a través del comando logger.
En nuestro caso elegimos el archivo /etc/profile y en el le agregamos al final las siguientes lineas:
Luego para poder revisar mejor los registros, configuramos el demonio de syslogd para que separe los registros y los guarde en un archivo separado. Para ello agregamos en el /etc/syslog.conf la siguiente linea:
Lo bueno de esta solución es que le agrega un poco más de seguridad al histórico de los comandos. El bash_history es facil de saltear, si el usuario en algún momento de la sesión ejecutamos el comando:
Pero los otros dias navegando por un blog encontré una solución que me pareció muy buena y limpia a través del mismo syslog. La idea es agregar en alguno de los scripts de inicio de la sesión de los usuarios una pequeña función que guarda el ultimo comando ejecutado en el syslog a través del comando logger.
En nuestro caso elegimos el archivo /etc/profile y en el le agregamos al final las siguientes lineas:
function history_to_syslog {
declare cmd
cmd=$(fc -ln -0)
logger -p local7.notice -- SESSION = $$, WHO = $(whoami), CMD=$cmd
}
trap history_to_syslog DEBUG
Luego para poder revisar mejor los registros, configuramos el demonio de syslogd para que separe los registros y los guarde en un archivo separado. Para ello agregamos en el /etc/syslog.conf la siguiente linea:
# BASHPor ahí también es bueno agregar en el logrotate algunas lineas para rotar los logs y evitar que se haga muy grande este archivo. Para ello podemos crear el archivo /etc/logrotate.d/cmdhist y le agregamos las siguientes lineas:
local7.* -/var/log/cmdhist.log
/var/log/cmdhist.log {y con esto tendremos registrado el día a día de todos los comandos ejecutados en el sistema identificando el usuario, la sesión y la hora en que se ejecuto cada comando.
daily
rotate 31
compress
missingok
}
Lo bueno de esta solución es que le agrega un poco más de seguridad al histórico de los comandos. El bash_history es facil de saltear, si el usuario en algún momento de la sesión ejecutamos el comando:
unset HISTFILECon esto, el Bash pierde la configuración de donde tiene que guardar los comandos ejecutados, por lo que al cerrar la sesión no se guardan los comandos ejecutados. La solución de ir guardando los comandos en el syslog, le agrega un poco de seguridad en este aspecto, ya que los comandos se van guardando a medida que se van ejecutando, por lo que hasta los mismos comandos para "borrar las huellas" quedan registrados en el mismo syslog, e inclusive, se puede configurar el demonio del syslog para que guarde los registros en forma remota y de esta forma agregarle un poco mas de seguridad al respecto.
8 comentarios:
21 de abril de 2009, 11:12
Buenas,
He leido tu entrada y me ha sido muy útil.
La he puesto en práctica con éxito, con sólo una cosa que no me acaba de gustar. En el archivo de log donde guardo los comandos entrados a bash, cada comando se triplica, cada vez que escribo algo salen 3 líneas iguales.
¿Alguna idea?
Gracias.
21 de abril de 2009, 20:25
Hola Dan: lo que se me ocurre que esta pasando es que estés llamando tres veces a la misma función y por ello los resultados repetidos.
Me podrías indicar en que distribución lo implementaste y en que archivo de inicio pusiste para que llamara a la función que registra los comandos en el syslog.
Si lo has colocado en mas de un archivo de inicio, el comando "trap" va a ser llamado mas de una vez y de ahí que quede registrado mas de una vez el comando.
No estoy seguro, pero yo empezaria a buscar por ese lado.
saludos
Pablo
22 de abril de 2009, 4:56
Buenas Pablo,
Pues lo implementé tal y como explicas en el post. En el archivo /etc/profile.
El tema de que se estuviera llamando varias veces lo pensé también, pero no vi nada.
LA distribución en lo que lo he implantado es una Fedora 10.
22 de abril de 2009, 9:41
Buenas, hoy lo he implementado en otro servidor con openSUSE 10.3 y syslog-ng y en este caso sólo aparece 1 línea por instrucción, auqnue a veces aparece una tal que:
last message repeated 7 times
No tengo ni idea de a qué debe ser debido.
Por cierto, gracias por el interés.
22 de abril de 2009, 22:42
Hola Dan: la verdad que mucho no se me ocurre. Yo le he implementado en Debian y CentOS y no he tenido problemas.
Voy a ver de probarlo en algun Fedora que anden por ahi, pero los que tengo a mano son viejos (FC4).
Una de las cosas que se me ocurre es hacer la prueba de mover el "trap" y la funcion al archivo "~/.profile", ya que es el ultimo archivo de arranque que lee el bash.
Por el tema de los mensajes de "last message repeated X times" si los he visto, pero como soy una persona que compulsiva mente presione el "enter" y el comando anterior suele estar vacío no le di mucha importancia.
23 de abril de 2009, 3:38
Buenas,
La verdad es que lo he implementado en 11 máquinas y en las únicas que me ha pasado eso ha sido en los 2 Fedora 10. Quizás sea algo propio de esta distro.
Miraré el tema que comentas de moverlo al profile, aunque me interesa guardar el log de todos los usuarios y quizás tener que poner el script a cada usuario no sería una solución aceptable.
Si lo pruebas en algún Fedora ya informarás de los resultados.
Muchas gracias.
11 de mayo de 2009, 7:46
Hola,
Durante la utilización del script me surgió otra duda. La última instrucción de una sesión no aparece en el log hasta que se ejecuta la siguiente, por lo que al cerrar una sesión, la última instrucción aparece cuando el usuario se conecta de nuevo, por lo que la información queda desvirtuada. La última instrucción aparece con fecha, sesión y usuario de la siguiente conexión.
¿Te habías fijado en el detalle? ¿Lo solventaste de algún modo?
Gracias,
Dan
19 de junio de 2013, 23:43
Estimados:
excelentes comentarios y scripts. Hago una consulta, estoy ejecutando con VMPlayer máquinas virtuales Fedora 17 y CentOS 5.4. Aplico estos scripts. Concretamente me falta que funcione la variable cmd, ya que no refleja el comando que está en el history (CMD = ). Si me pudiesen orientar mucho lo sabré agradecer.
Fernando.
Publicar un comentario