2/29/2008


Seguridad en /proc

Si no conocen el directorio /proc, es mejor que tengan algunos conocimientos sobre él, pueden ver Descubriendo al directorio /proc como recomendación.

Seguridad en /proc

Opciones de seguridad en Linux a través de /proc (I)

Diversos parámetros de seguridad de las máquinas que ejecuten Linux pueden ser
controlados a través del sistema de archivos virtual /proc.

/proc es un pseudo-sistema de archivos, ya que en realidad ni él ni ninguno de
los archivos y directorios contenidos en su interior existen realmente. /proc
nos facilita una interfaz para acceder y, en algunos casos, modificar, algunas
estructuras de datos del núcleo del sistema operativo.

/proc está disponible en el sistema operativo Linux cuando el núcleo se ha
compilado con la opción CONFIG_PROC_FS=Y. También deberemos seleccionar la
opción CONFIG_SYSCTL=Y para poder modificar el valor de determinados
parámetros, como veremos más adelante. La mayoría de distribuciones incluyen
núcleos compilados con esta opción y, como regla general, es aconsejable
seleccionarla en el momento de recompilar el núcleo.

El sistema de archivos /proc puede montarse automáticamente en el momento de
iniciar el sistema (si así se indica en el archivo /etc/fstab). En el caso de
que sea necesario montarlo manualmente, debe utilizarse la siguiente orden:

mount -t proc proc /proc

Es aconsejable que /proc sea montado automáticamente al sistema y que el núcleo
siempre se compile para dar soporte a este pseudo- sistema de archivos. En caso
de no disponer del soporte, muchos programas de utilidad no funcionarán y no
podremos modificar en tiempo de ejecución algunos parámetros del núcleo del
sistema operativo. Muchos de estos parámetros que nos pueden interesar
modificar son muy importantes desde el punto de vista de seguridad.

Contenido de /proc:

Dentro del directorio /proc encontramos dos tipos básicos de información. En
primer lugar, para cada proceso activo existe un directorio. Dentro del
directorio de cada proceso hay diversos archivos así como un subdirectorio con
información específica del proceso (parámetros pasado en la línea de órdenes,
enlace al directorio actual del proceso, las variables de entorno dentro del
contexto del proceso, los descriptores de los archivos abiertos en el proceso,
mapa e información acerca de la utilización de la memoria...).

Adicionalmente, existen una serie de directorios con información acerca de los
diferentes módulos del sistema operativo. En el archivo proc.txt (disponible en
el directorio Documentation/filesystems del código fuente del núcleo de Linux)
hay información detallada de todo lo que podemos encontrar dentro de /proc.
Otro documento de interés es ip-sysctl.txt, disponible en el directorio
Documentation/networking del código fuente del núcleo de Linux.

No todos los parámetros existentes en /proc son modificables directamente por
el usuario. De hecho, la mayoría son valores de sólo lectura y otros son mucho
mejor controlados por el núcleo o mediante la utilización de los diversos
mandatos y herramientas existentes en el sistema.

/proc/sys/net/ipv4

Dentro de este directorio disponemos de una serie de archivos con los valores y
parámetros para el protocolo IPv4. Se trata de los valores directamente
utilizados por el núcleo del sistema operativo en las comunicaciones TCP/IP
basadas en el protocolo IPv4.

Para determinar el valor de uno de estos parámetros lo único que tenemos que
hacer es mirar su contenido. Por ejemplo:

$cat /proc/sys/net/ipv4/icmp_echo_ignore_all
0

nos muestra que actualmente el sistema operativo tiene asignado el valor 0
(desactivado) al parámetro ICMP_ECHO_IGNORE_ALL.

El usuario root del sistema tiene el privilegio de modificar el valor de estas
variables:

# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
1

Otra forma de configurar los valores es utilizando la utilidad sysctl.
Utilizando el ejemplo anterior, para determinar el valor debemos
utilizar:

$ sysctl net.ipv4.icmp_echo_ignore_all
net.ipv4.icmp_echo_ignore_all = 0

y para establecer el valor:

# sysctl -w net.ipv4.icmp_echo_ignore_all=1
net.ipv4.icmp_echo_ignore_all = 0

Ambas formas son equivalentes y podemos utilizar aquella con la que nos
encontremos más cómodos.

