Gentoo Hardened

En este post voy a hablar sobre una distribución, que por alguna misteriosa razón que no llego a entender, no suele ser utilizada. Hablo por supuesto, de Gentoo en su modalidad “Hardened”.

(N.d.A: Los siguientes párrafos evangelizan hacen una introducción a Gentoo, por lo que si el lector ya la conoce, puede saltar directamente a Gentoo Hardened)

Gentoo es una distribución rolling-release (lo que quiere decir que la distribución se actualiza continuamente con nuevas funcionalidades, además de para solucionar bugs). No obstante, su mayor característica es que los “paquetes” han de ser compilados por el usuario con una herramienta llamada “emerge”, que forma parte del sistema Portage.

Seguramente, el lector debe estar pensando que compilarse los propios paquetes es una pérdida de tiempo y que mejor gastar una Ubuntu / Debian / CentOS que ya te lo dan todo hecho. Pero, estamos en el año 2014 y si bien a comienzos del año 2000 la instalación de un sistema de escritorio podía durar una semana, con una máquina moderna podemos tener un sistema funcional en una noche, siempre y cuando sepamos lo que estamos haciendo. Y fíjense que estoy hablando de un sistema de escritorio, donde suele haber mayor cantidad software (y de mayor tamaño), que en un servidor.

Utilizar Gentoo tiene una serie de ventajas, de las que destacan las siguientes:

  • El sistema es mucho más flexible: se puede mezclar software de distintas ramas (Gentoo dispone de dos ramas: testing y estable) sin problemas, ya que todo se compila y se enlaza a medida, con una granularidad definida por el usuario, y no por los mantenedores de la distribución.
  • Gentoo soporta varias ramas de cada paquete, y no se centra en mantener la última versión ofrecida por el desarrollador. Por ejemplo, ahora mismo Gentoo soporta PHP en sus versiones 5.3, 5.4, 5.5 y 5.6 (este último hard-masked), y dentro de cada rama, soporta varias sub-versiones, como por ejemplo PHP 5.5.7, 5.5.9 y 5.5.10.
  • El software se compila para las características de la máquina. Basta con introducir la variable CFLAGS con el valor “-march=native -O2 -pipe” en el fichero /etc/portage/make.conf y GCC hará todo el trabajo por nosotros, optimizando incluso para la cantidad de líneas de caché de las que dispongamos.
  • El sistema portage define las “USE FLAGS”, que no son más que banderas que activan o desactivan características del software. Por ejemplo, mi sistema puede no tener un dispositivo Bluetooth. Entonces, ¿bajo qué lógica tengo que instalar dependencias de Bluetooth?
  • Si alguien desarrolla un parche para un software que añade alguna característica que necesito o veo atractiva, en la mayoría de distribuciones debo bajarme los fuentes, compilarlos e instalarlos a mano, haciendo que con el tiempo, el sistema de ficheros esté lleno de basura porque esos ficheros no están bajo el control del gestor de paquetes de turno. En Gentoo basta con dejar caer el parche en “/etc/portage/patches//<paquete>”. Portage se encarga de parchear y compilar por nosotros. Y cuando queramos desinstalar el software, quedará tan limpio como estaba antes.
  • Gentoo soporta paquetes binarios. Por ejemplo, se puede hacer uso de una máquina para compilar binarios que serán distribuidos al resto de dispositivos. Si nos preocupa la optimización, podríamos crear una serie de chroots, cada uno con la configuración de cada máquina objetivo, y que la máquina principal genere binarios optimizados para ellas. También se pueden utilizar sistemas de compilación distribuida, con los que se puede aligerar la carga de un sistema.

Gentoo Hardened

En el mundo de la seguridad (que al fin y al cabo es a lo que nos dedicamos), Gentoo aporta una serie de ventajas, que bajo mi opinión superan la desventaja, en tiempo, que supone tener que compilar software.

