S-tripwire: (0.16) *EN MEJORA* (hamm)(slink)(potato) tripwire: control de integridad del sistema (Localizar archivos modificados por intrusos) 0.12 14/01/01 Guardar /etc en RO, proceso de actualización, modules.dep, uso de gpg, /usr/games 0.13 16/01/01 test antes de instalar/modificar algo 0.14 17/01/01 superformat y 1992KB 0.15 24/01/01 testear /root menos lo que cambia, desconectar interface 0.16 3/02/01 muevo tw.config de ejemplo a S-tripwire-tw.config POR HACER: Podar mas lo verificado para hacer el test mas rápido ¿Añadir directorios de dentro de home? * ANTES DE EMPEZAR Es vital generar las firmas de los archivo en un sistema "limpio" acabado de instalar y sin conectar a Internet (desconectar de la red local) Antes de inicializar la base de datos de tripwire eliminar todos los paquetes no necesarios para reducir el tiempo que emplea tripwire y reducir el tamaño de la base de datos (base de datos de instalación normal comprimida = 1.823.120 bytes y no cabe en un floppy) * ESTRATEGIAS ** TODO Premisa: Te pueden meter un binario suid en cualquier parte, y si el directorio no es escaneado por tripwire ni te enteras (gracias a Alexis Roda ;-) Esto significa que _TODO_ directorio que no escanees debe de montarse en otra partición y como "noexec,nosuid,nodev", para que no puedan usarse ejecutables, en nuestro caso: - /home noexec,nosuid,nodev - /mnt noexec,nosuid,nodev - /var nosuid,nodev # (Scripts postintalación de Debian) - /var/log noexec,nosuid,nodev - /tmp nosuid,nodev # (mc necesita ejecutar para ver .gz) _INCONVENIENTE:_ Esto hace que la base de datos comprimida y tripwire no te quepan en un disquette, asi que deberás: a) formatear el floppy a 1992KB en lugar de usarlo a 1440KB (superformat) b) reducir las firmas a solo MD5 (R-1) c) usar un grabador de CDR y un CDR como sistema de solo lectura ** MINIMO Premisa: Solo vigilar el mínimo posible (más rápido, menos espacio) - Todo lo que corre como root (scripts de arranque, demonios, configs, suid root, todo lo lanzado desde cron, archivos de ambiente de root) - Comando de información del sistema (ls, netstat, ifconfig, ps, lsof) - Kernel, modulos, libc - Todo lo que interviene en la autenticación (config, /etc/pam.d) - Todos los comandos que están en el path de root y de los usuarios Esto se traduce en la práctica en: - /boot - /etc - /root - /bin, /sbin, /lib - /usr/bin, /usr/sbin, /usr/lib - /usr/games - /usr/X11R6/bin, /usr/X11R6/lib - /usr/local/bin, /usr/local/sbin, /usr/local/lib COMPLEMENTO: Con debsum podemos comprobar el MD5 de los demás archivos instalados... _INCONVENIENTE:_ No lo escaneamos todo, solo lo que es troyanizable... * DURANTE LA INSTALACIÓN Username (para enviar los informes de los cambios por mail): root * PASO A PASO: 1) Localizar e instalar el paquete tripwire*.deb (está en non-free) La versión de Potato tiene un 'md5sum' de: 3525d008b2aa8888699691d99b59fd79 tripwire_1.2-16.1.deb 2) Copiar /etc/tripwire/tw.config a /usr/lib/tripwire y hacer un symlink ln -s /usr/lib/tripwire/tw.config /etc/tripwire/tw.config 3) Ajustar /etc/tripwire/tw.config (mira un ejemplo en S-tripwire-tw.config) NOTA: tripwire no sigue symlinks ni cambia de filesystem (expresamente) ATENCION: Modificar el path de /lib/modules/X.X.XX/modules.dep a lo que corresponda según la versión del kernel que usas 4) Crear la base de datos de firmas - RECOMENDADO: Pasar la maquina a modo single (para que nadie pueda modificar nada), y mejor desde consola (las X se cierran) . telinit 1 . netstat -tuna # verificar que no quedan conexiones - Ejecutar como root desde el directorio /usr/lib/tripwire (se crea 'databases/*' en el directorio actual) nice ztripwire -initialize #nice = para restar prioridad y poder seguir haciendo otras cosas #tripwire = como ztripwire pero sin usar base de datos comprimida (gzip) ALTERNATIVA: Usar 'tripwire' para manejar databases sin comprimir con gzip. 5) Guardar tripwire, la base de datos y el archivo de configuración ( /usr/lib/tripwire/* y /etc/tripwire/tw.config ) en un medio de solo lectura: floppy RO, NFS en solo lectura, etc... - superformat /dev/fd0 tracksize=12KB cyl=83 mss # Formateo a 1992KB - mke2fs /dev/fd0 # Creo un sistema de archivos e2fs en el floppy - mount -t ext2 /dev/fd0 /floppy # Lo monto - cp -Rip /usr/lib/tripwire/* /floppy # Copio todo el contenido - umount /floppy - Proteger contra escritura el floppy 6) MAS SEGURIDAD: (recomendación del CERN) firmar la base de datos con gpg (firmar en un archivo adjunto) - Crear archivo de firma . gpg -b tw.db_tu-sistema # crea *.sig con firma digital - Verificar archivo de firma . gpg --verify tw.db_tu-sistema.sig tw.db_tu-sistema 7) Por defecto se hace automáticamente una comprobación 'tripwire' cada día (cron.daily) y envía un e-mail con el resultado ;-) Para hacerlo solo una vez a la semana: - mover /etc/cron.daily/tripwire a /etc/cron.weekly/tripwire Este diff es para montar el floppy y hacer el test usando el script z ---8<--- --- /etc/cron.daily/tripwire.orig Thu Nov 30 20:51:56 2000 +++ /etc/cron.daily/tripwire Tue Dec 5 23:02:56 2000 @@ -30,7 +30,7 @@ # # run the check: script z mounts disk, does ztripwire, and umounts disk # -$TRIPWIRE -q > $LOG +z > $LOG 2>&1 # Add stderr to stdout in the LOG # # if the temporary file is empty do not send mail --->8--- 8) Para lanzar una comprobación a mano: - entrar como root o hacer "su" - montar el disco en /usr/lib/tripwire - cd /usr/lib/tripwire - nice ztripwire -v #tripwire = como tripwire sin usar base de datos comprimida (gzip) # -v muestra el nombre de archivo en proceso Adjunto en un anexo el script "z" que hace todo esto automáticamente... 9) Guardar /etc original en medio de solo lectura Es recomendable para poder verificar los cambios realizados por nosotros mismos (quizas hace unas horas o unos dias) antes de actualizar la base de datos diff -u /medio-RO/config-vieja /etc/config-nueva La alternativa es hacer modificaciones en la configuración siempre en modo single y actualizar la base de datos inmediatamente y eso no es práctico ni cómodo 10) Alias interesantes para root Puedes añadir a /root/.bashrc los siguientes alias: - alias f='umount /floppy || mount -t ext2 /dev/fd0 /floppy' - alias z='/usr/local/bin/z' MANIOBRAS VARIAS: *EN MEJORA/PRUEBAS* Actualizar de forma interactiva al instalar un paquete o al hacer cambios en la configuración. (este sistema también debería funcionar con un grabador de CDR) RECOMENDADO: Hacer test de integridad en modo monousuario _ANTES_ de instalar o modificar configuración, para tener certeza que los cambios no los hizo un intruso antes de actualizar la base de datos 1) Pasar a modo monousuario o desconectar la red para evitar modificaciones . telinit 1 # pasar a modo monousuario . netstat -tuna # verificar que no quedan conexiones ALTERNATIVA: . ifdown eth0 # desactivar el interface de red . ifconfig # verificar que el interface no está activo 2) Test desde floppy (como root) usando mi script z . /usr/local/bin/z - SI EL TEST ES CORRECTO YA PODEMOS FIARNOS DE NUESTRO SISTEMA 3) Montar floppy en /floppy y copiar contenido a /usr/lib/tripwire - AHORA INSTALAR/DESINSTALAR O MODIFICAR LA CONFIGURACION - Si es preciso pasar a modo multiusuario para probar los cambios a) Desconectar el cable de la red local b) Desactivar el interface: ifdown eth0 4) Actualizar base de datos . cd /usr/lib/tripwire . ztripwire -interactive 3) Montar la base de datos en modo lectura/escritura en /floppy y copiar /usr/lib/tripwire al floppy, y desmontarlo 5) Proteger floppy contra escritura 6) (Opcional) Comparar base de datos con la antigua para ver diferencias . cd /usr/lib/tripwire/databases . diff -u tw.db_tu-sistema.old tw.db_tu-sistema 7) Volver a modo multiusuario o activar la red . telinit 2 ALTERNATIVA: . ifup eth0 . ifconfig Actualizar la firma de un solo archivo modificado a mano Es mejor el sistema anterior, esto tarda lo mismo y solo actualiza un archivo... Se hace como antes pero con: nice tripwire -update /ruta/archivo * PARA MÁXIMA SEGURIDAD - Test CRC32 cada hora, MD5 y snefru cada día Para lanzar una comprobación de solo CRC32 (una vez cada hora): nice tripwire -i 1 -i 2 ATENCIÓN: Hay que generar la base de datos con firmas CRC32 añadiendo R+3 en lugar de R a todas las entradas de tw.config _antes_ de inicializar la base de datos de tripwire * COMPLEMENTO: debsums -s (Paquete debsums) Comprueba md5sums de paquetes instalados, los MD5 se guardan en /var/lib/dpkg/info * POR DENTRO: - Tripwire está linkado estáticamente para eludir compromisos de librerías - Por defecto se emplean las firmas (1) MD5 y (2) Snefru a la vez - Las firmas se guardan en formato base64 en lugar del hexadecimal que usa md5sum (posiblemente porque ocupan menos espacio...) - Al ejecutar tripwire para comprobar la integridad este genera una base de datos temporal en /tmp para realizar la comparación * ARCHIVOS: /etc/tripwire/tw.config Archivo de configuración /usr/lib/tripwire/databases Directorio de bases de satos de tripwire /var/log/tripwire* Logs de tripwire * UN POCO DE TEORÍA: Cambios en archivos: - st_ino Inode del archivo - st_size Tamaño del archivo - st_mtime Fecha última modificación del archivo - st_ctime Fecha última modificación de información de estado del archivo - st_atime Fecha último acceso al archivo - md5 (sig1) Firma 1 - snefru (sig2) Firma 2 - crc32 (sig3) Firma 3 * MOTIVO: a) Un intruso tras conseguir entrar en tu sistema intentará dejar una "puerta" abierta para tenerlo más fácil después, e incluso instalarte sistemas de ataque distribuidos (Denial of Service) para emplearte contra otras víctimas. b) Para todo ello modificará tu sistema (inetd, login, ls, e incluso el kernel) Piensa que hay "root kits" para diferentes Unix disponibles por ahí... c) La única manera fiable que tienes de verificar si te han añadido archivos o modificado los que ya tienes es emplear "tripwire" que hace una "firma" para cada archivo de tu sistema (se puede configurar) y los guarda en un archivo. * INCONVENIENTES: a) Cada paquetes que instales, y cada archivo que modifiques tu, también te será reportado como modificación del sistema si no actualizas la base de datos MAS AYUDA: /usr/doc/tripwire/README Leelo al menos una vez ;-) /usr/doc/tripwire/FAQ.gz /usr/doc/tripwire/designdoc.ps.gz man tripwire man tw.config Formato del archivo de configuración con ejemplos ANEXO-I script "z" ---8<--- #!/bin/sh # z (0.01) Monta el floppy tripwire, hace un test de integridad # 'nice ztripwire' y desmonta el floppy # # 1) Copiar a /usr/local/bin # 2) Uso: z # # Cambios: # 0.01 4/1/01 Primera versión # # # Copyright Manel Marin @ 2000 Cubierto por la licencia GNU GPL disponible en # http://www.gnu.org/copyleft/gpl.html Se puede copiar, distribuir y modificar # libremente bajo los términos de la GPL e incluyendo siempre este párrafo #------------------------------------------------------------------------------ if [ "`mount | grep /dev/fd0`" != "" ] #Si no es vacio está montado then # YA ESTA MONTADO echo "Desmontando el FLOPPY..." umount /floppy if [ "$?" == "0" ] then echo OK else echo ERROR fi echo "Inserta el floppy de tripwire y vuelve a probar..." else # SE HA DE MONTAR EL FLOPPY echo "Montando el FLOPPY..." mount -t ext2 /dev/fd0 /usr/lib/tripwire if [ "$?" == "0" ] then echo OK cd /usr/lib/tripwire nice ztripwire cd / echo "Desmontando el FLOPPY..." umount /usr/lib/tripwire if [ "$?" == "0" ] then echo OK else echo ERROR fi else echo ERROR fi fi --->8---