Guía breve Tripwire

Abstract

Esta es una guía breve para utilizar Tripwire en Linux. Se desarrolló en ambiente RedHat 7.1; sin embargo, debe ser útil en cualquier otro OS compatible.


Tabla de contenidos
Introducción
Configuración de Tripwire
Configuración permanente de Tripwire
Eliminación de archivos de texto
Script check_twpol.sh

Introducción

¿Por qué usar Tripwire?

Para mejorar la seguridad de su sistema.

No existen los sistemas computacionales perfectos e invulnerables que desearíamos, y siempre estaremos expuestos a ataques. Más allá de todas las medidas preventivas que tomemos (firewalls, patches, políticas, etc.) siempre cabe la posibilidad de ser alcanzados por un hacker. Los ataques exitosos a través de la red típicamente involucran la modificación parcial del sistema mediante la alteración o reemplazo de ciertos archivos, lo cual suele ser empleado por el atacante para posteriormente tomar el control total del sistema.

Tripwire asume que todos los controles de seguridad han fallado, y que nuestro sistema ya ha sido alterado; al menos, parcialmente. Sin embargo, parte del arte de los atacantes consiste en no ser descubiertos, y para esto emplean diversas técnicas relativamente sofisticadas. Tripwire servirá para alertar al administrador de estos cambios (los cuales de otro modo podrían pasar desapercibidos por semanas o meses) a fin de tomar acciones con rapidez.

Para esto, Tripwire monitorea rutinariamente la integridad de una gran cantidad de archivos que tienden a ser blanco de los atacantes. Sin embargo, este proceso es pesado, y se suele ejecutar a intervalos; por ejemplo, diarios o interdiarios, aunque no hay ninguna restricción (salvo de recursos) para no lanzarlo cada media hora.


Instalar Tripwire

Descargue la versión open source de Tripwire del site www.tripwire.org. Elija la versión que corresponda mejor a su sistema operativo.

Tripwire normalmente se distribuye en un archivo RPM que viene empacado en formato TAR comprimido. En este último caso, usar:

# tar xvzf tripwire.tar.gz
Lo cual debería generar el archivo tripwire-2.3-47.i386.rpm (el nombre exacto dependerá de su versión.)

Ahora instálelo:

# rpm -ivh tripwire-2.3-47.i386.rpm

Nota: En diversas distribuciones de Linux, incluyendo RedHat 7.2 y superiores, Tripwire ya está instalado, razón por la cual este paso puede no ser necesario.


Configuración de Tripwire

Definir las claves de Tripwire

Tripwire utiliza dos claves (que pueden ser palabras u oraciones) para almacenar su información. Una de ellas, la "site key" o "clave del site", se emplea para encriptar los archivos de configuración y de las políticas. La otra - la "local key" o "clave local", se usa para encriptar la información referida al estado de los archivos del sistema que se monitorean.

Ud. necesita estas dos claves para las tareas de administración de Tripwire. Estas se deben introducir tan pronto como se ha instalado Tripwire mediante el comando:

# /etc/tripwire/twinstall.sh
Recuérdelas bien, o anótelas en un lugar seguro.


Configurar el archivo de políticas

La configuración de los archivos que van a ser monitoreados por Tripwire se mantiene en un gran archivo conocido como "archivo de políticas" (policy file.) Su manipulación es algo tediosa dada su extensión. Tripwire viene con un archivo que sirve de "plantilla" para ser modificado. Este archivo es: /etc/tripwire/twpol.txt.

Ud. puede modificarlo directamente con un editor de texto (aunque le aconsejo que guarde una copia sin modificar del mismo.)

Ahora haremos una observación de órden práctico y didáctico: Tripwire por lo general toma varios minutos en cada una de sus ejecuciones, y si Ud. nunca lo ha usado, probablemente le resultará desesperante aguardar mucho tiempo sin saber si las cosas están yendo bien o mal. Por este motivo yo sugiero que empecemos con una versión reducida (y casi inútil) del archivo de políticas. Una vez que Ud. comprenda el proceso completo, podrá retomar el archivo original y aprovecharlo.

Nuevamente va la advertencia: haga una copia de seguridad del archivo twpol.txt.

Para recortar el archivo proporcionado, simplemente use un editor de texto (como vi) y busque la sección "File System and Disk Administraton Programs" (que en el archivo que yo tengo, se ubica a partir de la línea 185.) Un extracto de esa sección es presentado aquí:

