Tutorial de Tripwire Tripwire Es un monitor de la integridad de los sistemas* Unix. Este usa varias rutinas de checksum/mensaje, huella/segura y hash/firma para detectar cambios en archivos, además de rastrear determinados campos seleccionados de la administración del sistema. Introducción • Creador En 1993, Gene Kim y Eugene Spafford trabajando en el Laboratorio COAST de la Universidad de Purdue desarrollaron el concepto de software Tripwire que podía ayudar a detectar cambios en la estructura de los archivos o directorios gracias al uso de algoritmos de firmas. Cada resultado inesperado puede ser investigado para determinar si el cambio fue provocado maliciosamente o accidentalmente. La tecnología de firma digital es utilizada hoy en día en muchos aspectos de la seguridad informática, incluyendo pruebas de identidad, autentificación, autorización, integridad y no repudio. • ¿Qué problemas intenta resolver? Integridad de los sistemas UNIX. Descripción • ¿Qué es? Es un monitor de la integridad de los sistemas* Unix. Este usa varias rutinas de checksum/mensaje, huella/seg y hash/firma para detectar cambios en archivos, además de rastrear determinados campos seleccionados de la administración del sistema. • ¿Para qué sirve? El sistema tripwire persigue los objetivos de rastrear: ♦ Cambios en los permisos de los archivos. ♦ Ligas. ♦ Tamaños en archivos y directorios ♦ Groupid, userid. Versiones • Última versión ♦ Para Unix: Versión 1.2 ♦ Para Linux: Versión 1.3 • ¿Dónde obtenerlo? Hay varios lugares donde podemos obtener Tripwire: Para Unix. (Versión 1.2) ftp://ftp.asc.unam.mx/Herramientas/Unix/Monitor_Sistema/Tripwire/Tripwire−1.3.1−1.tar.gz 1 Tutorial de Tripwire Para Linux. (Versión 1.3) ftp://ftp.asc.unam.mx/Herramientas/Unix/Monitor_Sistema/Tripwire/tripwire.i386.tar.gz Nota: En cualquiera de estos caso se obtiene acceso por anonymous. • Versiones de Tripwire RPM y Código Fuente Después de obtener el paquete es necesario desempaquetarlo, utilizando los comandos tar y gunzip en el caso un sistema Unix. (Versión Unix) $gunzip tripwire.tar.gz $tar −xvf tripwire.tar Para el caso de Sistemas Linux debe obtenerse la versión para Red Hat, que se viene incluida en el CD de Re Hat, en este caso el paquete esta constituído por: ♦ Tripwire−1.3−1.i386.rpm ♦ Tripwire−1.3−1.src.rpm Después de obtener el paquete tripwire.i386.tar.gz, se procede a desempaquetarlo: $gunzip tripwire.i386.tar.gz $tar −xvf tripwire.i386.tar Esto desempaqueta los siguientes archivos: ♦ tripwire−1.3−1.i386.rpm ♦ tripwire−1.3−1.scr.rpm Configuración • Configuración del archivo tw.config Editar el archivo tw.config para optimizar la tabla de archivos y directorios que deseamos barrer y mantener su configuración: Existe una serie de banderas directivas que se utilizan para organizar la forma en que se obtendrán las firmas d sistema. Formato: [!|=] entry [banderas] donde: '!' Significa que entry debe será excluído de la lista de archivos a verificar. 2 Tutorial de Tripwire '=' Significa que entry será añadida, pero si este es un directorio, entonces todo su contenido será excluído. entry Es la ruta absoluta de un directorio o archivo. banderas [+|−][pinugsam123456789] > Los cambios de archivo son ignorados siempre y cuando el archivo es más pequeño que el almacenado. − Ignora los siguientes atributos. + Habilita los siguientes atributos. ♦ p: bits de permisos y modo de archivos. ♦ a: timestamp de acceso. ♦ i: número de inodo. ♦ m: timestamp de modificación. ♦ n: número de ligas (count). ♦ c: timestamp de creación. ♦ u: user id del propietario. ♦ g: group id del propietario. ♦ s: tamaño del archivo NOTA: hay 9 firmas activas en tripwire 1.3 a diferencia de las 2 que hay activas en 1.2 0: Firma Null 2: Firma Snefru 4: Firma CRC−16 6: Firma MD2. 8: Firma Haval. 1: Firma MD5 3: Firma CRC−32 5: Firma MD4 7: Firma SHA. 9: Firma Null. Ejemplo: La siguiente entrada rastreará todos los archivos del directorio /etc, y reportará los cambios en permisos, en el número de inodo, el número de ligas, uid, gid, timestamp de creación y modificación, y firmará con MD5, y Snefru, ignorando cualquier cambio en el tiempo de acceso. /etc +pinugsm12−a Se han generado patrones predefinidos que hacen innecesario el uso de la forma larga, estos patrones son: R L N E [R]ead−only (+pinugsm12−a) [L]og file (+pinug−sam12) ignore [N]othing (+pinugsam12) ignore [E]verithing (−pinugsam12) Por default, Tripwire usa el patron R. • Gramática de tw.config 3 Tutorial de Tripwire La gramática empleada en tw.config es muy parecida a la empleada en el preprocesador de C, cada regla empleada en este archivo es ratificada en tiempo de ejecución esto proporciona la posibilidad de incluir mayor número de reglas según nuestras necesidades y el sistema que administramos. El preprocesamiento de Tripwire fue incluído para aquellos casos en los cuales se tienen un gran número de máquinas, permitiendo al administrador de los sistemas reusar el tw.config, configurandolo para uno u otro ca según los componentes del sistema. @@ifhost HOSTNAME @@ifnhost HOSTNAME @@else @@define VAR STRING @@undef VAR @@ifdef VAR @@ifndef VAR @@endif @@include "PATH" @@ifndef VAR @@endif @@include "PATH" @@{VAR} Las reglas que se encuentren entre esta directiva y @@endif serán utilizadas para esta máquina. Debe usarse el nombre exacto que el comando uname(1) o hostname(1) retornen. Por ejemplo: @@ifhost tutor.asc.unam.mx Incluye las reglas entre esta directiva y @@endif. Suministra la estructura if−else. Define variable VAR como STRING.Si el valor no es asignado, entonces nulo será asignado a VAR. Elimina la definición asociada a la variable VAR. Incluye las reglas desde este punto hasta la directiva @@endif o @@else si la variable VAR ha sido definida. Incluye las reglas desde esta directiva hasta la directiva @@endif o @@else si la variable VAR no ha sido definida. Cierra la estructura @@ifhosts, @@ifnhosts, ifdef, y @@ifndef. Obtiene datos desde el archivo PATH. Incluye las reglas desde esta directiva hasta la directiva @@endif o @@else si la variable VAR no ha sido definida. Cierra la estructura @@ifhosts,@@ifnhosts, ifdef, y @@ifndef. Obtiene datos desde el archivo PATH. @@VAR Sustituye la definición de VAR por el valor de VAR. Substituye la definición de VAR por el valor de VAR. Ejemplo: @@ifhost tutor.asc.unam.edu.mx /etc/tw.log.mentor R 4 Tutorial de Tripwire @@endif @@define ARCHIVE R /etc/tw.log @@ARCHIVE Personalizar la base de datos y configuración del mismo Existen distintos tipos de configuración según el sistema operativo, estos archivos están optimizados para cada sistema operativo. a) Copiar del directorio /path/to/tripwire−1.2/config/ el archivo tw.conf. a la ruta que se definio dentro del config.h. ejemplo: $cp /path/to/tripwire−1.2/configs/tw.conf.linux /path/to/tripwire−1.2/tw.config b) Editar el archivo tw.config optimizar la tabla de archivos y directorios que deseamos mantener su configuración: Existe una serie de banderas directivas que se utilizan para organizar la forma en que se obtendrán las firmas d sistema. Instalación Instalación con RPM sobre Linux RedHat Instalando "Tripwire−1.3−1.i386.rpm" usando el comando rpm Utilizando este paquete rpm obtendremos una instalación de los binarios de tripwire y el archivo de configuración tw.config. Esto es suficiente para comenzar a utilizar tripwire. Con esto nos saltamos el tema "como compilar Tripwire para linux". Sin embargo esto limitará la configuración del Tripwire, si deseamos obtener mayor flexibilidad (modificar la ruta de base de datos de Tripwire, o cambiar la máscara por default) entonces necesitamos instalar el código fuente y configurarlo para nuestras necesidades y compilarlo. Ejecutar los siguientes comandos según necesitemos los binarios o recompilar los fuentes. (Instalación de los binarios de Tripwire) $rpm −ivh tripwire−1.3−1.i386.rpm (Instalación del código fuente de Tripwire) $rpm −ivh tripwire−1.3−1.src.rpm Nota: Para poder instalar adecuadamente los binarios es necesario que el usuario tenga la cuenta de root. 5 Tutorial de Tripwire Localización por Default Los archivos de configuración se especifican en el código fuente. Así que si llegara a necesitarse personalizar estas rut será necesario configurar estas directivas y compilar nuevamente Tripwire. Los archivos de configuración asi como los binarios de Tripwire los encontraremos en: /usr/local/bin/tw El archivo de base de datos se localizará en: /var/tripwire El contenido de este directorio incluye: /usr/local/bin/tw tripwire siggen twdb_check.pl tw.config Instalación con código fuente El ejecutable de Tripwire. Utilería generadora de firmas. Script perl de verificación de corrupción en la base de datos. Reglas de Tripwire. El siguiente método de compilación es válido para cualquier sistema Unix, en el caso de instalar la versión 1.2 sobre linux, es necesario aplicar una serie de parches sobre el código fuente, esta excepción se puede manejar fácilmente. a) Obtener los siguientes archivos desde la dirección : ftp.seguridad.unam.mx • patch2tripwire.tar.gz (Requerido solo para linux Redhat.) • tripwire.tar.gz b) Desempaquetar estos archivos. Utilizar el comando gunzip. $gunzip patch_tripwire.tar.gz tripwire.tar.gz b.2.) Utilizar el comando tar. $tar tripwire.tar b.3) (Solo para linux) Mover el archivo de los parches al directorio generado por el comando anterior, entrar al directo tripwire−1.2, mediante el comando tar desempaquetar los parches. $mv patch_tripwire.tar tripwire−1.2 $cd tripwire−1.2 6 Tutorial de Tripwire $tar −xvf patch_tripwire.tar El paquete de parches generados son: tripwire−1.2−latin1.patch tripwire−1.2−rewind.patch tripwire−1.2−rhlinux.patch b.4) (Solo para linux) Aplicar los parches a los archivos fuentes de Tripwire. Para realizar esto es necesario que el sistema cuente con la utileria patch 2.5 y aplicar la siguiente secuencia de comandos: $patch −p1 −b tripwire−1.2−rhlinux.patch $patch −p1 −b tripwire−1.2−rewind.patch $patch −p1 −b tripwire−1.2−latin.patch c) Es importante obtener los siguientes datos: Ejemplo: • plataforma: i386,alpha • sistema operativo: Linux, SunOs 2.5 • $uname −a Linux localhost.localdomain 2.2.9−1 #1 dom may 30 13:57:45 CDT 1999 i486 unknown Ya que contamos con estos datos, dentro del directorio tripwire−1.2 editamos el archivo Ported, este archivo contiene información para optimizar la compilación para cada plataforma así como las observaciones necesarias para cada siste operativo. $vi Ported Buscamos el sistema operativo así como la plataforma que utilizamos, por ejemplo: /linux En el caso de utilizar linux para PC las líneas más adecuadas serán. vendor: os: os version: compiler: cflags: ldflags: libs: several (386/25 PC) linux 0.99.14 gcc −O 7 Tutorial de Tripwire conf.h: tw.config: notes: contributor: conf−linux.h (the system default) tw.linux CC=gcc YACC=bison −y FLEX=flex Cal Page Esta información quiere decir: Que tripwire fue portado para linux versión 0.99.14, optimizado para el compilador gcc con la bandera −O, el archivo configuración conf−linux.h, con el archivo de configuración de la base de datos, el sistema debe tener los binarios de g bison y flex. Tomar nota de estos valores. d) Realizar los cambios necesarios a los binarios según la información obtenida anteriormente. d.1)Editar el archivo Makefile que se encuentra en tripwire−1.2 $vi Makefile LEX = lex #LEX = flex # For the GNU crowd Buscar la directiva YACC y habilitar la más adecuada para nuestro sistema. YACC = yacc #YACC = bison −y # For the GNU crowd Buscar la directiva del compilador CC y habilitar la línea necesaria. CC = gcc # common #CC = gcc # also common Buscar la directiva de banderas de compilación y habilitar la línea adecuada. CFLAGS=$(RPM_OPT_FLAGS) #CFLAGS = −O # common #CFLAGS = −g # common #CFLAGS = −g # debugging #CFLAGS = −O −cckr # SGI d.2) La instalación de Tripwire se realiza sobre una par de rutas sobre default, para modificar estas rutas dentro del archivo Makefile, buscar las directivas DESTDIR (Directorio destino de binarios por default /usr/sbin) 8 Tutorial de Tripwire MANDIR (Directorio destino de manuales por default /usr/man) DESTDIR = /usr/sbin MANDIR = /usr/man Salvar los cambios realizados a Makefile d.3) Otro archivo que es necesario configurar es config.h que se localiza en tripwire−1.2/include dentro de este archivo hay que incluir la ruta al archivo de configuración del sistema operativo, por default el archivo de configuración es conf−svr4.h #include "../configs/conf−svr4.h" Por ejemplo si nuestro sistema en linux el archivo de configuración que recomienda Tripwire es conf−linux.h, entonce la línea debe quedar: #include "../configs/conf−linux.h" Salvar los cambios en include/config.h e) Por default la base de datos es colocada en /tmp/genek, asi tambiéen el archivo de configuración. Se recomienda qu estos directorios estén montados sobre algún medio magnético portátil por ejemplo un mini disco o una partición importada de otra máquina, de esta forma evitamos un ataque a la base de datos. Para modificar esta ruta debe editarse el archivo tripwire−1.2/include/config.h y buscar las líneas de definición: #define CONFIG_PATH "/tmp/genek" #define DATABASE_PATH "/tmp/genek" CONFIG_PATH Ruta al archivo tw.config. DATABASE_PATH Ruta para la base de datos. Por ejemplo si queremos que las rutas apunten al directorio /mnt/floppy, entonces las definiciones quedan como sigue: #define CONFIG_PATH "/mnt/floppy" #define DATABASE_PATH "/mnt/floppy" Salvar los cambios realizados a config.h F) Ejecutar make. $make El sistema de compilación del sistema generará los binarios de Tripwire. Operación 9 Tutorial de Tripwire • Binarios básicos de Tripwire La Utilería siggen Esta utilería provee a los usuarios la capacidad para obtener las firmas de los archivos sin la necesidad de ejecutar Tripwire. La sintaxis de siggen es: siggen [−01234567989aqv] [−h] [file ...] sig 0: nullsig sig 1: md5 sig 2: snefru sig 3: crc32 sig 4: crc16 sig 5: md4 sig 6: md2 sig 7: sha sig 8: haval sig 9: nullsig Donde: −h : Muestra salida en hexadecimal. file: Archivo a obtener firmar. Ejemplo: $siggen −h tw.config • Modos de Ejecución de Tripwire Generación de la base de datos Para obtener por primera vez la base de datos se requiere realizar los siguiente: a) Conmutar al modo singler user, esto para evitar tener acceso por parte de otros usuarios al sistema. # shutdown now −r b) Opcionalmente dentro del modo singler−user reinstalar los binarios del sistema. c) Ejecutar tripwire en modo Generación de la base de datos. # /usr/local/bin/tw/tripwire −initialize Recomendaciones sobre la base de datos ♦ La base de datos debe ser movida sobre algún medio donde no pueda ser modificada fácilmente. ♦ utilizar un disco en modo de solo lectura. ♦ exportar la base de datos vía NFS a un servidor seguro. ♦ Realizar una copia sobre papel de la base de datos en caso de existir. ♦ Para eliminar la suspicacia sobre la integridad de base de datos, se pueda realizar manualmente una comparación de la información. 10 Tutorial de Tripwire Actualizando la base de datos Un sistema no es una entidad estática muy por el contrario está en continuo cambio ya sea por nuevas aplicaciones incluídas, actualización del sistema, aplicación de parches al sistema, etc. Es por esto que Tripwi permite realizar actualización de la base de datos. Hay dos formas de actualizar la base de datos de Tripwire. El primer método es interactivo, donde Tripwire proporciona un prompt al usuario donde podemos manualmente actualizar cada una de las entradas especificad en el tw.config. Modo Interactivo Ejecutar Tripwire en modo Interactivo es muy similar al modo de Verificación de integridad. De esta forma, cuando se encuentra que un directorio o archivo ha sido añadido, borrado o modificado con respecto a la base datos almacenada. Tripwire preguntará al usuario si la base de datos debe ser actualizada. Ejemplo: /homes/genek/research/tw/src/preen.c st_mtime: Wed May 5 15:30:37 1993 Wed May 5 15:24:09 1993 st_ctime: Wed May 5 15:30:37 1993 Wed May 5 15:24:09 1993 −−−> File: '/homes/genek/research/tw/src/preen.c −−−> Update entry? [YN(y)nh?] y Tripwire en modo Actualización. La segunda forma de realizar una actualización es utilizando la línea de comando. Tripwire almacena información asociada a cada archivo indicado en la configuración tw.config. De forma que un solo archivo es el que se ha modificado, podemos actualizarlo de la siguiente manera: $tripwire −update /path/to/file.new O si un conjunto de archivos del archivo tw.config ha sido modificado, puede señalarse la actualización de la siguiente manera: tripwire −update /path/to/dir/ En este caso Tripwire regenera la base de datos para cada archivo. Modo Verificación Rápida. Tripwire permite saltarse selectivamente ciertas rutinas de firma al momento de ejecución. Esto para acelerar e tiempo de ejecución en aquellos momentos en que una ejecución total puede resultar prohibitiva para el sistem pero indispensable para garantizar su integridad, por ejemplo: Una hora pico del sistema, para esto solamente verificaría por medio de un algoritmo rápido CRC32, por esto es importante que al momento de inicializar una 11 Tutorial de Tripwire base de datos se haya seleccionado un algoritmo rápido. Para ignorar firmas se procede de la siguiente forma: tripwire −i 1 −i 2 Esto indicará a tripwire que ignore los algoritmos de la firma 1 y firma 2, ejecutando solo los restantes. Esta capacidad de ignorar firmas nos permiten otra característica a tripwire, que es encontrar si se borraron o añadieron nuevos archivos al sistema, esto lo logramos ignorando todas las firmas. tripwire −i all Firmas MD2 fue desarrollada por Rivest en 1989. El mensaje primero se rellena hasta obtener una longitud de bytes q sean divisibles entre 16. Un checksum de 16 bytes es incluido en el mensaje, y se calcula valor hash en el mensaje resultado. MD4 fue desarrollado por Rivest en 1990. El mensaje es rellenado hasta una longitud de 448 bits divisible ent 512. Un número de 64 bits representa la longitud original del mensaje y es concatenada al mensaje original. E mensaje es procesado en bloques de 512 bits en la estructura Damgard/Merkle iterativa, y cada bloque es procesado en tres distintas rutinas. MD5 (RFC 1321)fue desarrollado por Rivest en 1991, básicamente toma un mensaje de entrada de longitud arbitraria y produce una salida de 128−bit "fingerprint" o "message digest" de la entrada. Snefru, fue desarrollado por Ralph Merkle de Xerox PARC. Hay un incentivo de $1000 USD en efectivo a qu encuentre dos conjuntos de entradas que generen la misma firma. Este premio ha permanecido desde abril de 1990, cuando la versión de dos pasadas de Snefru fue roto por Eli Biham, un Estudiante del Ph.D. de Adi Shamir. Actualmente Ralph Merkle recomienda usar la versión de 4 ciclos de Snefru. CRC−32. Este algoritmo tiene una gran variedad de aplicaciones (detección de errores en la transmisión de da firmas, etc.) es rápido. La versión de CRC−32 incluida en Tripwire fue escrita por Gary S. Brown. Esta versió tiene una velocidad de ejecución de 111 kbytes/segundo. Haval fue desarrollado por Yuliang Zheng de la Universidad de Wollongong en 1992, es un algoritmo de un s camino hash y soporta 15 diferentes niveles de seguridad. Informes Para mayores informes con respecto a este tutorial o uso de Tripwire, te recomendamos visitar los tutoriales en línea, preguntas mas frecuentes acerca de Tripwire, disponibles en las páginas del Departamento de Seguridad en Cómputo d la UNAM. Departamento de Seguridad en Cómputo DGSCA, UNAM Circuito Exterior, S/N Frente a la Fac. de Contaduría Tel: 5622−8169 Fax: 5622−8043 12 Tutorial de Tripwire http://www.seguridad.unam.mx ftp://ftp.seguridad.unam.mx E−Mail:seguridad@seguridad.unam.mx Si eres víctima de una Intrusión en tus sistemas, REPORTALA!!!, El UNAM−CERT es un grupo de profesionales que ayudará y auxiliará de forma profesional para evitar futuras intrusiones en tu sistema. UNAM−CERT DGSCA, UNAM Circuito Exterior, S/N Frente a la Fac. de Contaduría Tel: 5622−8169 Fax: 5622−8043 http://www.unam−cert.unam.mx ftp://ftp.seguridad.unam.mx E−Mail:unam−cert@seguridad.unam.mx 13