
Los contenedores se consideran una forma estándar de implementar estos microservicios en la nube. Los contenedores son mejores que las máquinas virtuales en casi todos los sentidos excepto en la seguridad, que puede ser la principal barrera para su adopción generalizada.
Este artículo proporcionará una mejor comprensión de la seguridad de los contenedores y las técnicas disponibles para protegerlos.
Un contenedor de Linux se puede definir como un proceso o un conjunto de procesos que se ejecutan en el espacio de usuario que está aislado del resto del sistema por diferentes herramientas del kernel.
Los contenedores son excelentes alternativas a las máquinas virtuales (VM). Aunque los contenedores y las máquinas virtuales brindan los mismos beneficios de aislamiento, difieren en la forma en que los contenedores brindan virtualización del sistema operativo en lugar de hardware. Esto los hace livianos, más rápidos para iniciar y consume menos memoria.
Como varios contenedores comparten el mismo kernel, la solución es menos segura que las máquinas virtuales, donde tienen sus copias del sistema operativo, las bibliotecas, los recursos dedicados y las aplicaciones. Eso hace que la VM sea excelentemente segura, pero debido a su gran tamaño de almacenamiento y rendimiento reducido, crea una limitación en la cantidad total de VM que se pueden ejecutar simultáneamente en un servidor. Otras máquinas virtuales tardan mucho en arrancar.
La introducción de la arquitectura de microservicios ha cambiado la forma de desarrollar software. Los microservicios permiten el desarrollo de software en pequeños servicios independientes autónomos. Esto hace que la aplicación sea más fácil de escalar y proporciona agilidad.
Si es necesario reescribir una parte del software, se puede hacer fácilmente cambiando solo esa parte del código sin interrumpir ningún otro servicio, lo que no era posible con el núcleo monolítico.
1) Características del núcleo de Linux
una. Espacios de nombres
Los espacios de nombres aseguran el aislamiento de los recursos para los procesos que se ejecutan en un contenedor con respecto a los demás. Dividen los recursos del kernel para diferentes procesos. Un conjunto de procesos en un espacio de nombres separado verá un conjunto de recursos mientras que otro conjunto de procesos verá otro. Los procesos en diferentes ven diferentes ID de proceso, nombres de host, ID de usuario, nombres de archivo, nombres para acceso a la red y alguna comunicación entre procesos. Por lo tanto, cada espacio de nombres del sistema de archivos tiene su tabla de montaje privada y su directorio raíz.
Este aislamiento se puede extender al proceso secundario que se ejecuta dentro de un contenedor. Por ejemplo, si hay un PID 1 asignado a un proceso en un contenedor, el mismo PID 1 también se puede asignar a cualquier otro proceso secundario utilizando el espacio de nombres PID.
De manera similar, se pueden aplicar otros espacios de nombres como red, montaje, PID, usuario, UTS, IPC y tiempo para aislar diferentes recursos en un contenedor.
Sin embargo, una limitación con los espacios de nombres es que algunos recursos aún no son conscientes de los espacios de nombres. Por ejemplo dispositivos.
b. Grupos de control (CGroups)
Limitan y aíslan el uso de recursos como el tiempo de ejecución de la CPU, la memoria, la E/S del disco y la red entre los grupos de procesos definidos por el usuario que se ejecutan en un sistema.
A diferencia de los espacios de nombres, los cgroups limitan la cantidad de recursos que se pueden usar, mientras que los espacios de nombres controlan qué recursos puede ver un contenedor.
C. Capacidades
Las implementaciones de Linux distinguen dos categorías de procesos: procesos privilegiados (superusuario o raíz) y procesos sin privilegios. Los procesos con privilegios omiten todas las verificaciones de permisos del kernel, mientras que los procesos sin privilegios están sujetos a una verificación de permisos completa basada en las credenciales del proceso.
Pero en el caso de los contenedores, esas opciones binarias pueden ser problemáticas porque proporcionar todo el contenedor para tener privilegios completos de root puede ser peligroso.
Las capacidades convierten esta dicotomía en un control de acceso detallado. Se puede asignar un conjunto de capacidades al contenedor que podría reducir las amenazas operativas raíz del contenedor.
d. Modo de Cómputo Seguro (Seccomp)
Seccomp se puede utilizar para restringir las acciones disponibles dentro del contenedor. Restringe el proceso para realizar algunas llamadas al sistema predefinidas particulares desde el espacio del usuario al espacio del núcleo. Si el proceso intenta cualquier otra llamada al sistema, el kernel lo finaliza. Una gran cantidad de llamadas al sistema están expuestas a cada proceso de espacio de usuario, y muchas de ellas no son necesarias. Restringirlos reduce la superficie total del kernel expuesta a la aplicación.
seccomp-bpf es una extensión de seccomp que permite filtrar las llamadas del sistema mediante una política configurable. La combinación de llamadas restringidas y permitidas se organiza en perfiles, y se pueden pasar diferentes perfiles a diferentes contenedores. Brinda un control más detallado que las capacidades, lo que brinda a un atacante una cantidad limitada de llamadas al sistema desde el contenedor durante un compromiso de seguridad.
2) Módulos de seguridad de Linux (LSM)
Para comprender el funcionamiento de los LSM, echemos un vistazo a los objetos del núcleo.
Objetos del núcleo
Cada objeto del kernel es simplemente un bloque de memoria asignado por el kernel. Mantiene la información sobre los objetos en una estructura de datos a la que solo puede acceder el kernel. El sistema crea y manipula varios tipos de objetos del núcleo, que incluyen objetos de token de acceso, objetos de evento, objetos de archivo, objetos de asignación de archivos, objetos de puerto de finalización de E/S, objetos de trabajo, objetos de ranura de correo, objetos mutex, objetos de canalización, objetos de proceso, objetos de semáforo, objetos de hilo y objetos de temporizador de espera.