...
################################################ #
# File System and Disk Administration Programs # #
################################################
(
  rulename = "File System and Disk Administraton Programs",
  severity = $(SIG_HI)
)
{
  /sbin/accton                         -> $(SEC_CRIT) ;
  /sbin/badblocks                      -> $(SEC_CRIT) ;
  /sbin/dosfsck                        -> $(SEC_CRIT) ;
  /sbin/e2fsck                         -> $(SEC_CRIT) ;
  /sbin/debugfs                        -> $(SEC_CRIT) ;
  /sbin/dumpe2fs                       -> $(SEC_CRIT) ;
  /sbin/dump                           -> $(SEC_CRIT) ;
...
Como Ud. ya se imaginará, esto corresponde a un conjunto de archivos que se monitorean por Tripwire. Nosotros reduciremos la extensa lista recortando el archivo en esta sección. Por ejemplo, haciendo que termine en /sbin/e2fsck:
...
################################################ #
# File System and Disk Administration Programs # #
################################################
(
  rulename = "File System and Disk Administraton Programs",
  severity = $(SIG_HI)
)
{
  /sbin/accton                         -> $(SEC_CRIT) ;
  /sbin/badblocks                      -> $(SEC_CRIT) ;
  /sbin/dosfsck                        -> $(SEC_CRIT) ;
  /sbin/e2fsck                         -> $(SEC_CRIT) ;
}
# AHORA AQUI TERMINA EL ARCHIVO. OBSERVE LA LLAVE DE CIERRE.
Como se ve, hemos recortado la parte que estaba más abajo de /sbin/e2fsck, y hemos tenido cuidado de añadir una llave de cierre (}) para mantener la sintaxis del archivo. A fin de ver los posibles errores con que nos podemos encontrar, sugiero al lector que añada un archivo inexistente a la lista:
...
################################################ #
# File System and Disk Administration Programs # #
################################################
(
  rulename = "File System and Disk Administraton Programs",
  severity = $(SIG_HI)
)
{
  /sbin/accton                         -> $(SEC_CRIT) ;
  /sbin/badblocks                      -> $(SEC_CRIT) ;
  /sbin/dosfsck                        -> $(SEC_CRIT) ;
  /sbin/e2fsck                         -> $(SEC_CRIT) ;

# ARCHIVO DE PRUEBA INEXISTENTE AÑADIDO. OBSERVE QUE ESTA
# UBICADO ANTES DE LA LLAVE DE CIERRE
  /sbin/lechuga                        -> $(SEC_CRIT) ;
}
# AHORA AQUI TERMINA EL ARCHIVO
Tenga cuidado de no insertar este archivo por debajo de la llave de cierre del grupo. Recuerde que más tarde deberá vérselas con el archivo original que contiene (en mi caso) 452 entradas.


Instalar el archivo de políticas

Cuando el archivo de políticas contiene todo lo que pretendemos monitorear, es menester "instalarlo". En realidad Tripwire usa una versión compilada y encriptada de este archivo, que se almacena en /etc/tripwire/tw.pol. Para generarlo (y regenerarlo cuantas veces se necesite), usar:

# twadmin -m P /etc/tripwire/twpol.txt


Construir la base de datos Tripwire

Una vez configurado e instalado el archivo de políticas, Tripwire necesita recolectar la información actual de los archivos que debe monitorear. Dicha información se almacena en una base de datos especial generada mediante el comando:

# tripwire -m i 2> /tmp/mensajes
Hemos redirigido parte de la salida de este comando al archivo /tmp/mensajes. Es muy probable que hayan archivos especificados en las políticas (twpol.txt) que no existen o están incorrectamente escritos (como lechuga.) Esto quedará registrado en /tmp/mensajes. Los errores deberán corregirse en twpol.txt, el cual se deberá reinstalar, para proceder a reconstruir la base de datos Tripwire. Este procedimiento se repetirá mientras subsistan errores en el archivo de políticas.

Borre el archivo /tmp/mensajes cuando hayan desaparecido todos los errores.


Verificación del filesystem

Ahora que Tripwire está correctamente configurado con su base de datos, es el momento de verificar la integridad del filesystem. Esto se consigue con el comando:

