¿Cómo registrar todos los comandos Bash de todos los usuarios en un servidor?

21

Nuestra pequeña empresa ejecuta un Ubuntu Server 11.10, al cual un par de personas tienen acceso SSH. Los terminales reales a veces también se usan. ¿Cómo podemos registrar localmente todos los comandos Bash ejecutados, junto con el usuario y la marca de tiempo?

Podemos suponer que nadie es nefasto e intenta activamente evitar el registro, pero aún preferimos que los usuarios no tengan acceso directo de escritura a sus archivos de registro. Las sesiones simultáneas se deben manejar correctamente.

Estaño
fuente

Respuestas:

32

Para shells de BASH, edite el archivo de configuración de tiempo de ejecución de BASH en todo el sistema:

sudo -e /etc/bash.bashrc

Anexar al final de ese archivo:

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Configure el registro para "local6" con un nuevo archivo:

sudo -e /etc/rsyslog.d/bash.conf

Y los contenidos ...

local6.*    /var/log/commands.log

Reinicie rsyslog:

sudo service rsyslog restart

Cerrar sesión. Inicia sesión. ¡Voila!

Pero olvidé la rotación de registros:

sudo -e /etc/logrotate.d/rsyslog

Hay una lista de archivos de registro para rotar de la misma manera ...

/var/log/mail.warn
/var/log/mail.err
[...]
/var/log/message

Por lo tanto, agregue el nuevo archivo de registro de comandos bash en esa lista:

/var/log/commands.log

Salvar.


fuente
Olvidé la rotación de registros que agregué a la respuesta.
1
De esta manera funciona, pero podría inventar un método a su alrededor (con csh, .bash_logout quizás). Yo iría con la solución de cuentas de Sabacon. Estas fueron lecturas excelentes: linuxjournal.com/article/6144 y beginlinux.com/blog/2010/01/…
2
Creo que esto puede ser fácilmente desactivado por el usuario simplemente reiniciando o desarmando PROMPT_COMMANDo ejecutando un shell que no sea bash.
Stefan Lasiewski
1
@Benubird parece que hay algunos niveles de instalación preestablecidos, 8 de ellos son local0-local7: en.wikipedia.org/wiki/Syslog . 0 significa emergencia, 7 significa depuración, y 6 está justo por debajo de 7, "mensajes operativos normales".
munchybunch
1
@yukashima porque los registros pueden convertirse en archivos grandes si no se eliminan, rotar significa rotar los archivos de registro y eliminar los más antiguos para mantener los registros más pequeños ...
Badr Elmers
4

Un sistema de contabilidad de procesos puede ser útil a este respecto, particularmente el acct paquete que proporciona los comandos lastcomm y ac.

Los comandos ac imprimen estadísticas sobre el tiempo de conexión de los usuarios, en horas. Esta es la cantidad de tiempo que el usuario ha estado conectado al sistema, ya sea de forma remota a través de SSH o un terminal en serie, o mientras está en la consola.

El comando lastcomm muestra información sobre los comandos ejecutados anteriormente. Las entradas más recientes se encuentran en la parte superior de la lista. También se muestra la cantidad total de tiempo de CPU que utilizó cada proceso.

Aquí hay un tutorial antiguo que puede ser útil:

http://www.linuxjournal.com/article/6144?page=0,1

Otros comandos de contabilidad como last y así sucesivamente se pueden encontrar en este tutorial:

http://www.techrepublic.com/article/system-accounting-in-linux/1053377

Sabacon
fuente
lastcomm es bastante inútil como un registrador de comandos. Solo registra el ejecutable que se ejecutó. No se registran argumentos, cambios o rutas.
Phil_1984_
3

Podrías usar snoopy .

Snoopy Logger puede adaptarse bien a su propósito. No pretende ser una solución de registro inevitable, sino más bien una herramienta útil para administradores diligentes que prefieren realizar un seguimiento de sus propias acciones.

Divulgación: soy el mantenedor de Snoopy.

Bostjan Skufca
fuente
Proporcione instrucciones sobre cómo instalarlo y usarlo en la respuesta.
muru
1
Las instrucciones detalladas de instalación están disponibles en la página de snoopy github, que es el principal recurso de snoopy en este momento: github.com/a2o/snoopy . No puedo proporcionar instrucciones de instalación en otros lugares, ya que la ubicación principal se mantiene por diseño y otros no. Por cierto, Readme se acaba de actualizar para que sea más estructurado.
Bostjan Skufca
1
Tal vez sea así. Pero sin siquiera un resumen de los pasos necesarios para usar esto, esta es una respuesta de solo enlace y es probable que se elimine.
muru
1
Bueno, proporcioné un puntero a una solución alternativa y viable. Si de eso no se trata este sitio, entonces, por supuesto, debería eliminarse, junto con mi cuenta.
Bostjan Skufca
2
@BostjanSkufca no necesita ofenderse. Es solo una cuestión de Stack Exchange tener al menos respuestas razonablemente independientes. Si te opones tanto a agregar pasos, ese es tu deseo. Mi voto negativo permanece. Alguien probablemente lo votará.
muru
3

Puede encontrar aquí un script para registrar todos los comandos / incorporaciones bash en un archivo de texto o un servidor syslog sin usar un parche o una herramienta ejecutable especial.

Muy fácil de implementar, ya que es un script de shell simple que debe llamarse una vez en la inicialización del bash .

Es gratis y espero que se ajuste a tus necesidades.

Francois Scheurer
fuente
1
Esta es una buena respuesta, pero es preferible incluir los pasos y el guión en el cuerpo de la respuesta, en lugar de vincular a su blog. ¿Puedes editar tu respuesta para incluir esto?
Tom Brossman
2
Sitio ahora no disponible
Gaia
0

Para ocuparse de múltiples sesiones sin sobreescribir el archivo de historial, deberá colocar "shopt -s histappend" en un archivo de inicio de Bash. Ver, también esta pregunta sobre el mismo problema.

pdp
fuente
0

intente esto (las soluciones anteriores no funcionarán al 100% con bash 4.3):

export HISTTIMEFORMAT="%Y-%m-%d %T "
export PROMPT_COMMAND='trap "" 1 2 15; history -a >(tee -a ~/.bash_history | while read line; do if [[ $line =~ ^#[0-9]*$ ]]; then continue; fi; logger -p user.info -t "bash[$$]" "($USER) $line"; done); trap 1 2 15;'

esto hace el registro Y evita el registro de las marcas de tiempo que se usan para el archivo de historial de bash. se necesita la trampa, ya que bash enviará las señales al "subtrabajo" después de presionar strg + c varias veces (probado con bash 4.3). esto forzará el cierre de sesión del usuario actual (por ejemplo, conectado con sudo)

Hans-Joachim Kliemeck
fuente
0

También puede intentar instalar acct. Acct mantiene un registro de auditoría detallado de lo que se está haciendo en sus sistemas Linux.

sudo apt-get install acct
edwinksl
fuente