Bastionado de sistemas: el caso de Linux

Fecha de publicación 02/03/2023
Autor
INCIBE (INCIBE)
Bastionado de sistemas: el caso de Linux

El bastionado o hardening es una labor fundamental para reforzar la seguridad de los sistemas y protegerlos ante ataques internos y externos. Al aplicar diferentes técnicas combinadas, se hace más difícil para un atacante comprometer el sistema, velando por la confidencialidad, integridad y disponibilidad de los datos almacenados en él. El bastionado de sistemas se aplica a menudo en entornos empresariales, donde se requiere proteger los datos y recursos críticos de la empresa. Sin embargo, es igualmente importante en cualquier contexto en el que se necesite proteger el sistema y controlar el acceso a los recursos.

¿Qué es el bastionado de sistemas?

El bastionado de sistemas es un proceso de fortalecimiento de la seguridad por defecto de un sistema mediante la aplicación de principios como los de "mínima exposición", "defensa en profundidad", “mínimo privilegio” o “confianza cero”.

  • Mínima exposición: consiste en reducir al mínimo el número de componentes y servicios del sistema que se encuentren expuestos al exterior, ocultando o eliminando aquellos que no sean esenciales para el funcionamiento del sistema o no se utilicen. De esta manera, se reduce la superficie de ataque del sistema, es decir, la cantidad de componentes y servicios que pueden ser atacados por un atacante.
  • Defensa en profundidad: implementación de medidas de seguridad en varias capas o niveles del sistema. La idea es que, en caso de que un atacante consiga superar una capa de seguridad, se encuentre con otras capas adicionales que protegen el sistema.
  • Mínimo privilegio: esta práctica se basa en el concepto de que cada usuario o proceso tenga el mínimo de privilegios, solamente los necesarios para realizar su trabajo. Esto significa que cada usuario o proceso debe tener acceso solo a los recursos y funciones que necesita para su trabajo, y no a más.
  • Confianza cero: también conocido como zero trust, es un enfoque que se basa en la idea de que, por defecto, se debe de desconfiar de todos los usuarios o dispositivos, lo cual exige verificar la identidad y la actividad de todos los usuarios y dispositivos.

Bastionado básico en sistemas Linux

Los sistemas basados en Linux se utilizan ampliamente en servidores y dispositivos embebidos de IOT. A continuación, se plantean algunas recomendaciones para aplicar sobre estos sistemas, siempre teniendo en cuenta que para llevar a cabo un bastionado es necesario organizarse y planificarse, asignando prioridades, ya que requiere de tiempo y recursos por parte de los equipos responsables.

Configuración del arranque:

Desde la BIOS, deshabilitar el autoarranque de dispositivos externos en el boot (como USB o discos externos), o la posibilidad de modificar la partición de arranque por defecto. Además, si utilizas algún gestor de arranque, como GRUB, protégelo mediante el uso de contraseñas. Por último, es una práctica recomendada no iniciar la sesión, como usuario root. Sudo mejora en gran medida la seguridad del sistema sin compartir las credenciales con otros usuarios y administradores.

Configuración de usuarios y grupos:

Es importante establecer permisos adecuados para proteger la seguridad y la integridad de los archivos y directorios. Los permisos de archivos y directorios determinan quién tiene acceso a ellos y qué acciones pueden realizarse con ellos. En Linux, los permisos o derechos que los usuarios pueden tener sobre determinados archivos y/o contenidos se establecen en tres niveles claramente diferenciados (propietario, grupo y otros).

  • Archivos del sistema: los archivos del sistema, como los de configuración del kernel y los archivos de programas del sistema, deberían tener permisos de lectura y ejecución para el propietario administrador y el grupo, y permisos de lectura restrictiva para otros. Esto permite al sistema operativo acceder y utilizar estos archivos, pero impide que los usuarios accedan, modifiquen o eliminen accidentalmente estos archivos importantes.
  • Archivos del usuario: los archivos del usuario, como los documentos, imágenes y ficheros deberían tener permisos de lectura, escritura y ejecución para el propietario y permisos de lectura restrictiva o selectiva para el grupo y otros. Esto permite al propietario del archivo acceder y modificarlo, pero impide que otros usuarios accedan, lo modifiquen o lo eliminen sin autorización.

