La Gaceta de Linux ...¡ haciendo a Linux un poco más divertido !

Detección de Intrusos usando Tripwire

Por Barry O'Donovan

Traducción al español por Charles Bedón
el día 9 de Noviembre de 2004, para La Gaceta de Linux

Detección de Intrusos usando Tripwire

1. Introducción

Hace cerca de dos años fui hakeado. Alguien irrumpió en un servidor web que estaba administando y que sólo tenía Apache y OpenSSH corriendo públicamente, todo los paquetes fueron cambiados. El hacker reemplazó el binario ps con uno hecho por él para esconder sus procesos, adicionó un nuevo servicio que se ejecutaba desde el binario "/bin/crond " (el espacio es intencional - lo hacía parecer un proceso normal y conocido en un listado de procesos corriendo y como un binario normal en un listado de directorios). El proceso "crond " juntaba los nombres de usuario [logins] y contraseñas y los guardaba en un archivo de texto en el directorio "/dev/pf0     /   /", (5 y 2 espacios respectivamente), el cual contenía también un shell de root. Las posibilidades de que encontrara e identificara la intrusión habrían sido extremadamente remotas de no haber tenido corriendo el Tripwire.

Tripwire es un monitor de integridad de archivos basado en sistemas UNIX/Linux y trabaja como un excelente sistema de detección de intrusos. No prevendrá una intrusión; para eso vea mis anteriores artículos configurando firewalls y manteniendo segura una distribución Linux para mayor ayuda.

La idea detrás de Tripwire es muy simple: primero crea una base de datos "inicial" con el estado de los archivos y directorios en su sistema, y luego de ponerlo a correr, compara el estado actual de los archivos y directorios con la base de datos identificando cualquier borrado, adición o cambio. Los archivos y directorios ha ser monitoreados son seleccionados gracias a un archivo de "políticas". Este archivo también define qué atributos comparar, y esto puede incluir constancias de tiempo [timestamps] de modificación, acceso e inode, IDs de grupo o propietario, permisos, tamaño del archivo y su tipo, valores de hash MD5 y SHA, etc.

En este artículo le guiaré a través del proceso de obtención e instalación de Tripwire, su configuración y puesta a punto para correr en condiciones normales. En la sección final mencionaré unos pocos pasos adicionales que puede seguir para asegurar la integridad de la base de datos de Tripwire y su sistema de archivos.

2. Consiguiendo e Instalando Tripwire

El método más simple de instalar Tripwire es usar el paquete proveído por el vendedor (me he fijado y está disponible para RedHat/Fedora Core, SuSE, Mandrakesoft y Debian). Las ventajas de usar estos es que el archivo de políticas ya viene creado y configurado para el sistema que esté utilizando. Asegúrese de usar los paquetes oficiales para su distribución para estar seguros de que no han sido convertidos en troyanos.

Si no puede conseguir un paquete precompilado para su distribución, puede descargar el último código fuente de http://sourceforge.net/projects/tripwire/. La versión disponible en el momento en que se escribe el artículo es la 2.3.1-2. Esta versión está fechada en marzo de 2001 y cuando traté de compilarla en mi sistema obtuve miles de errores. Los fuente no usan el sistema de generación[build] autoconf/automake y esa podría ser la principal causa de los errores. He decidido poner la solución a esos problemas fuera del alcance de este artículo dada la disponibilidad de paquetes precompilados para muchas distribuciones

3. Un Vistazo a los Archivos del Tripwire

La operación del Tripwire es controlada por el archivo de configuración y el de políticas; ambos están codificados y firmados antes de usarse por razones de seguridad. Estos archivos usualmente residen en /etc/tripwire. Las versiones en texto plano son llamados twcfg.txt y twpol.txt, y las versiones codificadas y firmadas son tw.cfg y tw.pol. La versión en texto plano del archivo de configuración contiene los pares clave-valor incluyendo las siguientes variables requeridas (aquí se muestran los valores por defecto para mi distribución):

POLFILE         = /etc/tripwire/tw.pol
DBFILE          = /var/lib/tripwire/$HOSTNAME.twd
REPORTFILE      = /var/lib/tripwire/report/$HOSTNAME-$DATE.twr
SITEKEYFILE     = /etc/tripwire/site.key
LOCALKEYFILE    = /etc/tripwire/$HOSTNAME-local.key

POLFILE, DBFILE y REPORTFILE señalan la ubicación del archivo de políticas, la base de datos y el archivo de reportes respectivamente. un archivo de reportes es generado cada vez que se usa Tripwire para chequear la integridad del sistema de archivos y su nombre se determina a partir del nombre de host y la fecha actual. Las variables SITEKEYFILE y LOCALKEYFILE contienen la ubicación de los dos archivos de claves; las claves de sitio son usadas para firmar archivos que pueden ser usados por múltiples sistemas organizados como los archivos de políticas y de configuración, mientras que la clave local se usa para archivos específicos de este sistema, como el archivo de base de datos.

