Monitoreo de acceso a archivos de Linux

20

¿Hay alguna manera en Unix para averiguar quién accedió a cierto archivo en la última semana? Puede ser usuario o algún script ftp a otro lugar. ¿Puedo obtener una lista del nombre de usuario que accedió a cierto archivo? ¿Cómo puedo saber quién está accediendo a un archivo en particular?

Jack
fuente

Respuestas:

39

A menos que tenga políticas de registro extremadamente inusuales, quién accedió a qué archivo no se registra (sería una gran cantidad de información). Puede averiguar quién inició sesión a qué hora en los registros del sistema; el lastcomando le proporciona el historial de inicio de sesión y otros registros, como por ejemplo, /var/log/auth.logle dirán cómo se autenticaron los usuarios y desde dónde iniciaron sesión (qué terminal o qué host, de forma remota).

La fecha en la que se leyó por última vez un archivo se llama su tiempo de acceso, o tiempo para abreviar . Todos los sistemas de archivos de Unix pueden almacenarlo, pero muchos sistemas no lo graban, porque tiene una penalización de rendimiento (generalmente pequeña). ls -ltu /path/to/fileo stat /path/to/filemuestra el tiempo de acceso del archivo.

Si un usuario accedió al archivo y no estaba tratando de ocultar sus pistas, su historial de shell (por ejemplo ~/.bash_history) puede tener pistas.

Para averiguar qué o quién tiene un archivo abierto ahora, use lsof /path/to/file.

Para registrar lo que le sucede a un archivo en el futuro, hay algunas maneras:

  • Use inotifywait . inotifywait -e access /path/toimprimirá una línea /path/to/ ACCESS filecuando alguien lea file. Esta interfaz no le dirá quién accedió al archivo; puede llamar lsof /path/to/filetan pronto como aparezca esta línea, pero hay una condición de carrera (el acceso puede haber terminado para cuando lsof comience).

  • LoggedFS es un sistema de archivos apilable que proporciona una vista de un árbol de sistema de archivos y puede realizar un registro más elegante de todos los accesos a través de esa vista. Para configurarlo, consulte la sintaxis del archivo de configuración LoggedFS .

  • Puede usar el subsistema de auditoría de Linux para registrar una gran cantidad de cosas, incluidos los accesos al sistema de archivos. Asegúrese de que el auditddemonio esté iniciado, luego configure con qué desea iniciar sesión auditctl. Cada operación registrada se registra en /var/log/audit/audit.log(en distribuciones típicas). Para comenzar a mirar un archivo en particular:

    auditctl -w /path/to/file
    

    Si coloca un reloj en un directorio, los archivos en él y sus subdirectorios también se verán de forma recursiva.

Gilles 'SO- deja de ser malvado'
fuente
Gracias Gilles. Tengo este archivo de datos creado por el script. Solo quiero saber qué sucede con ese archivo después de que se está creando ... ninguno de los otros scripts lo está seleccionando para un proceso posterior, así que quiero ver si alguien está accediendo manualmente a ese archivo de datos
Jack
@Jack: es difícil de decir sin saber mucho más sobre su configuración, pero siempre que nada elimine o cambie el nombre del archivo, estará allí para que los otros scripts lo recojan, ya sea que alguien más esté accediendo o no. Por su comentario, creo que debería estar mirando lo que sucede cuando ejecuta sus scripts.
Gilles 'SO- deja de ser malvado'
2
Oye, podrías crear un bonito bucle circular con esto:syslogd access log file /var/log/audit.log at 10:01\nsyslogd access log file /var/log/audit.log at 10:02\n...
penguin359
7

El ejemplo anterior con inotifywait debería ser uno de (consulte la página del manual para obtener más información):

inotifywait /path/to/file
inotifywait -e open /pat/to/file

O con el modo de monitoreo y la marca de tiempo:

inotifywait -m --format '%w:%e:%T' --timefmt '%F %T %Z %z'
Milan Kerslager
fuente
6

La respuesta anterior no es la mejor práctica para hacer lo que pides. Linux tiene una API para esto. La inotifyAPI http://linux.die.net/man/7/inotify

  1. Puede escribir un programa en C para hacer lo que quiera simplemente llamando a la inotifyAPI directamente
  2. Puede usar kfsmd, http://www.linux.com/archive/feature/124903 , un demonio que usainotify
  3. Si desea algo que funcione en todas las plataformas ( inotifyes específico de Linux) y está utilizando Java, JNotify funciona en todas las plataformas (Linux, Mac, Windows), abstrayendo la API subyacente del sistema operativo nativo.
Cañada
fuente
3
Bienvenido a Stack Exchange . Las respuestas no se presentan en orden cronológico, por lo que "respuesta anterior" no transmite a qué respuesta se refiere. Me pregunto a cuál de los otros dos te refieres de todos modos: uno no tiene nada que parezca buena o mala práctica, y el otro menciona la API de inotify.
Gilles 'SO- deja de ser malvado'
Lo más probable es que Glen se refiera a la respuesta anterior con la clasificación de votos predeterminada. De hecho, la respuesta más popular no presenta una solución a la pregunta. Puede haber una serie de razones por las cuales uno podría necesitar ver cuántas veces se accede a los archivos durante un período de tiempo determinado.
Wtower
1
Como se explica en unix.stackexchange.com/a/12251/20336, inotify API no proporciona información sobre quién accedió a un archivo determinado. Además, inotify realmente no ayuda a descubrir quién accedió al archivo la semana pasada. Necesita funciones de auditoría para eso, lo que requiere el uso de un software llamado auditd(sin embargo, incluso esto no ayuda a averiguar quién accedió al archivo la semana pasada a menos que auditdya se haya ejecutado la semana pasada).
Mikko Rantalainen
3

Esto no es, en general, factible. He visto sistemas de archivos con suficiente auditoría para que sea posible de una forma u otra, pero no es una cosa general de Unix, no.

tchrist
fuente