Una última forma de modificar los valores de los parámetros, de forma que estos
se mantengan incluso después de reiniciar el sistema es a través del archivo /
etc/sysctl.conf. Podemos obtener más detalles del formato de este archivo
ejecutando

man systcl.conf

Si se modifica el archivo /etc/sysctl.conf, los parámetros sólo se activarán la
próxima vez que se reinicie la máquina o bien después de reiniciar el soporte
de red, ejectuando

/etc/rc.d/init.d/network restart

Continuamos con la descripción de los parámetros de seguridad de las máquinas
que ejecutan Linux con el sistema de archivos virtual /proc. Los parámetros que
vamos a ver a continuación muestran como podemos controlar la forma en que un
sistema actúa en determinadas circunstancias. Estos parámetros nos van a ayudar
a fortalecer la seguridad del sistema operativo. Estos parámetros son un
complemento a las medidas de protección perimétricas, como pueden ser los
cortafuegos.

Mediante /proc no sólo podemos cambiar estos parámetros. Hay otras muchas cosas
interesantes que podemos hacer, como por ejemplo mejorar el rendimiento del
sistema de archivos, modificar la forma en que el sistema gestiona la memoria
virtual, incrementar el número máximo de archivos abiertos de forma simultánea
y otros cambios. Los lectoresinteresados pueden encontrar información al
respecto en la documentación que acompaña al código fuente del núcleo de Linux.

Todos los mandatos que indicamos a continuación deben ser ejecutados por el
usuario root.


Control del protocolo ICMP

- -Ignorar las peticiones de repuesta a ping

Dependiendo de la configuración de la red, puede ser interesante configurar el
sistema para que éste no responda cuando recibe un ping (mensaje ECHO del
protocolo ICMP). De esta forma, puede ser un poco más difícil que un atacante
descubra si el sistema está conectado a la red.

Para desactivar las respuesta de forma temporal:

# sysctl -w net.ipv4.icmp_echo_ignore_all=1

y para desactivarla de forma permanente, editar el archivo /etc/sysctl.conf y
añadir las líneas

net.ipv4.icmp_echo_ignore_all = 1

(Nota= En los siguientes parámetros, si se desea realizar el cambio de forma
permanente deberá modificarse igualmente el archivo /etc/sysctl.conf, tal como
hemos hecho para este parámetro).


No atender a las peticiones enviadas mediante broadcast

Cuando una máquina envía un paquete a la dirección de broadcast (por ejemplo,
192.168.1.255), éste es entregado a todas las máquinas existentes en la red
local. A continuación, todas las máquinas deben enviar un mensaje ECHO del
protocolo ICMP. Esto puede provocar una congestión de la red, a la vez que
permite determinar que sistemas están activos en la red.

Para desactivar la recepción de paquetes enviados a la dirección de broadcast:

# sysctl -w net.ipv4.icmp_echo_ignore_broadcasts = 1


Protección ante mensajes de error mal formateados

Es posible que una red se transmitan mensajes de error mal formateados. Para
evitar que éstos sean procesados por el sistema:

# sysctl -w net.ipv4.icmp_ignore_bogus_error_responses = 1


Deshabilitar la aceptación de redirecciones

Cuando el ordenador utiliza una ruta extinta o no-óptima para enviar un paquete
a un destino particular, los routers por donde circula el paquete envían al
origen un mensaje de redirección del protocolo ICMP para informar de la ruta
correcta a utilizar en el futuro.

Si un atacante tiene la capacidad de enviar mensajes de redirección puede
modificar las tablas de direccionamiento del ordenador, haciendo por ejemplo
que todo el tráfico fluya a través de una vía concreta.

Para evitar el proceso de estos mensajes en el sistema:

# sysctl -w net.ipv4.conf.all.accept_redirects = 0
# sysctl -w net.ipv4.conf.default.accept_redirects = 0


Protección contra ataques DoS de inundación SYN

El ataque de denegación de servicio (DoS) por inundación SYN ("SYN Flood")
consigue consumir todos los recursos de la máquina, haciendo que sea necesario
reiniciarla para volver a funcionar con normalidad.

Cada vez que se realiza una conexión TCP/IP existe una negociación de tres
pasos:

