Supervisión de cambios de datos mediante un HIDS

En este artículo explicaré cómo monitorear sus datos y cómo detectar cambios. Este tipo de monitoreo se realiza principalmente mediante un sistema de detección de intrusos basado en host...

En este artículo, explicaré cómo monitorear sus datos y cómo detectar cambios. Este tipo de monitoreo se realiza principalmente mediante un Sistema de detección de intrusos basado en host (HIDS) como Integrit. En este artículo, describimos varios métodos para sus diferentes casos de uso.

IDS (Resumen)

En general, un sistema de detección de intrusos (IDS) es un dispositivo o una aplicación de software que observa y analiza la actividad del sistema en busca de actividades malévolas o infracciones de políticas. Inspecciona el tráfico de la red, las llamadas al sistema y los cambios realizados en los dispositivos de almacenamiento para descubrir acciones sospechosas basadas en el comportamiento conocido del sistema ("¿el sistema se comporta normalmente o la carga es mucho más alta de lo habitual?"). En un caso ideal, un IDS también lo alerta automáticamente cuando alguien o algo está tratando de comprometer su sistema.

En general, hay dos tipos diferentes de IDS disponibles: NIDS e HIDS.

Sistema de detección de intrusiones en la red (NIDS)

Un NIDS está ubicado estratégicamente en varios puntos de la red para monitorear pasivamente el tráfico que va y viene de los dispositivos de la red para encontrar tanto paquetes de red como actividades sospechosas. El objetivo es descubrir las firmas de los piratas informáticos y notificar al administrador del sistema antes de que los delincuentes puedan causar daños graves o simplemente ocupar el ancho de banda y comprometer la potencia informática (los llamados ataques de denegación de servicio).

En su mayoría, un NIDS es una combinación de sensores de hardware independientes y componentes de software que funcionan juntos para adaptarse a un mayor rango.