Asegúrese de que la variable de entorno $HOSTNAME está correctamente fijada con el valor del nombre de host del sistema antes de usar cualquiera de los comandos del Tripwire. También, la variable HOSTNAME en twpol.txt debe estar correctamente fijada cumpliendo la condición ya mencionada. Si Ud. no está seguro de cuál es el nombre del host en el sistema, entonces ejecute echo $HOSTNAME en la línea de comandos.

Aquí se muestran otros valores del archivo de configuración, seguidos de una descripción de cada uno.

EDITOR                 =/bin/vi
MAILNOVIOLATIONS       =true
EMAILREPORTLEVEL       =3
REPORTLEVEL            =3
MAILMETHOD             =SENDMAIL
MAILPROGRAM            =/usr/sbin/sendmail -oi -t
EDITOR
Cuando se actualiza la base de datos depués de haber añadido, removido o alterado archivos, un formulario estilo "cajas de selección" [ballot-boxes(=check-boxes?)] debe ser llenado colocando 'x' enfrente de los archivos que hemos cambiado, para que no reporte una intrusión; esta variable indica el editor a usar para este proceso.
MAILNOVIOLATIONS
Tripwire reporta vía correo electrónico cada vez que encuentra una violación. esta opción le dice al Tripwire que reporte siempre por correo. Es útil porque le muestra al administrador que Tripwire está funcionando como se esperaba.
EMAILREPORTLEVEL y REPORTLEVEL
La cantidad de información que incluye en sus archivos de reporte y en los correos. Los valores válidos están entre 0 y 4, siendo 3 el valor por defecto.
MAILMETHOD y MAILPROGRAM
El método de enviar correo puede ser SMTP (en cuyo caso deben ser fijadas variables de entorno adicionales para indicar el host SMTP y el puerto) o SENDMAIL (en este caso incluimos la variable MAILPROGRAM).

Hay una otra buena cantidad de opciones y son explicadas en la página de manual: TWCONFIG(4).

Crear su propio archivo de políticas es una larga y tediosa tarea que además está fuera del alcance de este artículo. Si consigue una versión empaquetada de Tripwire para su distribución entonces el archivos ys debe estar creado. El archivo de políticas es esencialmente una lista de reglas y archivos asociados que deberían ser verificados por el Tripwire; las reglas indican la severidad de una violación. La versión en texto del archivo es muy entendible y vale la pena echarle un vistazo para entender bien como trabaja Tripwire. También, independientemente de la distribución que tenga, encontrará que Tripwire genera muchos de los siguientes errores cuando chequea el sistema de archivos:

File system error.
Filename: XXXXXXXXXXXXX
No such file or directory
Para cada uno de esos errores hay una entrada con el nombre del archivo en el archivo de políticas, pero éste no existe en su sistema. Tendrá que editar el archivo de políticas y "comentariar" las líneas que hagan referencia a él..

Tripwire trae cuatro archivos binarios:

tripwire
El archivo principal; usado para inicializar la base de datos, chequear la integridad del sistema de archivos, actualizar la base de datos y el archivo de políticas.
twadmin
Es la herramienta de administración de Tripwire; usada para crear e imprimir los archivos de configuración, reemplazar e imprimir el archivo de políticas, generar las llaves de sitio y la local y otras funciones relacionadas con encriptación.
twprint
Usado para imprimir reportes y bases de datos en un formato entendible para los humanos.
siggen
Genera los diversos "hashes" que Tripwire soporta para el chequeo de integridad de archivos.

4. Inicializando las Llaves y la Base de Datos

En esta sección, configuraremos Tripwire con las opciones más usuales para que lo pueda usar en un chequeo de integridad del sistema. Asumo que el directorio de trabajo actual.es /etc/tripwire y que los siguientes archivos existen en las rutas especificadas:
/etc/tripwire/twcfg.txt: version en texto plano del archivo de configuración
/etc/tripwire/twpol.txt: version en texto plano del archivo de políticas

El primer paso es generar las llaves que serán usadas cuando se firme la basede datos, el archivo de políticas y el de configuración. Le será preguntada una frase clave[passphrase] para cada una de las llaves local y de sitio; debería ser mayor de 8 caracteres e incluir símbolos de puntuación así como caracteres alfanuméricos.

[root@home /etc/tripwire]# twadmin --generate-keys --site-keyfile ./site.key

(Cuando seleccione una palabra clave, tenga en cuenta que una buena opción típicamente tiene letras mayúsculas y minúsculas,
d�gitos y signos de puntuaci�n, y debe ser de al menos 8 caracteres de longitud.)