Dentro de Gentoo existe un proyecto llamado “Gentoo Hardened” cuyo fin es proporcionar una serie de medidas extra de seguridad mediante una serie de tecnologías:

  • GRSECURITY: son un conjunto de parches para el Kernel que añaden una serie de mejoras de cara a la seguridad muy interesantes, incluyendo un sistema completo de RBAC (Role Based Access Control). Destacan:
    • Protecciones en la memoria: aumento de la aleatoriedad en ASLR, prohibición de realizar ciertas operaciones de I/O y un modo de respuesta a exploits: si quien ejecuta el exploit es root, el sistema entra en PANIC. Si lo ejecuta cualquier otro usuario, el Kernel mata todos los procesos del usuario, lo echa del sistema y no deja que vuelva a acceder hasta el próximo reinicio.
    • Protecciones en el sistema de ficheros: restricciones en /proc, de modo que los usuarios sólo sean capaces de ver sus propios procesos, restricciones en los enlaces a ficheros, restricciones para sysfs/debugfs y una serie de restricciones para evitar escapar de una jaula chroot, entre otros.
    • Logs extendidos: permite registrar casi la totalidad de lo que ocurre en el sistema: llamadas a la función exec, llamadas a (u)mount, etc. También incluye una opción que permite añadir un fichero llamado “ipaddr” dentro de /proc/<pid/>, lo que permite conocer la IP origen del usuario que está ejecutando dicho proceso.
    • Protecciones en la ejecución de binarios, en las que destaca TPE o Trusted Path Execution, cuya funcionalidad es la de permitir únicamente la ejecución de binarios que se encuentren en directorios en los que única y exclusivamente pueda escribir el usuario root.
    • Una serie de protecciones en los protocolos TCP y UDP.
  • PAX: es un parche para el Kernel que ofrece protecciones contra desbordamientos de buffer, desbordamiento de heap y similares. También permite establecer marcas de no-ejecución en la memoria, incluyendo aquellas arquitecturas que por diseño de hardware no lo soportan, y aumentar o añadir aleatoriedad en las llamadas de sistema, incluyendo las direcciones de memoria asignadas mediante mmap. Por último, PAX añade una serie de opciones realmente útiles, como por ejemplo la obligatoriedad de borrar las páginas de memoria una vez son liberadas, evitando leaks de datos.
  • PIE/SSP. PIE (Position Independent Code) no proporciona una mejora en la seguridad por si mismo, pero en combinación con PAX y su aleatorización del espacio de direcciones permite protegerse de ataques mediante exploits que se basan en el conocimiento del offset del código ejecutable en el binario, como ataques de tipo return-to-libc. A su vez, SSP (Stack Smashing Protection) es una protección contra desbordamientos de memoria en espacio de usuario. SSP funciona de manera diferente a PAX, por lo que si un ataque esquivase PAX, podría ser detenido por SSP.

A continuación, se muestran los resultados de la herramienta “paxtest” en modo “blackhat”. Esta herramienta realiza una serie de pruebas (o ataques inocuos) con el fin de descubrir si el sistema es vulnerable o no. Paxtest es software libre y puede ser descargado desde http://www.grsecurity.net/~spender/. La imagen muestra un sistema Gentoo (izquierda) y un sistema Gentoo Hardened (derecha), donde se puede observar como Gentoo Hardened ha protegido mejor el sistema.

Gentoo (Hardened) también ofrece sistemas MAC (Mandatory Access Control), como SELinux, AppArmor o Grsecurity, con los cuales el administrador de sistemas puede delimitar qué tareas puede realizar cada usuario. Combinado con lo expuesto anteriormente, hace que Gentoo Hardened sea una opción a considerar cuando se trata de bastionar un sistema crítico.

Para finalizar, me gustaría exponer algunas de las desventajas de Gentoo Hardened: es altamente difícil ejecutar código propietario en estos sistemas, por lo que instalarla para un sistema de escritorio es altamente desaconsejable (aunque no deja de ser un buen método para divertirse y aprender los fines de semana). A su vez, las soluciones de virtualización más conocidas tampoco funcionan, lo cual hay que tenerlo en cuenta antes de dar el paso.

Comments

  1. Excelente la explicación y el software, gracias!

    Saludos