Monitoreando sistemas de archivos en Linux
Juan Pablo Romero
Software Engineer¿Quién borró ese archivo ? ¿ Cuando lo borraron ? son preguntas recurrentes entre los usuarios y más aún cuando se mantienen directorios y archivos compartidos en una red. La situación se complica cuando se quiere llevar una trazabilidad de las operaciones que los usuarios realizan sobre los archivos, (aclaro que no me refiero al historial de cambios), quién modificó el archivo x y cuando lo hizo. Mantener ese "historial" es una tarea un tanto complicada y que depende en gran parte del sistema de archivos utilizado para el almacenamiento. En muchas organizaciones se ha extendido el uso de carpetas compartidas a través de algún sistema como SAMBA o NFS (por lo regular sistemas que actúan como PDC), con Linux como servidor y clientes Windows. En muchas ocasiones dichos directorios compartidos requieren de permisos especiales (sólo lectura para determinados grupos o modificación para determinado usuario del dominio), cuestión que es relativamente sencilla de solucionar trabajando con el esquema de permisos de Unix y listas de control de acceso. Sin embargo cuando se requiere mantener un historial de operaciones sobre los archivos (quién hizo qué) los logs de samba no son suficientes, además de que son muy engorrosos de analizar. ¿ Qué solución hay entonces ?.
Pues bien, como lo mencioné anteriormente esta situación está directamente relacionada con el sistema de archivos, dado que las operaciones que nos interesan capturar se realizan sobre los archivos mismos (creación. modificación, cambio de atributos, etc). Desde la versión 2.6.13 del kernel Linux se integró una característica muy interesante llamada inotify el cual es un sistema que notifica cambios en los archivos (una descripción más detallada de la implementación y uso (desde C) se encuentra en un artículo muy interesante de los autores en Linux Journal). Con inotify tenemos un sistema que permite capturar eventos sobre los archivos y directorios como: acceso, modificación, modificación y cierre, borrado, renombrado entre otros. Al ser un componente del kernel Linux su extensión se realiza a través de C (incluyendo la cabeceras inotify.h y inotify-syscalls.h) y compilando .... cóooomo compilar ? dirán algunos para los que desarrollar en C como compilar es una labor un tanto tediosa y de hecho lo es. Afortunadamente existe un wrapper desarrollado en python que nos facilita mucho la vida se llama: pyinotify (un nombre muy original). Con este wrapper es posible en pocas líneas de código monitorear un directorio de archivos de forma muy sencilla, escribiendo a un log todos los eventos que ocurren o notificando a una aplicación.
¿ Cómo usar pyinotify ?
Primero que todo se deben seguir las instrucciones de instalación que se pueden encontrar en la página del proyecto o en github. Una vez se haya instalado correctamente el módulo podemos empezar a realizar pequeños ensayos para conocer un poco más. Aquí va un pequeño ejemplo (basado en los de la página de pyinotify):
# -*- coding: utf-8 -*-
# Archivo example1.py
import pyinotify
class EventHandler(pyinotify.ProcessEvent):
def process_IN_CREATE(self, event):
print "Creacion del archivo :", event.pathname
wm = pyinotify.WatchManager()
mask = pyinotify.IN_CREATE
handler = EventHandler()
notifier = pyinotify.Notifier(wm, handler)
wdd = wm.add_watch('/tmp', mask, rec=True)
notifier.loop()
Si ejecutamos este script desde la terminal de comandos:
$ python example1.py
Cada vez que se agregue un nuevo archivo al directorio /tmp se imprimirá la cadena "Creación del archivo ..." junto con la ruta absoluta del archivo creado. De esa misma forma se pueden escuchar otro tipo de eventos (ver listado completo) y ejecutar la acción requerida (escribir a un log, enviar una notificación, un llamado a sistema, etc). En el wiki del proyecto en github hay numerosos ejemplos de como utilizar pyinotify, desde cuestiones sencillas hasta como construir un pequeño servicio de notificación. En AxiaCore hemos usado pyinotify en conjunto con rsync para la sincronización de archivos y monitoreo y registro de acciones sobre sistemas de archivos (usando el módulo logging) con buenos resultados y facilidad de implementación.
Es importante mencionar que el monitoreo solamente esta disponible para sistemas de archivos nativos en Linux como la familia ext2-3-4. Los sistemas de archivos como ntfs o vfat (fat32) no se encuentran soportados.
Bien, hasta aquí con esta corta introducción al uso de pyinotify. Espero que haya sido de utilidad.
Written by Juan Pablo Romero
Juan Pablo designs and builds robust software solutions with a focus on performance and usability. His problem-solving skills and attention to detail ensure high-quality and efficient applications.