[ 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
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.
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 ]