Monitoreando tu filesystem en Linux – Integrit mini-howto

Escrito el 17 junio, 2007 – 21:00 | por simon | 5.110 lecturas

Si tenés un servidor linux y por desgracia un intruso logra ingresar a este, podría modificar los archivos binarios de tu sistema, para instalar nuevas versiones que le permitan ocultarse, o correr sniffers (para capturar contraseñas, datos en general), rootkits, etc.
Y vos, ni te enterarías hasta que sea demasiado tarde. Salvo que …

Una forma de prevenir esto, es utilizando alguna herramienta que te permita controlar que los archivos instalados en tu sistema no hayan sido modificados.

Existen muchísimas herramientas, y también depende de que distribución estés usando.

En Debian tenes ‘debsums’ por ejemplo, que valida todo lo instalado por apt-get contra una DB con sus respectivos MD5. Otras herramientas conocidas y mas completas son Tripwire, Integrit, AIDE, etc.

En este mini tutorial, nos vamos a focalizar en Integrit, bajo Debian. (en otras distribuciones no debería variar mucho).

Todos estos programas que mencionamos, funcionan de la misma forma: lo primero que hacen, es crear una base de datos, en la cual se guarda cada archivo con su checksum, y datos importantes sobre este. En cualquier momento, nosotros podemos correr un nuevo chequeo, que comparará la información que tenia, con la actual de cada archivo y de haber diferencias, nos avisará.

Instalación

Lo primero que debemos hacer en nuestro Debian, es instalar Integrit. Para ello, hacemos:

 apt-get install integrit

Esto instalará integrit, sin hacer ninguna pregunta en principio.

La configuración se encuentra en /etc/integrit/integrit.conf por defecto. Este archivo básicamente, contiene un listado de los directorios y archivos que queremos o no controlar.

Un ejemplo con la configuración mínima sería:

root=/known=/var/lib/integrit/known.cdb
current=/var/lib/integrit/current.cdb

!/mnt!/dev
!/home
!/lost+found
!/proc
!/tmp

Las 3 primeras lineas del archivo, le indican:

root= Es el directorio a partir del cual se controlaran los cambios. Es decir, desde / en adelante, se controla todo.
Si queremos que solo se controlen los cambios de todo lo que este dentro de /usr, deberíamos poner root=/usr, y así.

known= Es la ruta completa del archivo que contiene los datos de todos los checksums de los archivos & directorios controlados. (Es decir, la base de datos conocida o principal).

current= Es la ruta donde se generara la base de datos ACTUAL de Integrit. (es la que se genera al momento de hacer un update).

El resto, son todos los directorios que queremos EXCLUIR del control. Es decir, cada linea del archivo de configuración que comienza con un !, le dice a integrit que -ese- directorio o archivo, no debe ser controlado.

Por ejemplo, /dev, /home, /proc, /tmp son directorios que se modifican constantemente, por lo que no tendría sentido controlarlos, ya que nos volvería locos.

Una vez que terminamos de editar el archivo, y lo adaptamos a nuestras necesidades, podemos crear la base inicial de Integrit, para ello ejecutamos:

 integrit -C /etc/integrit/integrit.conf -u

Esto lo que hace, es generar una base de datos, con el estado actual del sistema al momento que lo ejecutamos (es decir, genera el archivo /var/lib/integrit/current.cdb que mencionamos anteriormente).

Como esta es nuestra DB inicial, la copiamos a la ruta que definimos en la variable known del archivo de configuración (/var/lib/integrit/known.cdb en nuestro ejemplo).
Para ello hacemos:

mv /var/lib/integrit/current.cdb /var/lib/integrit/known.cdb

Sería bueno que te guardes una copia de este archivo (/var/lib/integrit/known.cdb) en algún lugar seguro (podes mandártelo por mail o copiarlo a otro servidor).
A partir de este momento, ya tenemos Integrit funcionando.

Comprobación

En cualquier momento, si queremos controlar que nada haya sido modificado, debemos correr:

integrit -C /etc/integrit/integrit.conf -c

Lo cual, debería volver sin ningún error, ya que no realizamos ningún cambio.
Para probar si esta funcionando correctamente, lo que podemos hacer es cambiar la fecha de por ejemplo, el comando ‘ls’, haciendo: touch /bin/ls y al correr nuevamente:

integrit -C /etc/integrit/integrit.conf -c

nos debería mostrar algo como lo siguiente:

integrit: ---- integrit, version 3.02 -----------------
integrit:                      output : human-readable
integrit:                   conf file : /etc/integrit/integrit.conf
integrit:                    known db : /var/lib/integrit/known.cdb
integrit:                  current db : /var/lib/integrit/current.cdb
integrit:                        root : /
integrit:                    do check : yes
integrit:                   do update : no
changed: /bin/ls   m(20040716-083705:20070617-193655) c(20061114-235537:20070617-193655)

