Busindre » Blog Archive » Revisar la integridad de los ficheros de un sistema GNU/Linux / BSD (Checksum md5)

Revisar la integridad de los ficheros de un sistema GNU/Linux / BSD (Checksum md5)

June 4th, 2008 by Busindre

En entornos de servidor es muy común necesitar de la comprobación de integridad de determinados ficheros o directorios del sistema operativo cada cierto tiempo. Normalmente ese control de integridad se realiza para comprobar que no se produjeron cambios en ciertos tipos de ficheros desde la anterior comprobación, ficheros que pueden ser documentos de texto, backups, en ambientes de hosting encontraríamos interés en ficheros php, html, jsp, librerías o cualquier cosa que se necesite saber si ha sufrido algún tipo de cambio en un determinado espacio de tiempo, ya sea en el nombre del fichero o en su contenido, cualquier tipo de cambio. Esto se puede hacer con el algoritmo md5 y la utilidad md5sum del paquete coreutils.

Para revisar esa integridad se trata de crear una base de datos con los hashes md5 de los ficheros que queremos controlar y luego consultarla mientras se comprueba de nuevo los hashes de esos mismos ficheros, de haber alguna variación es que algún fichero ha sido modificado. Veamos como hacerlo con un ejemplo, luego cada uno que lo adapte a sus necesidades.

Si queremos hacer uso de subdirectorios necesitaremos instalar md5deep, que entre otras cosas aporta un modo de md5sum recursivo, cosa que no realiza el ejecutable del paquete coreutils.

Descargar md5deep: http://md5deep.sourceforge.net/#download

Compilar / Instalar md5deep:

$ tar -zxvf md5deep-3.0.tar.gz
$ cd md5deep-3.0
$ ./configure
$ make
# make install o checkinstall

Creamos un directorio para alojar la base de datos:

# mkdir /etc/checkmd5db/

Configuramos un comando para poder generar la base de datos y otro para revisarla, lo más aconsejable es crear alias:

alias md5sumdb='md5deep -r /var/www/vhosts /etc/httpd > "/etc/checkmd5db/md5sumdb.md5" 2> /dev/null'
alias checkmd5sum='md5sum -c /etc/checkmd5db/md5sumdb.md5 | grep -i "La suma no coincide"'

md5sumdb -> Crea la base de datos con los directorios que queremos controlar.
checkmd5sum -> Comprueba esos directorios que md5sumdb identificó en busca de modificaciones en la integridad de sus ficheros (Diferencia de hashes).

Nosotros para el ejemplo usaremos md5deep ya que nos facilita y simplifica el tener que insertar uno a uno los subdirectorios que queremos tener controlados. Los alias los colocamos en el archivo .bashrc del usuario que los va a ejecutar, por norma root. En principio necesitaremos dos alias, md5sumdb para que nos genere la base de datos con los hashes md5 de todos los ficheros que queramos y checkmd5sum, el cual chequea que esos hashes coincidan, mostrándonos alguna modificación en la integridad de los ficheros de esa base de datos si así ocurriera. Cada vez que se añadan nuevos ficheros a un directorio o se cambie de nombre una carpeta o fichero que se esté vigilando, deberemos ejecutar md5sumdb para que añada esos nuevos cambios a la base de datos. El nombre de los alias lógicamente puede ser el que cada uno escoja.

Varias opciones de alias dependiendo de la versión md5sum usada y el lenguaje:

md5sum -c /etc/checkmd5db/md5sumdb.md5 | grep -i "La suma no coincide"
md5sum -c /etc/checkmd5db/md5sumdb.md5 | grep -i "FAILED"

md5sum -c /etc/checkmd5db/md5sumdb.md5 | grep -i "No existe el fichero o el directorio"

Antes de nada se deben probar a ejecutar los comandos, mover algún fichero de sitio y editarlo para ver que tipo de salida muestra el comando "md5sum -c", ya que no es lo mismo buscar por sumas no coincidentes que por ficheros desaparecidos, el filtro de palabras cambiaría, podemos crear un alias más para comprobar los ficheros borrados, simplemente sería modificar el grep. También influye el idioma del sistema (Mirar locales) y la versión de md5sum, que de usar una versión distinta a otra podemos observar salidas desde "La suma no coincide" a "FAILED", por lo que es pertinente probarlo siempre antes de crear los alias.

Ejemplo de uso:

# alias
alias checkmd5sum='md5sum -c /etc/checkmd5db/md5sumdb.md5 | grep -i "La suma no coincide"'
alias md5sumdb='md5deep -r /etc > "/etc/checkmd5db/md5sumdb.md5" 2> /dev/null'

# md5sum -c /etc/checkmd5db/md5sumdb.md5 | grep -i "La suma no coincide"
md5sum: WARNING: 1 of 1172 computed checksums did NOT match
/etc/prueba: La suma no coincide

Borramos /etc/prueba y modificamos el alias actual para buscar ficheros desaparecidos.

# alias
alias checkmd5sum='md5sum -c /etc/checkmd5db/md5sumdb.md5 | grep -i "No existe el fichero o el directorio"'
alias md5sumdb='md5deep -r /etc > "/etc/checkmd5db/md5sumdb.md5" 2> /dev/null'

# checkmd5sum
md5sum: /etc/prueba: No existe el fichero o el directorio
md5sum: WARNING: 1 of 1172 listed files could not be read

Posted in How To, General |

Leave a Comment

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.