1. El cliente envía un paquete (paquete 1) al servidor con el bit SYN activado
y permanece a la escucha.
2. El servidor responde al cliente con un paquete de confirmación (paquete 2) y
permanece a la escucha.
3. El cliente envía un tercer paquete (paquete 3) que consolida la conexión.


La información recibida en el paquete 1 se conserva dentro de una cola para que
pueda ser comparada con los datos recibidos en el paquete 3 y dar por
establecida la conexión. Esta cola es de un tamaño limitado y tiene un tiempo
de latencia muy elevado.


El ataque de inundación SYN consiste en llenar esa cola, mediante el envío de
un gran número de paquetes 1 y nunca respondiendo con un paquete 3. En el
momento en que se llena la cola, el sistema es incapaz de atender cualquier
otra petición de conexión que reciba.

La protección contra este ataque consiste en añadir información en el paquete
2, de forma que no sea necesaria conservar en el servidor ningún dato sobre el
cliente.

Para activar esta protección:

# sysctl -w net.ipv4.tcp_syncookies = 1

Con este valor, el sistema utilizará el método de incluir la información en el
paquete 2 siempre que la cola de paquetes por procesar esté saturada.


Protección contra direcciones IP no válidas

Esta protección permite que la máquina no pueda utilizarse para el envío de
paquetes con direcciones IP no válidas. Este tipo de paquetes son habitualmente
enviados cuando la máquina está intentando realizar una acción potencialmente
ilegítima, como puede ser la suplantación de una conexión o el envío de
paquetes en un ataque de denegación de servicio.
Para activar esta protección:

# sysctl -w net.ipv4.conf.all.rp_filter = 2
# sysctl -w net.ipv4.conf.default.rp_filter = 2

El valor de los parámetros puede ser 0 (valor por omisión, no realizar ninguna
comprobación), 1 (rechazar únicamente las suplantaciones
evidentes) y 2 (realizar una comprobación exhaustiva). Aconsejamos seleccionar
la opción de comprobación exhaustiva.

Esta opción no debe utilizarse en aquellos sistemas que actúen como cortafuegos
o routers.


Redireccionamiento IP

El redireccionamiento IP es que en un sistema con diversos interfaces activos,
se acepten paquetes en un interfaz con destino al otro. Si la opción de
rediccionamiento está activa, la máquina podrá actuar como un router para el
tráfico entre las redes existentes de cada uno de los interfaces.

Únicamente aquellos sistemas que actúan como cortafuegos o routers o bien en
circunstancias muy especiales deberían tener esta opción activa.

Para verificar que se encuentra desactivada:

# sysctl -w net.ipv4.ip_forward = 0

Tal como hemos indicado anteriormente, en caso de activar con el valor 1 esta
opción, también deberemos modificar el valor de net.ip4.conf.all.rp_filter y
net.ipv4.conf.default.rp_filter.


Control de rutas

Habitualmente un sistema no tiene ningún control sobre la ruta utilizada por
los paquetes en su camino hacia su destino. El protocolo TCP/IP permite
establecer la ruta exacta a seguir. Excepto en circunstancias muy especiales,
este soporte deberá ser desactivado para evitar que un atacante pueda utilizar
un sistema concreto como paso para saltarse las
protecciones establecidas en el tráfico.

Para desactivar esta opción:

# sysctl -w net.ipv4.conf.all.accept_source_route = 0
# sysctl -w net.ipv4.conf.default.accept_source_route = 0


Registro de actividades sospechosas

Un último valor de interés nos permite registrar en los archivos de actividad
del sistema aquellas situaciones potencialmente sospechosas:


intento de envío de paquetes con dirección no válida, paquetes con cambio de
rutas y otras situaciones similares.

Se trata de una serie de situaciones que en un funcionamiento normal de la red
no pueden producirse en ninguna circunstancia. Un ejemplo puede ser la
recepción de un paquete a través de un interfaz Ethernet con dirección origen
igual a 127.0.0.1

Para activar el registro de esta actividad:

# sysctl -w net.ipv4.conf.all.log_martians = 1
# sysctl -w net.ipv4.conf.default.log_martians = 1

Fuentes:
http://www.govannom.org/seguridad/protect/seg_proc_i.txt

0 comentarios: