5 - SEGURIDAD EN EL NUCLEO
 
 

[ CONCEPTOS BÁSICOS ] - [ ADMINISTRACION ELEMENTAL ] - [ AUTENTIFICACION DE USUARIOS ] - [ POLITICAS DE SEGURIDAD ] - [ SEGURIDAD EN EL NUCLEO ] -
[ COPIAS DE SEGURIDAD ] - [ BIBLOGRAFIA ]



5.1 - INTRODUCCION
5.2 - LINUX
    5.2.1 - OPCIONES DE COMPILACION
    5.2.2 - DISPOSITIVOS
    5.2.3 - ALGUNAS MEJORAS DE LA SEGURIDAD



 

5.1 - INTRODUCCION

El nucleo o kernel de un sistema Unix es la parte mas importante del mismo, hasta tal punto que en terminos puristas se considera al nucleo como el sistema operativo en si. Pero incluso si no lo consideramos asi, y contemplamos al sistema operativo como el conjunto formado por el nucleo y una serie de herramientas (editor, compilador, enlazador, shell...), es innegable que el kernel es la parte del sistema mas importante, y con diferencia: mientras que las aplicaciones operan en el espacio de usuario, el nucleo siempre trabaja en el modo privilegiado del procesador (RING 0). Esto implica que no se le impone ninguna restriccion a la hora de ejecutarse: utiliza todas las instrucciones del procesador, direcciona toda la memoria, accede directamente al hardware, etc...
De esta forma, un error en la programacion, o incluso en la configuracion del nucleo puede ser fatal para nuestro sistema.
A la hora de protegerse, evidentemente, para cualquier intruso, el ataque a un nucleo es mucho mas facil en clones de Unix cuyo codigo fuente este disponible, como Linux, Minix o algunos BSD, pero el ataque es posible en cualquier sistema. El hecho de la completa disponibilidad del codigo fuente de un sistema operativo suele despertar controversias entre la comunidad cientifica dedicada a la seguridad informatica: mientras unos argumentan que esta disponibilidad supone un problema de seguridad, otros les acusan de defender las teorias de Security through Obscurity y sostienen que cuanta mas gente tenga acceso al codigo mas errores se localizaran y solucionaran, y por tanto a la larga se va a conseguir un sistema mucho mas robusto.
Esta segunda postura es la que mas fuerza esta tomando desde hace unos años, y parece tambien la mas razonable: es cierto que un atacante puede dedicarse a leer codigo hasta encontrar un error, pero se ha comprobado que la mayoria de los fallos no se suelen detectar de esta forma, sino por cualquier circunstancia que genera un evento extraño sobre el que posteriormente se investiga.
Por tanto, la disponibilidad del codigo del nucleo no debe suponer una amenaza a la seguridad, a primera vista. Ademas, un administrador de sistemas con un minimo nivel de conocimientos de programacion puede aprovechar la disponibilidad del codigo para detectar rapidamente problemas de seguridad
Parece claro que el nucleo va a representar un pilar basico para conseguir un sistema seguro; es mas, al ser el kernel la base del sistema operativo, no sirve de nada esforzarse en conseguir seguridad a nivel de aplicacion si nuestro nucleo es inseguro.

5.2 - LINUX

5.2.1 - OPCIONES DE COMPILACION

A la hora de recompilar un nuevo nucleo de Linux hemos de tener en cuenta algunas opciones dentro del grupo 'Networking Options' que pueden afectar a la seguridad de nuestra maquina. Sin embargo, antes de entrar en detalles con opciones concretas, es muy conveniente que introduzcamos soporte para sistemas de ficheros proc en 'Filesystems' (CONFIG_PROC_FS) y activemos el interfaz sysctl en 'General Setup' (CONFIG_SYSCTL); con estos pasos habilitamos la capacidad de Linux para modificar ciertos parametros del nucleo (en /proc/sys/) sin necesidad de reiniciar el sistema o recompilar el kernel.
Pasando a comentar algunas opciones de Linux es bastante interesante configurar un cortafuegos a la hora de compilar el nucleo (CONFIG_IP_FIREWALL). Linux posee en su kernel utilidades para definir un firewall de paquetes en el sistema, que ademas permitira el  IP-Masquerading. Para que el subsistema de filtrado funcione es necesario que el IP-Forwarding este activado de la forma que mas tarde veremos.

