Averigüe qué proceso está cambiando un archivo

35

Estoy tratando de encontrar una forma confiable de encontrar qué proceso en mi máquina está cambiando un archivo de configuración ( /etc/hostspara ser específico).

Sé que puedo usar lsof /etc/hostspara averiguar qué procesos tienen actualmente abierto el archivo, pero esto no ayuda porque el proceso obviamente está abriendo el archivo, escribiéndolo y luego volviéndolo a cerrar.

También miré lsofla opción de repetición (-r), pero parece que solo va tan rápido como una vez por segundo, lo que probablemente nunca capturará la escritura en progreso.

Conozco un par de herramientas para monitorear los cambios en el sistema de archivos, pero en este caso quiero saber qué proceso es responsable, lo que significa atraparlo en el acto.

Robbles
fuente

Respuestas:

53

Puede usar la auditoría para encontrar esto. Si aún no está disponible, instale y habilite la auditoría de su distribución.

establecer una vigilancia de auditoría en / etc / hosts

/sbin/auditctl -w /etc/hosts -p war -k hosts-file

-w watch /etc/hosts
-p warx watch for write, attribute change, execute or read events
-k hosts-file is a search key.

Espere hasta que el archivo de hosts cambie y luego use ausearch para ver lo que está registrado

/sbin/ausearch -f /etc/hosts | more

Obtendrá grandes cantidades de salida, por ejemplo


time-> Wed Oct 12 09:34:07 2011 type = PATH msg = audit (1318408447.180: 870): item = 0 name = "/ etc / hosts" inode = 2211062 dev = fd: 00 mode = 0100644 ouid = 0 ogid = 0 rdev = 00: 00 obj = system_u: object_r: etc_t: s0 type = CWD msg = audit (1318408447.180: 870): cwd = "/ home / iain" type = SYSCALL msg = audit (1318408447.180: 870): arch = c000003e syscall = 2 éxito = sí salir = 0 a0 = 7fff73641c4f a1 = 941 a2 = 1b6 a3 = 3e7075310c ítems = 1 ppid = 7259 pid = 7294 au id = 1001 uid = 0 gid = 0 euid = 0 suid = 0 fsuid = 0 egid = 0 sgid = 0 fsgid = 0 tty = pts0 ses = 123 comm = "touch" exe = "/ bin / touch" subj = user_u: system_r: unconfined_t: s0 key = "hosts-file"


En este caso, utilicé el comando táctil para cambiar la marca de tiempo de los archivos, su pid era 7294 y su ppid era 7259 (mi shell).

user9517 es compatible con GoFundMonica
fuente
2
La "habilitación de auditoría para su distribución" probablemente debería ampliarse un poco. Molesto, los comandos anteriores no me dieron ni errores ni resultados. "/ sbin / auditctl -e 1" tampoco ayudó. Ejecutar un demonio de auditoría para hacer el registro ayudó - "/etc/init.d/auditd start" (aunque eliminó mis reglas, así que tuve que ingresarlas nuevamente).
tobixen
No funcionó para mí, ausearchsiempre regresa<no matches>
m0skit0
1
a veces es posible que necesite configurar varias auditorías para obtener el proceso real que inició la modificación si ese proceso, por ejemplo, llama a un comando externo para que haga el trabajo por él. es decir, estaba tratando de averiguar por qué una entrada de usuario crontab se restablecía constantemente. El comando crontab fue el responsable, pero cuando verifiqué el ppid había salido, así que también tuve que auditar / usr / bin / crontab, luego hacer coincidir la marca de tiempo del acceso al crontab con la ejecución auditada de crontab y luego verificar es ppid ... que reveló que un demonio de orquestación estaba aplicando una configuración de usuario específica cron.
Wil
3

También puedes usar inotify-tools:

  inotifywait -mq -e open -e modify /etc/hosts
Dragos
fuente
14
Auditd puede brindarle la información que desea. Aunque es fácil suponer que inotify le permitirá hacer esto, no lo hará, ya que no le dará la identificación del proceso que realizó la modificación.
objetivado
2

Después de mucha búsqueda, encontré la solución, solo use este comando: sudo fs_usage | grep [path_to_file]

treblam
fuente
2
esto es solo para MacOS ...
majick