Tuve la necesidad de buscar en un servidor los archivos que fueron creados por un usuario en particular, más específicamente "www-data" (usuario con el que corre Apache en los sistemas Debian y derivados). Esto fue lo único que se me ocurrió hasta el momento para encontrarlos (sin recurrir a auditd).



La herramienta find tiene una notable cantidad de funcionalidades y características. Entre tantas, existe la posibilidad de buscar archivos por dueño (usuario o grupo). Básicamente find permite buscar examinando cualquier información que esté presente en un inodo.

Para encontrar archivos utilizando el usuario dueño como criterio de búsqueda, en Linux/*BSD, se debe recurrir a la opción -user. Por ejemplo:

root@debian:/var/www/linuxito.com# find . -user www-data
./tmp/img_temp.gif
./tmp/img_temp.jpeg
./tmp/arch_temp.docx
./tmp/arch_temp.pptx
./tmp/img_temp.png
./tmp/img_temp.jpg
./tmp/arch_temp.pdf

Este comando encuentra los archivos cuyo dueño es www-data.

Mi problema era saber qué archivos habían sido creados por este usuario llamado "www-data". En los inodos se guarda información respecto al dueño de cada archivo (usuario y grupo dueños del archivo o directorio), pero no se almacena información alguna respecto al creador del archivo. De hecho, de acuerdo a la especificación POSIX ni siquiera se almacena la fecha de creación, apenas la fecha de última modificación del inodo (ctime).

Por ende, si no contamos con un sistema de monitoreo y registro continuo de actividad en los sistemas de archivos (tarea que implementa efectivamente auditd), será imposible saber quién creó un archivo. Esto se debe a que, al momento de crear un archivo, se establece como usuario y grupo dueño del mismo al usuario efectivo que lo crea y su grupo principal. Aunque, nada impide luego cambiar el ownsership (tarea que realiza la herramienta chown).

Sin embargo, si somos root (muy probable en el caso de un SysAdmin) el usuario dueño de los archivos nos puede dar una buena certeza de quién fue su creador, dado que a fin de poder cambiar el ownsership de un archivo o directorio es necesario tener acceso como superusuario (root). Esto quiere decir que sólo nosotros (o a lo sumo otro miembro del equipo de SysAdmins/DevOps) pudimos haber sido quienes hayamos cambiado el ownership.

Si tenemos la seguridad de no haber cambiado permisos en el directorio donde deseamos buscar. Ya sea porque tenemos memoria, podemos consultar a los miembros del equipo restantes, o revisamos el history (o los, si damos acceso a usuarios non-root a través de sudo, guiño, guiño, don soborno). Entonces el owner de los archivos será muy probablemente el creador de los mismos.

En definitiva pueden darse tres casos:

  1. Los archivos fueron creados por www-data y luego root cambió su ownership: no los vamos a encontrar porque pertenecen a otro usurio, a pesar de haber sido creados por www-data.
  2. Los archivos fueron creados por root, quien luego cambió su ownership a www-data: serán falsos positivos, pues los encontraremos como si fuesen creados por www-data cuando no fue así.
  3. Los archivos fueron creados por www-data y no se cambió el ownership: esta es la situación ideal que nos permite concluir que fueron creados por www-data.

El comando find mostrado anteriormente encontrará los archivos pertenecientes a los casos 2 y 3. Y no encontrará los del primer caso. Sin embargo, teniendo el control del usuario root tendremos la certeza de los resultados de la búsqueda. Sólo basta hacerse la pregunta: ¿hemos utilizado chown sobre el directorio destino (o sobre algún directorio de nivel superior de manera recursiva) de forma que se alteren los resultados? Si no lo hemos hecho, tendremos la seguridad de que los resultados arrojados por find corresponden exclusivamente con los del caso 3 (www-data es el creador de los archivos, además de ser el dueño de los mismos).

Más adelante explicaré cómo configurar el demonio auditd para monitorear toda actividad en el filesystem.


Tal vez pueda interesarte


Compartí este artículo