Enter the site keyfile passphrase: XXXXXXXXXXXXXXXXXX
Verify the site keyfile passphrase: XXXXXXXXXXXXXXXXXX
Generating key (this may take several minutes)...Key generation complete.

[root@home /etc/tripwire]# twadmin --generate-keys --local-keyfile ./$HOSTNAME-local.key

Enter the local keyfile passphrase: XXXXXXXXXXXXXXXXXX
Verify the local keyfile passphrase: XXXXXXXXXXXXXXXXXX
Generating key (this may take several minutes)...Key generation complete.
[root@home /etc/tripwire]#

Ahora que hemos generado nuestras llaves, necesitamos firmar los archivos de configuración y de políticas (después de haber editado lo que era necesario):

[root@home /etc/tripwire]# twadmin --create-cfgfile --cfgfile ./tw.cfg --site-keyfile ./site.key \
    twcfg.txt
Please enter your site passphrase: XXXXXXXXXXXXXXXXXX
Wrote configuration file: /etc/tripwire/tw.cfg

[root@home /etc/tripwire]# twadmin --create-polfile --cfgfile tw.cfg --site-keyfile site.key twpol.txt
Please enter your site passphrase: XXXXXXXXXXXXXXXXXX
Wrote policy file: /etc/tripwire/tw.pol
[root@home /etc/tripwire]# 
No deje las versiones en texto plano de los archivos de políticas y de configuración en su disco duro. Llévelas a un disquete o encríptelas usando algún programa como GPG. También asegúrese de que los permisos de los archivos firmados sean fijados de tal forma que sólo el root pueda leerlos o escribirlos:
[root@home /etc/tripwire]# chmod 0600 tw.cfg tw.pol

La última cosa que debemos hacer para completar la configuración es crear la base de datos inicial:

[root@home /etc/tripwire]# tripwire --init --cfgfile ./tw.cfg --polfile ./tw.pol \
    --site-keyfile ./site.key --local-keyfile ./home.barryodonovan.com-local.key
Please enter your local passphrase:
Parsing policy file: /etc/tripwire/tw.pol
Generating the database...
*** Processing Unix File System ***
Wrote database file: /var/lib/tripwire/$HOSTNAME.twd
The database was successfully generated.
[root@home /etc/tripwire]#

5. Chequeo de Integridad

Ahora que Tripwire está instalado, configurado y la base de datos inicial ha sido creada podemos entrar de lleno a lo nuestro, chequeando la integridad del sistema de archivos:
[root@home /etc/tripwire]# tripwire --check
Parsing policy file: /etc/tripwire/tw.pol
*** Processing Unix File System ***
Performing integrity check...
Wrote report file: /var/lib/tripwire/report/$HOSTNAME-20040823-210750.twr
... ... ...
Total objects scanned:  52387
Total violations found:  0

Cada violación(una adición, remoción o cambio) es reportada a la salida estándar stdout y escrita en un archivo de reporte como se señaló. En esta ocasión he asumido las ubicaciones por defecto de los archivos de configuración y de políticas. Pude haberlas especificado explícitamente en la línea de comandos con modificadores como --cfgfile, etc.

Su objetivo debería ser correr esto diariamente. Esto puede ser ejecutado como una tarea en el cron o en el Anacron, este último es la mejor opción cuando el computador no funciona 24/7 [todo el tiempo]. Usando cron o Anacron, la salida debería ser enviada por correo al root cada vez que se ejecute Tripwire.

En el caso del Anacron, cree un archivo en /etc/cron.daily/ llamado (por ejemplo) tripwire-check que contenga:

#!/bin/bash

/usr/sbin/tripwire --check

y asegúrese que tenga permisos de ejecución (chmod u+x /etc/cron.daily/tripwire-check). Si quiere usar el cron, añada la sigiuiente línea al "crontab" del usuario root para ejecutar el chequeo cada día a las 3am (crontab -e):

00 03 * * * /usr/sbin/tripwire --check

6. Actualizando la Base de Datos

Cuando algún archivo que el Tripwire monitorea cambia, debe actualizar su base de datos de tal forma que refleje la nueva información. Esto se puede hacer como parte del proceso de chequeo de integridad usando el modificador interactivo ('-I') o usando el modo de actualización de la base de datos del comando tripwire:
[root@home /etc/tripwire]# tripwire --update --twrfile /var/lib/tripwire/report/$HOSTNAME-20040823-210750.twr
    < En este momento, se le pedirá que escoja qué registros del archivo de base de datos se actualizarán>    
    < por medio del mecanismo de "cajas de selección"[ver arriba]. a menos que especifique otra cosa, vi>
    < será el editor escogido. Si no ha usado vi antes, sugiero que lo cambie a pico, nedit o cualquiera que prefiera.>
    < Adicione/Remueva las equis(x) de las  cajas de selección, guarde y sálgase>