Selección de herramientas: Bufido, Suricatá, [Hermano/Zeek](https://www.zeek. org/).

Sistema de detección de intrusos basado en host (HIDS)

Un HIDS rastrea y audita los cambios y modificaciones de archivos locales. Esto incluye la supervisión de archivos de datos y estructuras de directorios, y el descubrimiento de cambios en la estructura misma, así como en el contenido, los derechos de acceso, el inodo, el tamaño y la información de acceso.

Selección de herramientas: cable trampa, integridad, [AYUDANTE](http:/ /aide.sourceforge.net/), samhaín, Systraq, Seguridad HIDS de código abierto (OSSEC).

Como se señaló anteriormente, los NIDS se instalan en un sistema separado para cuidar una red completa. De ahí el nombre, HIDS debe instalarse en cada computadora en una red y solo se ocupa de una máquina específica.

Además, también hay versiones combinadas disponibles -- los llamados Hybrid IDS -- que ofrecen ambos servicios más un nivel de gestión para la red y el nivel de host. Entre otros esto incluye Sagan, Cebolla de seguridad, [Tigre](http://www.nongnu.org/ tiger/), ACARM-ng y Auditoría. Una cuarta categoría, pero más pequeña, contiene IDS específicos de distribución, como Debsecan para Debian GNU/Linux.

¿Quién necesita un IDS?

Aún así, la pregunta sigue siendo quién necesita un IDS y, especialmente, ¿por qué? Un IDS es un componente central de la infraestructura de seguridad para las corporaciones, y es más que útil para evitar que los servidores comerciales y los centros de datos sufran daños en los datos. El objetivo de IDS es identificar cualquier cambio realizado que comprometa los activos comerciales, la información confidencial y los archivos críticos privados.

¿Cómo funciona un HIDS?

Básicamente, un HIDS mantiene un conjunto de datos inicial por archivo o directorio en una base de datos. Una sola entrada contiene una lista de atributos, por ejemplo, el nombre del archivo y los atributos del archivo como la hora de creación, la hora de acceso, la hora de modificación, el propietario, el número del inodo, su tamaño e información sobre el contenido del archivo. Es común guardar este último como un valor hash, por ejemplo, utilizando el mecanismo SHA-1 o SHA-256. MD5 se ve como roto y, por lo tanto, ya no se recomienda su uso.

Para comprobar si los datos no han cambiado, el HIDS vuelve a calcular el conjunto de datos correspondiente y lo compara con el original. Al encontrar que un conjunto de datos es idéntico al otro, HIDS devuelve un valor positivo, ya que este resultado indica que la entrada correspondiente no ha sido modificada. De lo contrario, ha ocurrido un posible incidente y el HIDS le avisará.

A continuación, le mostraremos diferentes formas de verificar la integridad de sus datos.

Uso de comandos de shell integrados

Esta solución se basa en el comando buscar y es bastante simple. Le permite utilizar métodos integrados de UNIX/Linux para ver si una entrada de archivo se ha modificado en un intervalo de tiempo específico.

El primer parámetro para el comando de búsqueda es -type f, y limita la salida solo a archivos. El segundo parámetro -newermt establece otro límite: el tiempo de modificación. En el siguiente ejemplo, el límite inferior se establece en el 3 de enero de 2019 a las 12 h 00 y el límite superior en ahora, implícitamente. Luego, buscar imprime solo estas entradas que tienen un tiempo de modificación más reciente que el especificado en la línea de comando. En consecuencia, la salida solo contiene file2.tmp de la lista.

1
2
3
4
5
6
$ ls -l
total 16
-rw-r--r--  1 frank frank        3 Jan  3 12:00 file1.tmp
-rw-r--r--  1 frank frank   11 Jan  4 16:53 file2.tmp
$ find . -type f -newermt "2019-01-03 12:00:00"
./file2.tmp

Para establecer un período de tiempo con un límite superior e inferior, buscar le permite especificar dos valores. El siguiente ejemplo establece las 12:00 del 3 de enero de 2019 como límite inferior y las 18:00 como límite superior utilizando ! como negación:

1
2
$ find . -type f -newermt "2019-01-03 12:00:00" ! -newermt "2019-01-03 18:00:00"
...

Hasta ahora, solo sabemos que el archivo descubierto tiene un tiempo de modificación diferente. Para ver si el contenido fue modificado, en realidad, un valor de picadillo para el contenido ayuda. Puedes calcular diferentes valores hash usando los comandos sha512sum, cksum, md5deep y hashdeep, hashalot y hashrat.

En el siguiente ejemplo, usamos sha1sum para calcular el valor hash del contenido. sha1sum genera dos columnas: el valor calculado para el contenido del archivo y el nombre del archivo.

1
2
3
$ sha1sum file*
56ac1c08fa5479fd57c4a5c65861c4ed3ed93ff8  file1.tmp
56ac1c08fa5479fd57c4a5c65861c4ed3ed93ff8  file2.tmp

Para comparar dos condiciones diferentes de archivos, tenemos que comparar dos conjuntos: antes y después de una modificación. Es por eso que guardamos la salida de cksum en un archivo llamado snapshot-20190103 de la siguiente manera, en primer lugar:

1
$ sha1sum f* > snapshot-$(date +%Y%m%d)

Con la ayuda del comando sha1sum podemos ver las diferencias entre la última instantánea y la actual.

1
2
3
4
5
$ sha1sum -c snapshot-20190103
file1.tmp: OK
file2.tmp: FAILED
sha1sum: WARNING: calculated value for 1 does NOT match
$

La solución que se muestra es bastante simple y se puede integrar fácilmente en una verificación frecuente, como por ejemplo en crontab. En principio, podemos averiguar si el contenido del directorio sigue siendo el mismo y si los archivos existentes anteriormente se han eliminado o modificado, o si se han agregado nuevos archivos en el tiempo entre nuestras instantáneas. Cuantos más archivos se van a rastrear, más complejo se vuelve averiguar qué se hizo.

Uso de un sistema de control de revisión

La solución que tenemos hasta ahora nos permite hacer un seguimiento de los cambios en las estructuras con un número menor de entradas. Desafortunadamente, los cambios que ocurrieron sobrescriben los archivos y datos existentes, y no se pueden revertir o restaurar instantáneamente a menos que exista una copia de seguridad adicional adecuada. Un sistema de control de revisiones como Git o Apache Subversion (SVN) puede ayudarnos. Ambas herramientas rastrean los cambios de contenido y también nos ofrecen un historial de versiones para los archivos y directorios.

Como ejemplo, el comando git status muestra los cambios que se han realizado.

1
2
3
4
5
6
7
8
9
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   dataset1.dbs
#
no changes added to commit (use "git add" and/or "git commit -a")

La desventaja de estas soluciones es que requieren un paso adicional: una confirmación tan pronto como haya cambiado una entrada en el sistema de archivos. Tanto Git como Subversion no lo hacen automáticamente. Herramientas como incron y fswatch pueden manejar este tipo de eventos y desencadenar más acciones como confirmaciones automáticas, notificaciones o alertas.

Configuración de un HIDS

El tercer grupo de soluciones se basa en herramientas especiales clasificadas como Sistemas de detección de intrusos basados ​​en host (HIDS). Permiten realizar un seguimiento de los cambios de contenido, derechos de los usuarios y tiempos de acceso. Para ilustrar su uso, monitorearemos un directorio usando Integrit. HIDS Integrit está disponible como un paquete Debian regular.

En primer lugar, instale integrit desde los repositorios de paquetes, por ejemplo, usando apt-get de la siguiente manera:

1
$ apt-get install integrit

A continuación, Integrit debe configurarse correctamente. Integrit se refiere a un archivo de configuración para saber qué directorios vigilar y dónde almacenar sus datos. En nuestro ejemplo, el único directorio que nos gustaría monitorear es /home/user/research-data, y es por eso que configuramos la entrada root= en esta ruta.

Se hace referencia a las dos bases de datos que contienen el estado anterior y el estado actual mediante las dos entradas known= y current=. Mantenga estas bases de datos en lugares seguros. Con fines ilustrativos, los mantenemos en el mismo directorio. Guarde también esta configuración como el archivo integrit.conf en un directorio local.

{.img-responsive}

En el siguiente paso iniciamos la base de datos original. Ejecute Integrit con privilegios administrativos (en nuestro caso como usuario root) e invoque el siguiente comando:

1
$ integrit -v -C integrit.conf -u

{.img-responsive}

Integrit inicializa su base de datos y la almacena en el archivo current.cdb. A continuación, hacemos algunos cambios en nuestros datos, volvemos a ejecutar Integrit y vemos qué dice sobre nuestros cambios. Un cambio puede ser un nuevo archivo o una nueva línea que simplemente agrega a un archivo existente.

Antes de volver a ejecutar Integrit, haga una copia de seguridad de la base de datos actual de acuerdo con la configuración del archivo de configuración de Integrit de la siguiente manera:

1
$ cp current.cdb to known.cdb

Ahora, podemos volver a ejecutar Integrit así:

1
$ integrit -v -C integrit.conf -c

Como puede ver en la siguiente captura de pantalla, Integrit descubre el cambio y se queja. Eso es lo que queríamos :)

{.img-responsive}

Conclusión

Descubrir cambios de datos en el sistema de archivos no es demasiado complicado. Necesita un poco de preparación pero ayuda a no sorprenderse en el futuro. Los datos son tuyos, y cuidarlos funciona a tu favor.

La selección de herramientas que hicimos no está completa, ya que también existen otros niveles y mecanismos de verificación de integridad. Para leer más, eche un vistazo a sistemas de archivos como BTRFS y [ZFS/OpenZFS](https://en.wikipedia.org/wiki/ ZFS) así como herramientas como cazador de rootkits.

En el próximo artículo repasaré varias formas de rastrear y confirmar automáticamente los cambios de archivos usando herramientas populares de control de versiones como Git.

Agradecimientos

El autor desea agradecer a Axel Beckert, Veit Schiele y Zoleka Hofmann por su ayuda y comentarios críticos durante la preparación de este artículo.