Por defecto en Linux, cuando creas un nuevo fichero, se le asignan unos permisos con los que estás permitiendo que otro usuario del sistema pueda al menos leer ese fichero. Y cuando creas un directorio, puedes hacer un listado de los ficheros que contenga.

listado de ficheros en un directorio

Para configurar correctamente estos permisos por defecto, habría que modificar el fichero “/etc/bash.bashrc” o “/etc/profile” y agregar “umask 027” al final, para cambiar la máscara de los ficheros y directorios. Con esto se bloquea completamente el acceso al resto de usuarios de la máquina a todos los ficheros que se creen en el futuro en nuestras cuentas de usuario.

Además, es interesante mencionar las herramientas adicionales, como SE Linux y el módulo AppArmor, que se pueden utilizar para restringir los permisos y acciones de los procesos y programas en el sistema, protegiendo así el kernel

Configuración de acceso:

Es recomendable configurar políticas de contraseña que establezcan requisitos mínimos, como su longitud y complejidad. Esto puede ayudar a proteger las contraseñas de los usuarios.

  • Para un usuario: por ejemplo, para forzar a un usuario a cambiar su contraseña al iniciar sesión la próxima vez, se puede utilizar el siguiente comando:

para un usuario

Este comando establece la fecha de vencimiento de la contraseña en la fecha actual, lo que forzará al usuario a cambiarla al iniciar sesión la próxima vez. También puedes utilizar el comando "chage" para establecer una política de contraseña como la frecuencia con la que se deben cambiar las mismas. Por ejemplo, para establecer una política de que obligue al usuario a cambiar su contraseña cada 90 días, puedes utilizar el siguiente comando:

para un usuario 2

Este comando establece el período máximo de contraseña en 90 días, lo que significa que el usuario deberá cambiar su contraseña cada 90 días para cumplir con la política.

  • Para todos los usuarios: para forzar a todos los usuarios del sistema a cambiar sus contraseñas al iniciar sesión la próxima vez, puedes utilizar el comando "chage", junto con el comando "awk" y el archivo "/etc/shadow". El archivo "/etc/shadow" almacena información sobre las contraseñas de los usuarios del sistema, incluyendo la fecha de vencimiento. Del mismo modo, también utilizar el comando "awk" para procesar este archivo y modificar la fecha de vencimiento de las contraseñas de todos los usuarios al mismo tiempo. Por ejemplo, para forzar a que todos los usuarios las cambien al iniciar sesión la próxima vez, puedes utilizar el siguiente comando:

para todos los usuarios

Este comando utiliza "awk" para procesar el archivo "/etc/shadow" y extraer los nombres de usuario de cada línea. Luego, utiliza "xargs" para enviar cada nombre de usuario como argumento al comando "chage" para establecer la fecha de vencimiento de la contraseña en la fecha actual.

Configuración de servicios:

Es importante insistir en que cada sistema y entorno de uso es diferente y requerirá un conjunto único de servicios y configuraciones de seguridad. Por lo tanto, no existe una lista predeterminada de servicios que deban deshabilitarse en todos los casos para lograr un bastionado óptimo de la seguridad en Linux. Sin embargo, algunos servicios que podrían considerarse para deshabilitar en un entorno de producción de servicio general son los siguientes:

  • Servicios innecesarios: es importante evaluar qué servicios son realmente necesarios para el funcionamiento del sistema y deshabilitar aquellos que no sean imprescindibles. Por ejemplo, el pegado de texto inseguro en la terminal.
  • Servicios de red inseguros: es significativo evitar utilizar protocolos de red inseguros, como telnet, rsh, rlogin, vsftpd… Sí hay alternativas más seguras disponibles, como SSH o SFTP.
  • Servicios que exponen vulnerabilidades conocidas: si un servicio tiene una vulnerabilidad conocida que no ha sido parcheada, es posible que sea necesario deshabilitarlo temporalmente hasta que se publique un parche de seguridad.