Please enter your local passphrase: XXXXXXXXXXXXXXX
Wrote database file: /var/lib/tripwire/home.barryodonovan.com.twd
[root@home /etc/tripwire]#

Como pueda observar en la línea de comandos arriba, debe especificar el archivo de reportes que será usado cuando se actualice la base de datos. Escoja el archivo de reportes más recientemente generado. Si se encuentra que frecuentemente debe actualizar los mismos archivos poco críticos, siéntase tranquilo al actualizar el archivo de políticas para que no los tenga en cuenta.

Si se encuentra algún cambio, se le presentará un formulario con cajas de selección que deberá ser diligenciado colocando una 'x' al frente de las violaciones que se pueden actualizar en la base de datos con seguridad(por ejemplo Ud.actualizó el servidor Apache ayer y el Tripwire reporta un cambio en el binario /usr/sbin/httpd como se esperaría que lo hiciera). Si no ha cambiado nada de lo que pueda darse cuenta directamente, debería fijarse con cuidado, ya que podría indicar que alguien ha irrumpido en su sistema.

7. Actualizando las Políticas

El comando tripwire tiene un modo de actualización de políticas, lo cual significa que un cambio en las políticas no nos obliga a reinicializar la base de datos. El modo de actualización de políticas simplemente sincroniza la base de datos existente con el nuevo archivo de políticas. El nuevo archivo de políticas que se espera está en la versión de texto plano - Tripwire pedirá las frases clave local y de sitio, sincronizará la base de datos y firmará el nuevo archivo de políticas y la base de datos.
tripwire --update-policy --cfgfile ./tw.cfg --polfile ./tw.pol --site-keyfile ./site.key \
    --local-keyfile ./$HOSTNAME-local.key new_policy_file.txt

De nuevo, No debe dejar la versión en texto plano del archivo de políticas en el sistema.

8. Manteniendo Seguro Tripwire

Usar Tripwire como sistema de detección de intrusos es sólo tan seguro como efectiva sea la seguridad del mismo Tipwire. Existe un gran número de procedimientos que puede seguir para asegurar un máximo de seguridad.

El último procedimiento es algo que yo consideraría 'debe' más que 'debería' ser seguido. La base de datos de Tripwire debe estar asegurada con un chequeo de integridad lo suficientemente confiable. Si no actualiza la base de datos regularmente(como en un servidor, etc) entonces debe mantener la base de datos en un medio de almaceneamiento removible sin mucho inconveniente. Esto puede ser tan simple como dejar un disquete protegido contra escritura con la base de datos dentro, metido en la disquetera, o un CD re-escribible en un drive de CD de sólo lectura. Si la base de datos cambia, puede actualizar la que está en esos medios habilitando la opción de escritura del disquete o borrando y quemando de nuevo la base de datos en un CD-RW; pero un atacante no sería capaz de remover o alterar la base de datos de ninguna forma.

Una segunda solución sería mantener la base de datsos en otra máquina y descargarla cuando sea necesario. Esto podría ser simple usando wget para conseguir la base de datos desde un servidor web justo antes de correr el chequeo de integridad y quitándola luego. Por ejemplo, puede cambiar la rutina en el Anacron script así:

#!/bin/bash

# se pasa al directorio de la base de datos como se especifica en el archivo de configuración
cd /var/lib/tripwire

# descarga la base de datos de un directorio protegido con contraseña (.htaccess)
wget http://www.someserver.com/private/$HOSTNAME.twd --http-user=username --http-passwd=password

# ejecuta el chequeo de integridad
/usr/sbin/tripwire --check

# quita la base de datos
rm -f $HOSTNAME.twd

Puede usar scp, rsync, etc de forma similar.

9. Más Recursos

Una instalación estándar del Tripwire viene con muchas páginas de manual que proveen de toda lainformación que pudiera necesitar:

 


[BIO] Barry O'Donovan graduado de la National University of Ireland, Galway con un B.Sc. (con Honores) en ciencias de la computación y matemáticas. Actualmente está completando un Ph.D. en ciencias de la computación con el Information Hiding Laboratory, University College en Dublin, Irlanda en el área de marcas de agua en audio.

Barry ha estado utilizando Linux desde 1997 y su distribución actual es Fedora Core. Es miembro del Irish Linux Users Group. Cuando no está trabajando en su Ph.D. puede ser encontrado generalmente apoyando sus finanzas haciendo algún trabajo para Open Hosting, en el bar con sus amigos o corriendo en el parque local.

Copyright 2004, Barry O'Donovan. Publicado bajo los términos de la Open Publication license

Publicado en el número 106 de Linux Gazette, Septiembre 2004