En ciertas situaciones es interesante analizar en espacio de usuario un paquete o parte de el, que llega a traves de ña red hasta nuestra maquina; de esta forma, un analizador simple puede tomar ciertas decisiones en funcion del contenido del paquete recibido, como enviar un correo al administrador en caso de sospecha o grabar un mensaje mediante syslog. Justamente esto es lo que conseguimos si habilitamos la opcion Firewall Packet Netlink Device (CONFIG_IP_FIREWALL_NETLINK).
Hasta ahora hemos hablado de la posibilidad que tiene Linux para modificar parametros del nucleo sin necesidad de recompilarlo o de reiniciar el equipo, mediante el interfaz sysctl; esto implica por ejemplo que podemos modificar el comportamiento del subsistema de red simplemente modificando determinados ficheros de /proc/sys/.
Uno de los parametros que nos interesa es la habilitacion o deshabilitacion del IP Forwarding en el nucleo de Linux; como hemos dicho antes, el sistema de filtrado de paquetes solo funciona cuando esta opcion esta habilitada, lo que se consigue con la orden
# echo 1 > /proc/sys/net/ipv4/ip_forward

Tambien es muy recomendable que el subsistema de red del kernel descarte las tramas con Source Routing o encaminamiento en origen activado. Este tipo de paquetes contienen el camino que han de seguir hasta su destino, de forma que los routers por los que pasa no han de examinar su contenido sino simplemente reenviarlo, hecho que puede causar la llegada de datos que constituyan una amenaza a nuestras politicas de seguridad. Por ejemplo, la siguiente orden descarta las tramas con encaminamiento en origen que llegan al dispositivo de red eth0:
# echo 0 > /proc/sys/net/ipv4/conf/eth0/accept_source_route

Es necesario recordar que, las modificaciones que hacemos sobre el interfaz sysctl son dinamicas (se pueden efectuar con el sistema funcionando, sin necesidad de reiniciarlo), pero se pierden cuando la maquina se apaga para establecerse a unos valores por defecto al arrancar de nuevo el sistema operativo.

5.2.2 - DISPOSITIVOS

Linux proporciona dos dispositivos virtuales denominados /dev/random/ y /dev/urandom que pueden utilizarse para generar numeros pseudoaleatorios, necesarios para aplicaciones criptograficas. El primero de estos ficheros, /dev/random, utiliza lo que su autor denomina 'ruido ambiental' que apenas introduce sobrecarga en el sistema. El segundo archivo, /dev/urandom, crea un resumen de la entropia de /dev/random  utilizando la funcion hash. Por tanto, tenemos una fuente de entropia aceptable, /dev/urandom, y otra incluso mejor, pero de capacidad limitada, /dev/random.
(drivers/char/random.c -> en el kernel)

Como en el propio codigo se explica, cuando un sistema operativo arranca ejecuta una serie de acciones que pueden ser precedidas con mucha facilidad por un potencial atacante. Para mantener el nivel de entropia en el sistema se puede almacenar el desorden que existia en la parada de la maquina para restaurarlo en el arranque; esto se consigue modificando los scripts de inicializacion del sistema.
En el fichero apropiado que se ejecute al arrancar debemos añadir las siguientes lineas:

echo "Initializing random number generator..."
random_seed=/var/run/random-seed
# Carry a random seed from start-up to start-up
# Load and then save 512 bytes, which is the size of the entropy pool
if [ -f $random_seed ]; then
    cat $random_seed > /dev/urandom
fi
dd if=/dev/urandom of=$random_seed count=1
chmod 600 $random_seed

Mientras que en un fichero que se ejecute al parar el sistema añadiremos lo siguiente:

# Carry a random seed from shut-down to start-up
# Save 512 bytes, which is the size of the entropy pool
echo "Saving random seed..."
random_seed=/var/run/random-seed
dd if =/dev/urandom of=$random_seed count=1
chmod 600 $random_seed