Configuración del sistema de ficheros:

Los sistemas de ficheros Ext2, Ext3 y Ext4 son sistemas utilizados en Linux. Ext4 es la última versión del sistema de archivos Ext y ofrece mejoras relevantes en términos de rendimiento y seguridad en comparación con sus predecesores. Algunas de las mejoras de seguridad de Ext4 incluyen la verificación de la integridad del sistema de archivos, la capacidad de recuperar archivos eliminados y la capacidad de proteger los archivos de escritura no intencional. Por eso, su uso es más recomendable.

Configuración de Red:

Algunas medidas de seguridad que pueden ser útiles para proteger la red en un entorno Linux son las siguientes:

  • IDS: hay varias opciones disponibles para utilizar un sistema de detección de intrusiones en host (HIDS) o en red (NIDS) para Linux, como OSSEC, Tripwire y AIDE. Cada opción tiene sus propias características y funcionalidades y se puede elegir según las necesidades y requisitos del entorno.
  • SSH: se debería utilizar Secure Shell (SSH) para conectarse y administrar remotamente los servidores de forma segura. Se recomienda:
    • Utilizar claves SSH en lugar de contraseñas: las claves SSH proporcionan una forma más segura de autenticación que las contraseñas, ya que utilizan criptografía de clave pública/privada en lugar de contraseñas transmitidas por texto plano.
    • Configurar el servidor SSH para utilizar un puerto diferente del puerto predeterminado (22): esto puede ayudar a evitar ataques de escaneo de puertos que buscan servidores SSH utilizando el puerto predeterminado.
    • Configurar el servidor SSH para permitir únicamente el acceso de usuarios autorizados: se pueden utilizar listas de control de acceso (ACL) para permitir únicamente el acceso de usuarios autorizados al servidor SSH.
  • VPN: se debería utilizar una red privada virtual (VPN) para proteger la privacidad y la seguridad de la conexión de red. Hay varias opciones disponibles para configurar y utilizar una VPN en Linux, como OpenVPN, PPTP y L2TP/IPSec. OpenVPN, que es una opción popular y segura, mientras que PPTP y L2TP/IPSec son opciones menos seguras, pero ampliamente compatibles. Network Manager es una herramienta de configuración de red que puede facilitar la configuración y utilización de una VPN en Linux.
  • Doble factor de autenticación: implementar la autenticación de dos factores para mejorar la seguridad de la conexión de red y evitar el acceso no autorizado.

Configuración de firewall:

Se debería utilizar un firewall para bloquear el tráfico no deseado y proteger la red de ataques externos. Iptables es una herramienta software de firewall, que se utiliza en sistemas operativos basados en Linux para filtrar el tráfico de red y proteger el sistema de ataques externos. Funciona a nivel de paquete y permite definir reglas para permitir o bloquear el tráfico entrante o saliente en función de diferentes criterios, como el origen o el destino del paquete, el protocolo de red utilizado o el puerto de destino.

Actualizaciones de software:

Bastionar la seguridad del arranque del sistema operativo implica implementar medidas de seguridad que protejan el kernel de vulnerabilidades conocidas y eviten el acceso no autorizado o su modificación. Utiliza los respectivos administradores de paquetes en función de las distribuciones de Linux, como yum, apt-get o dpkg, para aplicar todas las actualizaciones de seguridad.

  • Actualizaciones del kernel: es importante mantener el kernel actualizado con las últimas correcciones de errores y parches de seguridad para minimizar la exposición a vulnerabilidades conocidas.
  • Uso de controladores firmados: se debería utilizar controladores firmados para garantizar que los que se cargan en el kernel son legítimos y no han sido modificados. Esto evitará la instalación de rootkits en el sistema.

