Como antes hemos comentado, un sistema de detección de intrusos basado en
máquina (host-based IDS) es un mecanismo que permite detectar ataques
o intrusiones contra la máquina sobre la que se ejecuta.
Tradicionalmente, los modelos de detección basados en máquina han
consistido por una parte en la utilización de herramientas automáticas de
análisis de logs generados por diferentes aplicaciones o por el propio
kernel del sistema operativo, prestando siempre especial atención a los
registros relativos a demonios de red, como un servidor web o el propio
inetd, y por otra - quizás no tan habitual como la anterior - en el
uso de verificadores de integridad de determinados ficheros vitales para el
sistema, como el de contraseñas; no obstante, desde hace unos años un
tercer esquema de detección se está implantando con cierta fuerza: se
trata de los sistemas de detección, honeypots o tarros de miel.
El análisis de logs generados por el sistema (entendiendo como tales
no sólo a los relativos al núcleo, sino también a aquellos de aplicaciones
nativas de cada Unix, como syslogd) varía entre diferentes clones de
Unix por una sencilla razón: cada uno de ellos guarda la información con
un cierto formato, y en determinados ficheros, aunque todos - o casi todos -
sean capaces de registrar los mismos datos, que son aquellos que pueden ser
indicativos de un ataque. La mayor parte de Unices son capaces de registrar con
una granularidad lo suficientemente fina casi todas las actividades que se
llevan a cabo en el sistema, en especial aquellas que pueden suponer - aunque
sea remotamente - una vulneración de su seguridad; sin embargo, el problema
radica en que pocos administradores se preocupan de revisar con un mínimo
de atención esos logs, por lo que muchos ataques contra la máquina,
tanto externos como internos, y tanto fallidos como exitosos, pasan
finalmente desapercibidos. Aquí es donde entran en juego las herramientas
automáticas de análisis, como swatch o logcheck; a grandes
rasgos, realizan la misma actividad que podría ejecutar un shellscript convenientemente planificado que incluyera entre sus líneas
algunos grep de registros sospechosos en los archivos de log.
>A qué entradas de estos ficheros debemos estar atentos? Evidentemente, esto
depende de cada sistema y de lo que sea `normal' en él, aunque suelen existir
registros que en cualquier máquina denotan una actividad cuanto menos
sospechosa. Esto incluye ejecuciones fallidas o exitosas de la orden su,
peticiones no habituales al servicio SMTP (como vrfy o expn),
conexiones a diferentes puertos rechazadas por TCP Wrappers, intentos de
acceso remotos como superusuario, etc; si en la propia máquina tenemos
instalado un cortafuegos independiente del corporativo, o cualquier otro software de seguridad - uno que quizás es especialmente recomendable es
PortSentry -, también conviene estar atentos a los logs
generados por los mismos, que habitualmente se registran en los ficheros
normales de auditoría del sistema (syslog, messages...) y
que suelen contener información que con una probabilidad elevada denotan un
ataque real.
Por otra parte, la verificación de integridad de archivos se puede realizar
a diferentes
niveles, cada uno de los cuales ofrece un mayor o menor grado de seguridad. Por
ejemplo, un administrador puede programar y planificar un sencillo shellscript para que se ejecute periódicamente y compruebe el propietario y
el tamaño de ciertos ficheros como /etc/passwd o /etc/shadow;
evidentemente, este esquema es extremadamente débil, ya que si un usuario se
limita a cambiar en el archivo correspondiente su UID de 100 a 000, este modelo
no descubriría el ataque a pesar de su gravedad. Por tanto, parece obvio
que se necesita un esquema de detección mucho más robusto, que compruebe
aparte de la integridad de la información registrada en el inodo asociado a
cada fichero (fecha de última modificación, propietario, grupo
propietario...) la integridad de la información contenida en dicho archivo;
y esto se consigue muy fácilmente utilizando funciones resumen sobre cada
uno de los ficheros a monitorizar, funciones capaces de generar un hash
único para cada contenido de los archivos. De esta forma, cualquier
modificación en su contenido generará un resumen diferente, que al ser
comparado con el original dará la voz de alarma; esta es la forma de trabajar
de Tripwire, el más conocido y utilizado de todos los verificadores de
integridad disponibles para entornos Unix.
Sea cual sea nuestro modelo de verificación, en cualquiera de ellos debemos
llevar a cabo inicialmente un paso común: generar una base de datos de
referencia contra la que posteriormente compararemos la información de cada
archivo. Por ejemplo, si nos limitamos a comprobar el tamaño de ciertos
ficheros debemos, nada más configurar el sistema, registrar todos los nombres
y tamaños de los ficheros que deseemos, para después comparar la
información que periódicamente registraremos en nuestra máquina con la
que hemos almacenado en dicha base de datos; si existen diferencias, podemos
encontrarnos ante un indicio de ataque. Lo mismo sucederá si registramos
funciones resumen: debemos generar un hash inicial de cada archivo contra
el que comparar después la información obtenida en la máquina.
Independientemente de los contenidos que deseemos registrar en esa base de datos
inicial, siempre hemos de tener presente una cosa: si un pirata consigue
modificarla de forma no autorizada, habrá burlado por completo a nuestro
sistema de verificación. Así, es vital mantener su integridad;
incluso es recomendable utilizar medios de sólo lectura, como un CD-ROM, o
incluso unidades extraíbles - discos o disquetes - que habitualmente no
estarán disponibles en el sistema, y sólo se utilizarán cuando tengamos
que comprobar la integridad de los archivos de la máquina.
Por último, aunque su utilización no esté tan extendida como la de los
analizadores de logs o la de los verificadores de integridad, es necesario
hablar, dentro de la categoría de los sistemas de detección de intrusos
basados en máquina, de los sistemas de decepción o honeypots.
Básicamente, estos `tarros de miel' son sistemas completos o parte de los
mismos (aplicaciones, servicios, subentornos...) diseñados para recibir
ciertos tipos de ataques; cuando sufren uno, los honeypots detectan la
actividad hostil y aplican una estrategia de respuesta. Dicha estrategia puede
consistir desde un simple correo electrónico al responsable de la seguridad
de la máquina hasta un bloqueo automático de la dirección atacante;
incluso muchos de los sistemas - la mayoría - son capaces de simular
vulnerabilidades conocidas de forma que el atacante piense que ha tenido
éxito y prosiga con su actividad, mientras es monitorizado por el detector de
intrusos.
El concepto teórico que está detrás de los tarros de miel es el
denominado `conocimiento negativo': proporcionar deliveradamente a un
intruso
información falsa - pero que él considerará real - de nuestros sistemas,
con diferentes fines: desde poder monitorizar durante más tiempo sus
actividades, hasta despistarlo, pasando por supuesto por la simple
diversión. Evidentemente, para lograr engañar a un pirata medianamente
experimentado la simulación de vulnerabilidades ha de ser muy `real',
dedicando a tal efecto incluso sistemas completos (denominados 'máquinas de
sacrificio'), pero con atacantes de nivel medio o bajo dicho engaño es
muchísimo más sencillo: en muchos casos basta simular la existencia de
un troyano como BackOrifice mediante FakeBO (http://cvs.linux.hr/fakebo/) para que el pirata determine que realmente
estamos infectados e intente utilizar ese camino en su ataque contra nuestro
sistema.
Algunos sistemas de decepción no simulan vulnerabilidades tal y como
habitualmente se suele entender este concepto; dicho de otra forma, su objetivo
no es engañar a un atacante durante mucho tiempo, proporcionándole un
subentorno en el sistema que aparente de forma muy realista ser algo vulnerable,
sino que su `decepción' es bastante más elemental: se limitan a presentar
un aspecto (quizás deberíamos llamarle interfaz) que parece
vulnerable, pero que cualquier aprendiz de pirata puede descubrir sin problemas
que no es más que un engaño. >Dónde está entonces la función de estos
sistemas, denominados en ocasiones `detectores de pruebas'? Por norma, su tarea
es recopilar información del atacante y del
ataque en sí; por ejemplo, ya que antes hemos hablado de FakeBO,
podemos imaginar un programa que se encargue de escuchar en el puerto 31337 de
nuestro sistema - donde lo hace el troyano real - y, cada vez que alguien
acceda a él, guardar
la hora, la dirección origen, y los datos enviados por el atacante. En
realidad, no es una simulación que pueda engañar ni al pirata más novato,
pero hemos logrado el objetivo de cualquier sistema de detección de intrusos:
registrar el ataque; además, también se puede considerar un honeypot,
ya que simula un entorno vulnerable, aunque sólo logre engañar a nuestro
atacante durante unos segundos. De cualquier forma, es necesario indicar que
en algunas publicaciones (como [Gra00]) se diferencia a los sistemas de
decepción `completos'
de estos mecanismos de engaño simple, aunque a todos se les englobe dentro
del conjunto denominado honeypots.
Hemos revisado en este punto las ideas más generales de los sistemas de
detección de intrusos basados en host; aunque hoy en día los que
vamos a describir a continuación, los basados en red, son con diferencia los
más utilizados, como veremos más adelante todos son igualmente
necesarios
si deseamos crear un esquema de detección con la máxima efectividad. Se
trata de niveles de protección diferentes pero que tienen un mismo objetivo:
alertar de actividades sospechosas y, en algunos casos, proporcionar una
respuesta automática a las mismas.
© 2002 Antonio Villalón Huerta