# tripwire -m c
Este comando se usará cada vez que deseamos saber que nuestro sistema no ha sido alterado.

Si por algún motivo algunos de los archivos monitoreados son modificados (por ejemplo, por una actualización en el software) entonces debemos reconstruir la base de datos como se vió en el paso anterior, a fin de que no aparezcan discrepancias con el estado actual del filesystem en las próximas verificaciones.

Si deseamos dejar de monitorear ciertos archivos o iniciar el monitoreo de otros, entonces debemos configurar el archivo de políticas (twpol.txt) como se vió anteriormente, y reinstalarlo. Después, se volverá a generar la base de datos del filesystem. Este proceso lamentablemente puede ser muy tedioso cuando hay muchos archivos por monitorear.


Configuración permanente de Tripwire

Automatización

Ahora que Ud. ha probado la correcta ejecución de Tripwire, debemos programar su ejecución automática. Se aconseja una frecuencia diaria, aunque el administrador es libre de usar otro esquema. En RedHat 7.1, la ejecución diaria de tripwire se efectúa fácilmente creando un archivo en el directorio /etc/cron.daily (por ejemplo, /etc/cron.daily/tripwire con el siguiente contenido:

/usr/sbin/tripwire -m c | mail root@localhost
Donde Ud. deberá modificar la dirección "root@localhost" por lo que más le convenga. No olvide asegurarse de que el servicio cron esté operativo.

Asegúrese de que este archivo para cron sea ejecutable:

# chmod 755 /etc/cron.daily/tripwire


Notificación vía email

Esta funcionalidad proporciona un control más flexible con respecto a los reportes vía email. Tripwire es capaz de notificar por email sin necesidad de que el administrador invoque a un cliente de correo como en el ejemplo anterior (en que invocamos a mail. Para esto, en el archivo de políticas debemos insertar la directiva:

emailto = user@host.domain
Esta directiva debe insertarse en la configuración de cada grupo de archivos que vamos a monitorear. Cuando alguno de estos archivos es modificado, Tripwire notifica al destinatario especificado. Por ejemplo, si queremos ser alertados cuando hubieren modificaciones de los archivos de administración del kernel, debemos modificar la sección correspondiente:
...
# Kernel Administration Programs # #
(
  rulename = "Kernel Administration Programs",
  severity = $(SIG_HI)
)
{
  /sbin/depmod                         -> $(SEC_CRIT) ;
  /sbin/adjtimex                       -> $(SEC_CRIT) ;
  /sbin/ctrlaltdel                     -> $(SEC_CRIT) ;
  /sbin/insmod                         -> $(SEC_CRIT) ;
...
e insertar emailto:
...
# Kernel Administration Programs # #
(
  rulename = "Kernel Administration Programs",
  severity = $(SIG_HI), emailto = root@localhost
)
{
  /sbin/depmod                         -> $(SEC_CRIT) ;
  /sbin/adjtimex                       -> $(SEC_CRIT) ;
  /sbin/ctrlaltdel                     -> $(SEC_CRIT) ;
  /sbin/insmod                         -> $(SEC_CRIT) ;
...
Tripwire normalmente invoca para esto a sendmail.

Si Ud. usa vi, puede insertar automáticamente la directiva emailto en todas las secciones del archivo con el siguiente comando "de última línea":

:1,$s/severity =.*/&,emailto = root@localhost/
Asegúrese de respetar todos los espacios y los signos de puntuación.

Finalmente, el archivo /etc/cron.daily/tripwire debe ser modificado del siguiente modo:

/usr/sbin/tripwire -m c --email-report

El archivo de configuración twcfg.txt contiene algunos parámetros adicionales para la configuración del sistema de notificación de email. Por ejemplo, es posible configurar si se deben enviar reportes aún si no han habido problemas (ver directiva MAILNOVIOLATIONS de twcfg.txt.) También se puede seleccionar el agente de mensajería (ver directiva MAILPROGRAM) a fin de no usar sendmail y generar una conexión directa SMTP hacia otro host.

Consulte el manual de twconfig(4) y twpolicy(4) para más opciones y ejemplos.


Eliminación de archivos de texto

Tripwire guarda su configuración y la política del filesystem en dos archivos encriptados con la "clave del site". Estos son: /etc/tripwire/tw.cfg y /etc/tripwire/tw.pol, respectivamente. El primero se generó a partir de /etc/tripwire/twcfg.txt cuando se configuraron las claves, y el segundo ha sido regenerado cada vez que Ud. modificó su archivo de políticas /etc/tripwire/twpol.txt. Por seguridad, Ud. no debería mantenerlos en el sistema hasta que se vuelvan a necesitar, así que proceda a borrarlos:

# rm /etc/tripwire/twcfg.txt /etc/tripwire/twpol.txt
Cuando Ud. necesite hacer una modificación de la política, puede regenerar el archivo twpol.txt del siguiente modo:
# twadmin -m p > /etc/tripwire/twpol.txt
Y el de configuración mediante:
# twadmin -m f > /etc/tripwire/twcfg.txt


Script check_twpol.sh

Tal como se indicó, eventualmente Ud. deberá emplear el archivo twpol.txt que viene con tripwire, el cual contiene numerosas referencias a los archivos del sistema. Sin embargo, este archivo en casi todos los casos deberá personalizarse puesto que no todos los sistemas tienen instalados los mismos archivos.

A fin de agilizar este proceso (que es tremendamente tedioso), confeccioné el siguiente script que genera una versión "corregida" del twpol.txt contrastándo el original contra lo que se encuentra en el sistema. Este script NO modifica el archivo twpol.txt, sino por el contrario, deja la "nueva versión" en /tmp/new.twpol.txt.

Para ejecutarlo, simplemente escribir:

# bash check_twpol.sh
El script de preferencia deberá ser descargado y no copiado manualmente (debe estar disponible junto con este documento o en mi web site) a fin de evitar sutiles errores entre espacios y tabulados. De igual modo, ahí va:

#!/bin/bash
#
# Generacion de version corregida de archivo de politicas twpol.txt
# (C) 2002-4002 Diego (www.compulinux.com/diego)
#
# Por favor verifique estas variables:
# Please cheack these veriables:

# Original twpol.txt
TWPOL=/etc/tripwire/twpol.txt

# Donde buscar nuevos archivos
# Where to search for new files
SRC_DIR="/sbin /etc /etc/sysconfig /bin"

# El twpol.txt generado
# Generated twpol.txt
RESULTADO=/tmp/new.twpol.txt

### END OF COMMENTS

if [ ! -f $TWPOL ]; then
	echo "$TWPOL debe existir para poder empezar!"
	echo "$TWPOL must exist for running this thing!"
	exit
fi

echo "Quitando archivos inexistentes de twpol.txt"
echo "Cutting non-existent files from twpol.txt"
while read L
do
# Cuidado: entre corchetes se escribe un espacio y un tab (3 lineas abajo)
# Beware: between brackets there is a space and a tab (following 3 lines)
if echo "$L" | grep '^[ 	]*/' > /dev/null ; then
	PX=$(echo "$L" | sed 's/^[ 	]*\([^ 	]*\).*/\1/')
	PY=$(echo "$L" | sed 's/^[ 	]*\([^ 	]*\)\(.*\)/\2/')
	if [ -e "$PX" ]; then
		echo "$PX $PY"
	else
		echo "#-- $PX $PY"
		echo -n '.' > /dev/tty
		# echo $PX > /dev/tty
	fi
else
	echo "$L"
fi

done < $TWPOL > $RESULTADO

echo
echo "Insertando nuevos archivos en twpol.txt"
echo "Inserting new files to twpol.txt"

for DIR in $SRC_DIR
do
echo "#-- "
echo "#-- "
echo "#-- "
echo "("
echo "rulename = \"$DIR\","
echo 'severity = $(SIG_HI)'
echo ")"
echo "{"
	echo > /dev/tty
	echo "Procesando $DIR" > /dev/tty
	echo "Processing $DIR" > /dev/tty
	for F in $DIR/*
	do
# Cuidado: entre corchetes se escribe un espacio y un tab (siguiente linea)
# Beware: between brackets there is a space and a tab (next linea)
		if [ -f $F ] && ! grep  "^[ 	]*$F[ 	]" $RESULTADO > /dev/null ; then
			echo "	$F		-> \$(SEC_CRIT) ;"
			echo -n "." > /dev/tty
		fi
	done
echo "}"
done >> $RESULTADO
echo
echo "El nuevo archivo twpol.txt se ha generado en $RESULTADO"
echo "New twpol.txt file was generated as $RESULTADO"