Registros:

Para configurar los componentes de log y auditoría en Linux con el fin de mejorar la seguridad del sistema se puede:

  • Configurar el registro de eventos: es importante configurar el sistema de registro de eventos (syslog) para que se guarden los logs de forma adecuada y se puedan analizar de forma efectiva. Esto incluye configurar el nivel de detalle de los logs y definir dónde se deben guardarse (por ejemplo, en un servidor de logs externo).
  • Configurar la auditoría de sistema: es importante habilitar la auditoría de sistema para poder registrar y rastrear cambios y actividades sospechosas en el sistema. Esto incluye definir qué acciones se deben auditar y dónde se deben guardar los logs de auditoría. Es posible que sea necesario instalar el paquete de auditoría si no está disponible. Por ejemplo, en sistemas como Ubuntu se puede instalar el paquete "auditd" o en Red Hat el paquete “audit”.

Etapas del bastionado

El proceso de bastionado de sistemas implica varias etapas y pasos que deben seguirse para fortalecer la seguridad del sistema, algunas de las cuales son:

  • Planificar la intervención sobre los sistemas objetivo: para poder anticipar la disponibilidad de los recursos necesarios y avisar a las partes interesadas de la duración de la intervención con antelación.
  • Identificar los componentes y servicios esenciales: deben conocerse cuáles son los requisitos de funcionalidad del sistema. En esta etapa, debes evaluar qué componentes y servicios son esenciales para el funcionamiento del sistema y cuáles no son necesarios.
  • Realizar una copia de seguridad del sistema: antes de aplicar cualquier configuración de seguridad es necesario contar con una copia del sistema que nos permita realizar una restauración del mismo, en caso de que sea necesario.
  • Realización del bastionado en un entorno de prueba: la aplicación de cualquier configuración sobre un sistema, ya sea de seguridad o no puede impactar sobre el funcionamiento del mismo, por lo tanto, es conveniente realizar un primer bastionado sobre ese sistema, en un entorno de prueba o preproducción.
  • Evaluar el resultado del bastionado: en este punto tendremos que evaluar si la configuración de seguridad cumple con el objetivo previsto, y si además el funcionamiento del sistema sigue siendo el esperado. La realización de tests funcionales y de seguridad suele ser muy útil en este punto.
  • Aplicar el bastionado en el entorno de producción: si los resultados de los tests de bastionado en el entorno seguro son exitosos, es el momento de aplicar la configuración de seguridad en el entorno de producción.
  • Asegurar el correcto funcionamiento de todo: finalmente, realizaremos una última evaluación de que el entorno de producción se encuentre funcionando correctamente en armonía con el resto de su ecosistema. Avisaremos a los usuarios de la disponibilidad del mismo, y concluiremos la intervención.

Conclusión

Lamentablemente, no existe una receta mágica para bastionar un sistema. Cada bastionado debe realizarse teniendo en cuenta aspectos, como el tipo de sistema objetivo, el ecosistema donde se enmarca y el nivel de servicio que se espera que ofrezca, incluso dentro de Linux, las configuraciones pueden variar entre las diferentes distribuciones existentes.

El compromiso entre seguridad y funcionalidad es otra consideración importante en el bastionado de sistemas, ya que por un lado, es importante fortalecer la seguridad del sistema para protegerlo de ataques, y por otro, también es importante que el sistema sea funcional y proporcione las prestaciones necesarias para realizar su función. Por lo tanto, será necesario encontrar el equilibrio entre la seguridad y la funcionalidad. Por ejemplo, al eliminar componentes no esenciales del sistema se puede mejorar la seguridad, pero también se pueden eliminar algunas funcionalidades básicas del sistema, con posibles repercusiones en el negocio. Es muy importante evaluar cuáles son los componentes y servicios esenciales para el sistema y cuáles se pueden eliminar sin afectar significativamente a la funcionalidad del mismo.