Cómo registrar cada comando de Linux en un servidor de registro

13

Quiero que cada comando mecanografiado vaya a un servidor de registro. Ya está configurado el syslog-ng para enviar todos los registros al servidor de registros.

Estoy interesado en todos y cada uno de los métodos para hacer esto. Esperaría un poco de discusión sobre usuarios deshonestos y seguridad, pero el primer objetivo principal es simplemente que las sesiones se registren. Todas las sesiones se realizan a través de ssh, pero los comandos de conexión de la consola también deben registrarse. Me gustaría que esto suceda para cualquier shell, pero el principal es bash. (De nuevo, sé que un usuario malintencionado podría crear su propio shell ...)

León
fuente

Respuestas:

29

No es así como abordas el problema. Una vez que le da acceso de shell a un usuario, le está confiando que haga cualquier cosa para la que tenga los permisos adecuados. Olvídese del registro de comandos, hay demasiadas formas de ejecutar un comando en cualquier sistema Unix.

Por ejemplo, el usuario puede iniciar un cliente de correo (el único comando registrado es pine, por ejemplo), allí selecciona "Componer", que inicia VI, y desde VI inicia cualquier comando que desee :!cmd. Este comando no está registrado en ninguna parte, y desde el punto de vista del sistema, es como cualquier aplicación auxiliar llamada por VI, como grep u sort. El único comando registrado por el shell fue pine.

Parece que lo que realmente quieres se llama auditoría . Habilite el subsistema de auditoría y use el auditctlcomando y el auditddemonio del paquete de auditoría para controlar lo que se registra. Más información se encuentra en la página del manual auditctl (8) .

Tenga en cuenta que registrar cada instancia de proceso también puede no ser óptimo. Por ejemplo, lo simple ./configurepara un paquete de software (creado usando autotools) es notable por crear miles de instancias de proceso. Esto inundará el registro de auditoría con tanto ruido que será muy difícil analizarlo más tarde.

Juliano
fuente
13

Instale el acctpaquete (el nombre del paquete varía según la distribución, también conocido como contabilidad de procesos) y use lastcomm <username>:

[mithrandir]-[/home/sernin]-[1951] % lastcomm sernin
tr                     sernin   pts/2      0.00 secs Fri Nov 12 12:02
zsh               F    sernin   pts/2      0.00 secs Fri Nov 12 12:02
tr                     sernin   pts/2      0.02 secs Fri Nov 12 12:02
zsh               F    sernin   pts/2      0.00 secs Fri Nov 12 12:02
fortune                sernin   pts/2      0.00 secs Fri Nov 12 12:02
xmodmap                sernin   pts/2      0.00 secs Fri Nov 12 12:02
xrdb                   sernin   pts/2      0.00 secs Fri Nov 12 12:02
sh                     sernin   pts/2      0.00 secs Fri Nov 12 12:02
cpp                    sernin   pts/2      0.00 secs Fri Nov 12 12:02

También puede buscar por tty o nombre de comando. Como de costumbre, man lastcommpara más información.

Sam Halicke
fuente
11

Si está dispuesto a hacer un poco de programación en C, puede hacerlo escribiendo una biblioteca que envuelva execve, inicie sesión en syslog, luego dlopen es la biblioteca que contiene la llamada de servicio ejecutiva real. Luego, en / etc / environment, establezca LD_PRELOAD en la ruta de la biblioteca que ha creado.

Deberá tener cuidado al ingresar un bucle aquí, por lo que es posible que solo desee registrar los archivos ejecutables de ciertos archivos binarios o excluir el registro de otros (como syslog).

marca
fuente
En realidad, esto es bastante útil. La primera búsqueda en execve wrapper muestra snoopy ( sourceforge.net/projects/snoopylogger ). Parece cercano a lo que estaba buscando, aunque un poco detallado. Después de las pruebas, veo que necesitaré la aprobación de la gerencia para poner esto en un entorno de producción. (Una advertencia para todos los tipos nefastos)
Leo
@Leo Desde la versión 2.0.0, Snoopy admite la especificación de formato de registro personalizado al hacer ./configure, por lo que el exceso de verbosidad ya no debería ser un problema. Divulgación: Snoopy mantenedor aquí.
Bostjan Skufca
7

Me parece que estás buscando algo así como rooth ( página de manual ). Para citar la página del manual:

Rootsh es un envoltorio para shells que registra todas las pulsaciones de teclas repetidas y la salida del terminal en un archivo y / o syslog.

A pesar del nombre, esto se puede usar para cualquier usuario.

Andrew M.
fuente
2

Probablemente sea mejor que los usuarios usen sudo (o similar) para ejecutar comandos que le interesen y que confíen en los usuarios en algún nivel. A medida que se acerca a "controlar completamente" las cosas, es más difícil rastrear lo que están haciendo. Recientemente he estado buscando herramientas como esta, por ejemplo. En su mayoría, solo crean registros que son difíciles de administrar si tienes suficientes usuarios y máquinas para que valga la pena. :)

Considere toda la información que generará. ¿Cuánto te importa? Probablemente muy poco, por lo que está generando registros que en su mayoría no valen nada. Auditar las cosas que realmente te importan, como sugieren otros, probablemente te lleve a un mejor estado final.

dannysauer
fuente
1

Bash se puede compilar con soporte de syslog desde 4.1.

No es infalible (la contabilidad de procesos podría ser mejor para eso), pero es principalmente la interacción del usuario; el volumen debería ser más manejable y podrá cambiar a algo más detallado si sospecha algo anormal.

Dicho esto, esto es muy intrusivo y, como usuario, esperaría una advertencia de privacidad muy específica antes de comenzar a hacerlo.

Tobu
fuente
0

También hay sudosh ( http://sudosh.sourceforge.net ) que hará el registro de la sesión. Tiene la opción de ejecutarlo como un shell definido para un usuario o mediante sudo. También realiza un seguimiento de los tiempos para cada sesión para que pueda reproducir la sesión y verla (incluidas las sesiones de edición y otras cosas).

Palo
fuente