LSM
La interfaz LSM media el acceso a los objetos internos del núcleo colocando ganchos en el núcleo justo antes de su acceso. Responde fundamentalmente a la pregunta: «Que
El módulo de seguridad de Linux (LSM) proporciona controles basados en MAC con cambios mínimos en el propio kernel. LSM permite que los módulos medien el acceso a los objetos del kernel colocando ganchos en el código del kernel justo antes del acceso. El marco LSM proporciona un mecanismo para que las nuevas extensiones del kernel enganchen varias comprobaciones de seguridad. El nombre «módulo» es un poco inapropiado ya que estas extensiones no son módulos del kernel cargables, sino que se seleccionan durante el tiempo de compilación.
Algunos LSM de uso común son:
SELinux (Linux con seguridad mejorada) – es la implementación MAC predeterminada en las distribuciones de Linux basadas en RedHat. Es conocido por ser poderoso y complejo. SELinux se basa en atributos, lo que significa que los identificadores de seguridad de los archivos se almacenan en atributos de archivo extendidos en el sistema de archivos. SELinux define controles de acceso para las aplicaciones, procesos y archivos en un sistema. Utiliza políticas de seguridad, que son un conjunto de reglas que le dicen a SELinux a qué se puede o no acceder, para hacer cumplir el acceso permitido por una política.
Armadura de aplicaciones – Implementa una política centrada en tareas, con «perfiles» de tareas que se crean y cargan desde el espacio de usuario. Los perfiles pueden permitir capacidades como acceso a la red y acceso a socket sin formato. Las políticas de seguridad de AppArmor definen completamente a qué recursos del sistema pueden acceder las aplicaciones individuales y con qué privilegios. Las tareas en el sistema que no tienen un perfil definido se ejecutan en un estado no confinado equivalente a los permisos estándar de Linux DAC.
Existen mecanismos de protección de contenedores basados en hardware que protegen los contenedores de otros contenedores y de un host malicioso o comprometido. Este artículo se centró en el aspecto de la seguridad de los contenedores basados en software.
Fue una breve introducción a la seguridad de los contenedores y se relacionó principalmente con los contenedores de Linux. Si desea tener una mirada más detallada, siga los enlaces en la sección de referencia.
Referencia:
Seguridad de contenedores: problemas, desafíos y el camino a seguir
Diseño de LSM: mediar el acceso a los objetos del kernel
¿Qué es SELinux?