Este artículo resume un conjunto de configuraciones que permiten mejorar la seguridad de sistemas FreeBSD, para alcanzar un nivel de seguridad similar al que ofrecen los sistemas OpenBSD.



Tanto OpenBSD como FreeBSD son dos grandes sistemas operativos en lo que respecta a seguridad, robustez y eficiencia. Aunque OpenBSD es considerado más seguro, pues es su meta y enfoque principal de desarrollo. Sin embargo, FreeBSD puede ser tuneado para llegar a ser casi tan seguro como OpenBSD. A continuación se lista una serie de configuraciones a nivel sistema operativo que permiten mejorar diferentes aspectos de la seguridad en sistemas FreeBSD.

Protección de memoria

La amenaza más común que enfrentan los sistemas operativos, en lo que respecta a memoria, son los buffer overflows. Estos ataques generalmente se centran en atacar la pila de ejecución para lograr ejecutar código arbitrario, mediante un desborde de buffer. Un ataque clásico consiste en alterar direcciones de retorno de subrutinas para lograr así ejecutar código remoto (el más grave resultado que puede causar un ataque).

A fin de mitigar estos ataques, existen diferentes protecciones que se pueden habilitar en sistemas FreeBSD.

Pila no ejecutable

Una protección básica consiste en impedir la ejecución de código alojado en el espacio de memoria de la pila. Esta protección se encuentra habilitada por defecto para ejecutables ELF en sistemas de 32 y 64 bits.

Para habilitarla (o verificar que se encuentre habilitada), se deben configurar correctamente las variables del kernel kern.elf64.nxstack y kern.elf32.nxstack:

root@hal9000:~ # sysctl kern.elf64.nxstack=1
kern.elf64.nxstack: 1 -> 1
root@hal9000:~ # sysctl kern.elf32.nxstack=1
kern.elf64.nxstack: 1 -> 1

Este comando simplemente marca a la pila como no ejecutable para binarios ELF mediante el bit NX.

Stack smashing protection

Otra forma de defenderse contra los ataques de buffer overflow consiste en introducir lo que comúnmente se llama "canario". Un canario es un flag o número aleatorio que se inserta en la pila en tiempo de ejecución. Más tarde, este canario es verificado, y si el valor ha cambiado, significa que la pila ha sido sobrescrita, con lo cual el programa termina inmediatamente.

Este mecanismo de protección se denomina Stack Smashing Protection (SSP) o "ProPolice", donde un canario (llamado "guard") es insertado en la pila. El mismo se habilita a través de la variable del kernel security.bsd.stack_guard_page:

root@hal9000:~ # sysctl security.bsd.stack_guard_page=1
security.bsd.stack_guard_page: 0 -> 1

Notar que, por defecto, esta protección se encuentra deshabilitada.

NULL page mapping

FreeBSD tiene una protección "NULL page mapping", que se encuentra habilitada por defecto, la cual impide que un usuario invoque a la función mmap() con una página nula (NULL, a fin de evitar ataques de tipo NULL dereference).

root@hal9000:~ # sysctl security.bsd.map_at_zero=0
security.bsd.map_at_zero: 0 -> 0

Verificar que el kernel no permita mapear páginas en la dirección 0 (NULL).

Protección del sistema

Más allá de proteger y controlar los accesos a memoria, la seguridad del sistema depende de otros factores importantes como la aleatoriedad, encriptación, separación de privilegios, etc. Ninguno de estos conceptos puede proveer un elevado nivel de seguridad por sí solo, pero en conjunto, el nivel de seguridad y protección se incrementa notablemente.

Protección de procesos

Una configuración de seguridad que ayuda a proteger procesos, consiste en evitar que sus PID (Process ID) sean predecibles (como lo es por ejemplo en Linux). En FreeBSD esta característica se encuentra deshabilitada por defecto. Para habilitar el uso de PID aleatorios, se debe configurar correctamente la variable del kernel kern.randompid, indicando un módulo numérico (cuanto más grande el módulo, mayor aleatoriedad, por ende mayor seguridad). Por ejemplo, se puede utilizar el valor 1000:

root@hal9000:~ # sysctl kern.randompid=1000
kern.randompid: 0 -> 1000
Encriptación

Luego del escandaloso bug Heartbleed, el cual permitía descifrar el contenido de conexiones protegidas por SSL/TLS, muchos expertos en seguridad informática recomiendan cambiar OpensSSL por LibreSSL (siempre que no existan problemas de compatibilidad con las aplicaciones que requieren SSL/TLS). LibreSSL es un fork de OpenSSL que surgió con el objetivo de modernizar el código fuente de OpenSSL, al igual que su seguridad, aplicando buenas prácticas en los procesos de desarrollo.

root@hal9000:~ # whereis libressl
libressl: /usr/ports/security/libressl

La Wiki oficial de FreeBSD posee una buena guía para configurar e instalar LibreSSL en FreeBSD.

Hardening

Finalmente, es posible evitar que los usuarios sean capaces de ver procesos y sockets de otros usuarios a través de la variable del kernel security.bsd.see_other_uids:

root@hal9000:~ # sysctl security.bsd.see_other_uids=0
security.bsd.see_other_uids: 1 -> 0

Resumen

A fin de endurecer la seguridad de un sistema FreeBSD, se deben configurar las siguientes variables del kernel (como usuario "root"):

sysctl kern.elf64.nxstack=1
sysctl security.bsd.stack_guard_page=1
sysctl security.bsd.map_at_zero=0
sysctl kern.randompid=1000
sysctl security.bsd.see_other_uids=0

Para que estos valores sean establecidos automáticamente al iniciar el sistema, se deben agregar dentro del archivo /etc/sysctl.conf:

kern.elf64.nxstack=1
security.bsd.stack_guard_page=1
security.bsd.map_at_zero=0
kern.randompid=1000
security.bsd.see_other_uids=0

Lectura recomendada

man sysctl
man sysctl.conf

Fuente

Network Filter


Tal vez pueda interesarte


Compartí este artículo