¿Hay una manera fácil de registrar todos los comandos ejecutados, incluidos los argumentos de la línea de comandos?

11

Estoy tratando de encontrar cómo registrar una instanciación específica rrdtoolpara ver si la ruta que está recibiendo es incorrecta.

Sé que podría envolver el ejecutable en un script de shell que registraría los parámetros, pero me preguntaba si había una forma más específica del kernel para monitorear eso, tal vez una devolución de llamada del sistema de archivos que ve cuando un / proc / pid / exe particular coincide con un binario dado?

Peter Grace
fuente
¿Hay alguna manera de auditdregistrar los argumentos de la línea de comandos y ejecutar el programa? serverfault.com/questions/765179/…
Neil

Respuestas:

16

Sí, hay una instalación de kernel: el subsistema de auditoría. El auditddemonio realiza el registro y el comando auditctlconfigura las reglas de registro. Puede registrar todas las llamadas a un sistema específico alls, con algo de filtrado. Si desea registrar todos los comandos ejecutados y sus argumentos, registre la execvellamada al sistema:

auditctl -a exit,always -S execve

Para rastrear específicamente la invocación de un programa específico, agregue un filtro en el ejecutable del programa:

auditctl -a exit,always -S execve -F path=/usr/bin/rrdtool

Los registros aparecen en /var/log/audit.log, o donde sea que su distribución los coloque. Debe ser root para controlar el subsistema de auditoría.

Una vez que haya terminado de investigar, use la misma línea de comando en -dlugar de -aeliminar una regla de registro, o ejecute auditctl -Dpara eliminar todas las reglas de auditoría.

Para fines de depuración, reemplazar el programa por un script de envoltura le brinda más flexibilidad para registrar cosas como el entorno, información sobre el proceso principal, etc.

Gilles 'SO- deja de ser malvado'
fuente
¿Por qué el -F path=/ust/bin/rrdtool? No entiendo cómo rrdtooles el software relacionado.
Graeme
@Graeme El problema descrito en la pregunta era el seguimiento de una invocación de rrdtool. Si desea registrar invocaciones de todos los programas, elimine la -F path=…parte (por supuesto, obtendrá muchos registros).
Gilles 'SO- deja de ser malvado'
Correcto ... primera línea de la pregunta. Gracias.
Graeme
Todo esto es genial, pero ¿cómo restablezco la configuración al estado inicial? De lo contrario, continuará llenando el registro con nuevos y nuevos comandos lanzados ... ¿o este auditctlcomando solo será efectivo hasta que se reinicie?
Ruslan
@Ruslan El efecto de auditctlsolo sobrevive hasta el reinicio, pero ese es un buen punto de todos modos, he agregado instrucciones para eliminarlos sin reiniciar mi respuesta.
Gilles 'SO- deja de ser malvado'
6

Podrías usar snoopy .

Snoopy es una solución más ligera ya que no necesita la cooperación del núcleo. Todo lo que se necesita es un cargador dinámico (dl) que precarga la biblioteca snoopy, cuya ruta se especifica en /etc/ld.so.preload.

Divulgación: Soy actual mantenedor de snoopy.

Bostjan Skufca
fuente
¿Es posible hacer el registro de comandos generados directa o indirectamente solo desde un shell particular?
RV
No estoy seguro de entender su pregunta: ¿quiere decir "shell" como programa específico que se utiliza como shell (bash, dash, zsh, etc.), o quiere decir que desea registrar solo PTY específico? Snoopy proporciona un marco de filtrado, pero actualmente solo se implementan un par de filtros muy básicos, vea aquí la lista: enlace . Si tiene un caso de uso concreto que podría ser aplicable a otros, explique en la solicitud de función y, por cierto, los parches son bienvenidos :)
Bostjan Skufca
Me refería a un PTY específico.
RV
No hay un filtro específico para el cajero automático PTY disponible. Sin embargo, puede usar snoopy para registrar todo, incluido en qué PTY se produjo el evento, y luego hacer el filtrado en su demonio syslog. No sé cuál está usando, pero syslog-ng (por ejemplo) puede hacer coincidir expresiones regulares, positivas o negativas.
Bostjan Skufca
¡Seguro gracias! La herramienta y el enfoque son en general bastante útiles. Puedo filtrar fácilmente para obtener lo que necesito.
RV
2

El subsistema de "auditoría" del kernel de Linux puede hacer lo que necesita.

por ejemplo, si ejecuta estos comandos:

auditctl -a exit,always -F arch=b64 -S execve
auditctl -a exit,always -F arch=b32 -S execve

Luego, se registra cada evento de ejecución y se proporciona mucha información al respecto

por ejemplo, esta es la salida de mí corriendo tail /var/log/audit/audit.log

exit=0 a0=7f0e4a21e987 a1=7f0e4a21e6b0 a2=7f0e4a21e808 a3=8 items=2 ppid=906 pid=928 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="tail" exe="/usr/bin/tail" subj=kernel key=(null)
type=EXECVE msg=audit(1543671660.203:64): argc=2 a0="tail" a1="/var/log/audit/audit.log"
type=CWD msg=audit(1543671660.203:64):  cwd="/home/sweh"
type=PATH msg=audit(1543671660.203:64): item=0 name="/usr/bin/tail" inode=266003 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PATH msg=audit(1543671660.203:64): item=1 name="/lib64/ld-linux-x86-64.so.2" inode=273793 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PROCTITLE msg=audit(1543671660.203:64): proctitle=7461696C002F7661722F6C6F672F61756469742F61756469742E6C6F67

Hay algunos valores interesantes que se pueden ver; por ejemplo, "auid" es 500, que es mi ID de inicio de sesión, a pesar de que "uid" es cero (porque estoy ejecutando bajo su). Por lo tanto, aunque el usuario haya cambiado de cuenta suo sudoaún podamos rastrear su "ID de auditoría"

Ahora esos auditctlcomandos se perderán al reiniciar. Puede colocarlos en un archivo de configuración (por ejemplo, en el /etc/audit/rules.d/directorio, en CentOS 7). La ubicación exacta dependerá de la versión de su sistema operativo. La auditctlpágina del manual debería ayudar aquí.

Sin embargo, tenga cuidado ... esto provocará que se generen muchos mensajes de registro. ¡Asegúrese de tener suficiente espacio en el disco!

Si es necesario, las reglas pueden limitarse a un usuario específico o un comando específico.

Y también ten cuidado; si un usuario pone la contraseña en la ejecución del comando (por ejemplo mysql --user=username --password=passwd), esto se registrará.

Stephen Harris
fuente