En donde nos avisa, en la ultima linea, que el archivo /bin/ls fue modificado.

Actualización

Ok, supongamos que efectivamente, nosotros hicimos un cambio en los archivos, por lo que la modificación es correcta, y no queremos que nos avise nuevamente de ese cambio, lo que debemos hacer, es actualizar la DB de Integrit, para que guarde los cambios como correctos. Para hacer esto, hacemos lo siguiente:

1) Generamos de nuevo la base de datos actual ..

integrit -C /etc/integrit/integrit.conf -u

2) El comando anterior, genero nuevamente el archivo /var/lib/integrit/current.cdb con los datos actuales, por lo que debemos moverlo a la base de datos conocida. (previo hacer un backup de la que teníamos antes, por las dudas). Así que hacemos primero:

mv /var/lib/integrit/known.cdb  /var/lib/integrit/known.cdb_`date +%Y%m%d%H%M`

Esto moverá el archivo known.cdb, a known.cdb_fecha_actual dentro de /var/lib/integrit/ como backup.
Ejemplo: known.cdb_200706171943 (17 junio 2007, 19:43)

3) Movemos la base de datos actual, para que sea, a partir de ahora, la nueva base conocida:

mv /var/lib/integrit/current.cdb /var/lib/integrit/known.cdb

Eso es todo, ya al correr nuevamente la verificación, Integrit no notificará los últimos cambios que hicimos.

Notificación / Avisos

Hasta acá, tenemos el Integrit configurado y funcionando, pero para enterarnos de que esta pasando, necesitamos ingresar al servidor y ejecutar el Integrit a mano para que controle los cambios.

Esto, no nos sirve de nada, ya que nosotros no queremos perder tiempo haciendo esto, porque tenemos pensado salir a conocer gente, hacer miles de deportes, etc …(?)

Así que vamos a configurar todo para que Integrit se corra solito todas las noches, y nos envíe un mail si algo se modifico.

Cuando instalamos Integrit con el apt-get, también creo 2 archivos:

/etc/cron.daily/integrit:

Script que se ejecuta todos los días vía cron, para realizar un chequeo de la DB (Es decir, actualizar /var/lib/integrit/current.cdb). Este script ya de por si funciona solo, no necesitamos modificarlo ni hacer nada.

/etc/integrit/integrit.debian.conf:

Este archivo es donde configuramos que queremos que haga el script anterior y como ..

Por lo tanto lo que tenemos que hacer, es editar /etc/integrit/integrit.debian.conf y cambiar para que nos quede algo similar a esto:

CONFIGS="/etc/integrit/integrit.conf" EMAIL_RCPT="ninja2023232@hotmail.com"
EMAIL_SUBJ="[integrit] `hostname -f`: report on changes in the filesystems"
ALWAYS_EMAIL=false

En donde;

CONFIGS: es el archivo de configuración a usar

EMAIL_RCPT: es la dirección de mail a la cual queremos que nos avise si hubo un cambio.

EMAIL_SUBJ: El asunto que usará en el mensaje que nos manda..

ALWAYS_EMAIL: Con esto definimos cuando queremos que nos mande un mail el integrit .. si ponemos ‘true’, siempre nos va a mandar un mail (con la salida del comando integrit al ejecutarse, lo cuál es bastante molesto) y si ponemos ‘false’ solo nos mandará un mensaje cuando se hizo algún cambio (recomendado)

Si no queremos que nos mande -nunca- nada, lo único que debemos hacer es dejar la linea CONFIGS vacía, es decir CONFIGS=””.

Conclusión:

Bueno, eso es todo por ahora.

Por supuesto, Integrit tiene muchísimas más opciones, y en la config se pueden armar cosas mas complejas, pero esto es solo una introducción.

La idea general de todos los programas de este tipo, es siempre la misma

– Crear una base de datos con todos los datos del sistema de archivos (DB conocida).

– Guardarte una copia de esta DB en algún lugar seguro.

– Periódicamente, realizar un chequeo de la DB conocida, contra los datos actuales del sistema de archivos.

– Si realizamos algún cambio en el sistema de archivos (dist-upgrade por ejemplo) actualizar la base de datos conocida.

Para mas información, te recomiendo ‘info integrit’ que esta bastante completa, o googlear un poco, ya que hay mucha info.

Este articulo esta basado en el publicado en el sitio Debian Administration.
(http://www.debian-administration.org/articles/49)

Storm Night (storm at malditainternet.com)

You must be logged in to post a comment.

Buscar: