domingo, 10 de febrero de 2008

Seguridad del Núcleo

Se hace una descripción de las opciones de configuración del núcleo que se relacionan con la seguridad y una explicación de lo que hacen y de cómo usarlas.
Dado que el núcleo controla el funcionamiento en red de tu computadora, es importante que sea muy seguro y no se vea comprometido. Para impedir alguno de los más recientes ataques de redes, debes procurar mantener actualizada la versión de tu núcleo. Puedes encontrar nuevos núcleos en ftp://ftp.kernel.org/ o a través de tu vendedor de distribuciones.
Hay también un grupo internacional que proporciona un único crypto parche unificado para el núcleo de linux más extendido. Este parche da soporte para una gran cantidad de subsistemas criptográficos y otras cosas que no pueden incluirse en el núcleo principal debido a las restricciones de exportación. Para más información, visita su página web en: http://www.kerneli.org/
Opciones para Compilar el Núcleo 2.0
Para los núcleos 2.0.x, se aplican las opciones que siguen. Debes ver estas opciones durante el proceso de configuración del núcleo. Muchos de los comentarios que se hacen están tomados de ./linux/Documentation/Configure.help, que es el mismo documento al que se hace referencia cuando se usa la facilidad de Ayuda durante la etapa de make config de compilación del núcleo.
Cortafuegos de Red (CONFIG_FIREWALL)
Esta opción debe estar encendida (on) si quieres ejecutar cualquier cortafuegos o enmascaramiento en tu equipo linux. Si sólo vas a ser una máquina cliente regular, es más seguro decir no.
IP: reenviar/pasarelas (CONFIG_IP_FORWARD)
Si activas el reenvío de IP, tu equipo Linux esencialmente se convierte en un enrutador. Si tu máquina está en una red, podrías estar reenviando datos desde una red a otra, y quizás subvirtiendo un cortafuegos que se puso ahí para impedir que esto sucediera. Los usuarios telefónicos normales deberán desactivar esto y los otros usuarios deberían meditar sobre las implicaciones de seguridad que tiene hacer esto. Los equipos cortafuegos deberán tenerlo activado y usarlo en conjunción con software de cortafuegos.
Puedes activar el reenvio de IP de una forma dinámica usando el siguiente comando: root# echo 1 > /proc/sys/net/ipv4/ip_forward
y desactivarlo con el comando: root# echo 0 > /proc/sys/net/ipv4/ip_forward
Recuerda que los ficheros, y sus tamaños, no reflejan sus tamaños reales y que a pesar de ser de longitud cero, pueden serlo o no.
IP: syn cookies (CONFIG_SYN_COOKIES)
Un "Ataque SYN" es un ataque de negación de servicio (DoS) que consume todos los recursos de tu equipo, obligándote a reiniciarlo. No se nos ocurre ni una sola razón por la que, normalmente, no querrías activar esto. En la serie de núcleo 2.1 esta opción config solamente permite las syn cookies, pero no las activa. Para activarlas, tienes que hacer: root# echo 1 > /proc/sys/net/ipv4/tcp_syncookies