Con estas pequeñas modificaciones de los archivos de arranque y parada del sistema conseguimos mantener un nivel de entropia aceptable durante todo el tiempo que el sistema permanezca encendico. Si de todas formas no consideramos suficiente entropia proporcionada por estos dispositivos de Linux, podemos conseguir otra excelente fuente de desorden en el mismo sistema opertativo a partir de una simple tarjeta de sonido unas modificaciones en el kernel.

5.2.3 - ALGUNAS MEJORAS DE LA SEGURIDAD

Limites del núcleo

En include/asm/resource.h tenemos la inicializacion de algunas estructuras de datos del nucleo relacionadas con limites a la cantidad de recursos consumida por un determinado proceso; por ejemplo, el maximo numero de procesos por usuario (RLIMIT_NPROC) se inicializa a MAX_TASKS_PER_USER, valor que en include/linux/tasks.h  podemos comprobar que se corresponde con la mitad de NR_TASKS; en arquitecturas i86 el valor del limite de procesos por usuario se fija a 256. De la misma forma, el numero maximo de ficheros abiertos por un proceso (RLIMIT_NOFILE) se inicializa al valor NR_OPEN, que en el archivo include/asm/limits.h se define como 1024.

Estos limites se pueden consultar desde espacio de usuario con la llamada getrlimit(); esta funcion utiliza una estructura de datos rlimit, definida en include/linux/resource.h, que contiene dos datos enteros para representar lo que se conoce como limite soft o blando y limite hard o duro.
El limite blando de un recurso puede ser modificado por cualquier proceso sin privilegios que llame a setrlimit(), ya sea para aumentar o para disminuir su valor; por el contrario, el limite hard  define un valor maximo para la utilizacion de un recurso, y solo puede ser sobrepasado por procesos que se ejecuten con privilegios de administrador.

En el fichero include/linux/nfs.h  podemos definir el puerto maximo que los clientes NFS pueden utilizar (NFS_PORT); so le asignamos un valor inferior a 1024 (puertos privilegiados), solo el administrador de otro sistema Unix podra utilizar nuestros servicios NFS, de forma similar a la variable nfs_portmon de algunos Unices.
Para cambiar los limites de los parametros vistos aqui la solucion mas rapida para por modificar los ficheros de cabecera del kernel, recompilarlo y arrancar la maquina con el nuevo nucleo; sin embargo, a continuacion vamos a hablar brevemente de Fork Bomb Defuser, un modulo que permite al administrador modificar algunos de estos parametros sin reiniciar el sistema.

Fork Bomb Defuser

El kernel de Linux no permite por defecto limitar el numero maximo de usuarios y el numero maximo de usuarios y el numero maximo de procesos por usuario que se pueden ejecutar en el sistema sin tener que modificar el codigo del nucleo; si no queremos modificarlo, casi no hay mas remedio que utilizar un poco de programacion y las herramientas de planificacion de tareas para evitar que un usuario lance demasiados procesos o que conecte cuando el sistema ya ha sobrepasado un cierto umbral de usuarios conectados a el.
Mediante el modulo Fork Bomb Defuser se permite al administrador controlar todos estos parametros del sistema operativo, incrementando de forma flexible la seguridad de la maquina. El codigo esta disponible en http://rexgrep.tripod.com/rexfbdmain.htm.

Secure Linux

Por Secure Linux  se conoce a una coleccion de parches para el nucleo de Linux programados por Solar Designer, uno de los hackers mas reconocidos a nivel mundial en la actualidad. Este software, disponible libremente desde http://www.false.com/security/linux/, incrementa la seguridad que el nucleo proporciona por defecto, ofreciendo cuatro importantes diferencias con respecto a un kernel  normal:
Mejoras en:


[ CONCEPTOS BÁSICOS ] - [ ADMINISTRACION ELEMENTAL ] - [ AUTENTIFICACION DE USUARIOS ] - [ POLITICAS DE SEGURIDAD ] - [ SEGURIDAD EN EL NUCLEO ] -
[ COPIAS DE SEGURIDAD ] - [ BIBLOGRAFIA ]