IP: Cortafuegos (CONFIG_IP_FIREWALL)
Esta opción es necesaria si vas a configurar tu equipo como cortafuegos, vas a hacer enmascaramiento o si deseas proteger a tu equipo de conexión telefónica de que alguien entre por la vía de tu interfaz de marcado PPP.
IP: registro de paquetes del cortafuegos (CONFIG_IP_FIREWALL_VERBOSE)
Esta opción te da información sobre los paquetes que ha recibido tu cortafuegos, como remitente, receptor, puerto, etc.
IP: Suprimir sistema de enrutado de origen (CONFIG_IP_NOSR)
Esta opción debe estar activada. Los sistemas de enrutado de origen contienen dentro del paquete el camino completo hasta su destino. Esto quiere decir que los enrutadores a través de los cuales va el paquete no necesitan inspeccionarlo, sino sólo reenviarlo. Esto podría conducir a que entren datos en tu sistema que pueden ser un exploit potencial.
IP: Enmascaramiento (CONFIG_IP_MASQUERADE) Si uno de los computadores de tu red local, para el cual tu equipo Linux actúa como cortafuegos, quiere enviar algo al exterior, tu equipo puede "enmascararse" como este host, esto es, reenvía el tráfico al destino solicitado, pero hace que parezca como si viniera del equipo cortafuegos mismo. Ver http://www.indyramp.com/masq para más información.
IP: enmascaramiento ICMP (CONFIG_IP_MASQUERADE_ICMP) Esta opción añade enmascaramiento ICMP a la opción previa de sólo enmascaramiento de tráfico TCP o UDP.
IP: soporte proxy transparente (CONFIG_IP_TRANSPARENT_PROXY) Esto capacita a tu cortafuegos Linux para redirigir de forma transparente cualquier tráfico de red, con origen en la red local y destinado a un host remoto, a un servidor local, llamado "servidor proxy transparente". Esto hace que los computadores locales piensen que están hablando con el extremo remoto, cuando de hecho están conectados a un proxy local. Ver el COMO IP-Masquerading y http://www.indyramp.com/masq para más información.
IP: desfragmentar siempre (CONFIG_IP_ALWAYS_DEFRAG)
Generalmente esta opción está desactivada, pero si estás construyendo un cortafuegos, o un host de enmascaramiento, querrás activarla. Cuando se envían datos de un host a otro, no siempre se logra enviarlos como un único paquete de datos, sino más bien se fragmentan en diversas piezas. El problema con esto es que los números de puerto sólo se almacenan en el primer fragmento. Esto significa que cualquiera puede insertar en los restantes paquetes información que no se sabe que está ahí. Podría también impedir un ataque lágrima (teardrop) contra un host interno que todavía no esté parcheado contra él.
Firmas de Paquetes (CONFIG_NCPFS_PACKET_SIGNING)
Esta es una opción disponible en la serie 2.1 del núcleo que firmará los paquetes NCP para mayor seguridad. Normalmente puedes dejarlo desactivado, pero está ahí por si lo necesitas.
IP: Dispositivo de enlace en red de paquetes de cortafuegos (CONFIG_IP_FIREWALL_NETLINK)
Esta es una opción realmente esmerada que te permite analizar los primeros 128 bytes de los paquetes de un programa de espacio de usuario, para determinar si te gustaría aceptar o rechazar el paquete, basándote en su validez.
Opciones para Compilar el Núcleo 2.2
Para los núcleos 2.2.x, muchas de las opciones son las mismas, pero se han desarrollado unas pocas nuevas. Muchos de los comentarios que se hacen aquí se han tomado de ./linux/Documentation/Configure.help, que es el mismo documento al que se hace referencia cuando se usa la facilidad Ayuda durante la etapa make config de compilación del núcleo. Sólo se listan debajo las opciones añadidas recientemente. Consulta la descripción del 2.0 para ver una lista de otras opciones necesarias. El cambio más importante en la serie 2.2 del núcleo es el código IP de cortafuegos. Para instalar el IP del cortafuegos ahora se usa el programa ipchains, en vez del ipfwadm que se usa en el núcleo 2.0.
Filtrado de Socket (CONFIG_FILTER)
Para la mayoría de la gente, lo seguro es decir no a esta opción. Esta opción te permite conectar en espacio de usuario un filtro a cualquier socket y determinar si los paquetes deben aceptarse o rechazarse. A menos que tengas una necesidad muy específica y seas capaz de programar tal filtro, debes decir no. También ten en cuenta que según este escrito, todos los protocolos fueron admitidos excepto TCP.
Reenvío de Puerto
El reenvío de puerto es un añadido al Enmascaramiento de IP que permite algún reenvío de paquetes desde el exterior al interior de un cortafuegos por unos puertos dados. Esto podría ser útil si, por ejemplo, quieres ejecutar un servidor de web detrás del cortafuegos o enmascarar el host y que el servidor de web fuese accesible desde el mundo exterior. Un cliente externo envía una petición al puerto 80 del cortafuegos, el cortafuegos reenvía esta petición al servidor de web, el servidor de web tramita la petición y los resultados se envían a través del cortafuegos al cliente original. El cliente piensa que la misma máquina cortafuegos está ejecutando el servidor web. Esto también puede usarse para equilibrar cargas si tienes un grupo de servidores web idénticos detrás del cortafuegos. Información sobre esta característica está disponible en http://www.monmouth.demon.co.uk/ipsubs/portforwarding.html (para leer el WWW, necesitas tener acceso a un equipo en Internet que tenga un programa como lynx o netscape). Para información general, ver por favor ftp://ftp.compsoc.net/users/steve/ipportfw/linux21/
Filtrado de Socket (CONFIG_FILTER)
Usando esta opción, los programas de espacio de usuario pueden adjuntar un filtro para cualquier socket y por ello decirle al núcleo que debe permitir o no permitir a ciertos tipos de datos pasar a través del socket. El filtro de socket de Linux funciona con todos los tipos de socket, excepto el TCP por ahora. Ver el fichero de texto ./linux/Documentation/networking/filter.txt para más información.
IP: Enmascaramiento
El enmascaramiento del núcleo 2.2 ha sido mejorado. Proporciona soporte adicional para protocolos especiales para enmascaramiento, etc. No dejes de leer el Cadenas IP COMO para más información.
Dispositivos de Núcleo
Hay unos pocos dispositivos de bloque y de carácter disponibles en Linux que te ayudarán también con la seguridad.
Los dos dispositivos /dev/random y /dev/urandom se proveen por el núcleo para proporcionar datos aleatorios en todo momento.
Ambos, /dev/random y /dev/urandom, deberían ser bastante seguros de usar al generar claves PGP, desafíos ssh y otras aplicaciones para las que los números aleatorios sean un requisito. Dada cualquier secuencia inicial de números, los atacantes serán incapaces de predecir el número siguiente a partir de esas fuentes. Hay gran cantidad de esfuerzo puesto en asegurar que los números que se obtienen de esas fuentes son aleatorios en cualquier sentido de la palabra.
La única diferencia es que a /dev/random se le agotan los bytes aleatorios y te hace esperar hasta que sean acumulados más. Ten en cuenta que algunos sistemas pueden bloquearse durante mucho tiempo de espera hasta que una entrada generada por un nuevo usuario sea introducida en el sistema. Tienes que tener cuidado antes de usar /dev/random. (Quizás lo mejor que puede hacerse es usarlo cuando estés generando información en clave sensible y decirle al usuario que aporree el teclado repetidamente hasta que tú imprimas "OK, suficiente".)
/dev/random es entropía de alta calidad, generada al medir los tiempos entre interrupciones, etc. Se bloquea hasta que estén disponibles suficientes bits de datos aleatorios.
/dev/urandom es similar, pero cuando el almacén de entropía se ejecuta bajo, devolverá un embrollo criptográficamente potente de lo que hay. Esto no es seguro, pero es suficiente para la mayoría de las aplicaciones.
Puedes leer desde los dispositivos usando algo como: root# head -c 6 /dev/urandom mmencode
Esto imprimirá seis caracteres aleatoriamente en la consola, adecuados para la generación de contraseñas. Puedes encontrar mmencode en el paquete metamail.
Ver /usr/src/linux/drivers/char/random.c para una descripción del algoritmo.
Gracias a Theodore Y. Ts'o, Jon Lewis y otros de Linux-kernel por ayudarme (a Dave) con esto.

No hay comentarios: