Introducción a la seguridad de contenedores | diario de linux

Los contenedores se consideran la forma estándar de implementar estos microservicios en la nube. Los contenedores son mejores que las máquinas virtuales en casi todos los sentidos, con la excepción de la seguridad, que es quizás el principal obstáculo para su adopción generalizada.

Este artículo proporciona una mejor comprensión de la seguridad de los contenedores y las técnicas disponibles para protegerla.

Un contenedor de Linux se puede definir como un proceso o conjunto de procesos que se ejecutan en el espacio del usuario y están aislados del resto del sistema mediante varias herramientas del núcleo.

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 usa menos memoria.

Dado que 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. Esto hace que las máquinas virtuales sean extremadamente seguras, pero su gran tamaño de memoria y rendimiento reducido limitan la cantidad total de máquinas virtuales que pueden ejecutarse simultáneamente en un servidor. Otras máquinas virtuales tardan mucho en arrancar.

La llegada de la arquitectura de microservicios ha cambiado la forma en que se desarrolla el software. Los microservicios permiten que el software se desarrolle en servicios pequeños, autónomos e independientes. Esto facilita el escalado de la aplicación y garantiza la agilidad.

Si es necesario reescribir alguna pieza de software, se puede hacer fácilmente cambiando solo esa pieza de código sin interrumpir otros servicios, lo que no era posible con el kernel monolítico.

Casos de uso y soluciones para requisitos de protección

Contenidos

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 de los de los demás. Dividen los recursos del kernel para diferentes procesos. Un conjunto de procesos en un espacio de nombres separado ve un conjunto de recursos, mientras que otro conjunto de procesos ve 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 en un contenedor. Por ejemplo, si a un proceso en un contenedor se le asigna un PID 1, el mismo PID 1 también se puede asignar a cualquier otro proceso secundario que use el espacio de nombres PID.

Asimismo, se podrían aplicar otros espacios de nombres como network, mount, pid, user, uts, ipc y time 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 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. Habilidades

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, estas opciones binarias pueden ser problemáticas, ya que puede ser peligroso otorgar privilegios completos de raíz a todo el contenedor.

Las funciones convierten esta dicotomía en un control de acceso detallado. Se pueden asignar varias capacidades al contenedor que podrían mitigar las amenazas raíz operativas del contenedor.

es decir. Modo de cálculo seguro (Seccomp)

Seccomp se puede utilizar para limitar las acciones disponibles dentro del contenedor. Restringe el proceso de realizar algunas llamadas de sistema predefinidas específicas desde el espacio del usuario al espacio del núcleo. Si el proceso intenta otras llamadas al sistema, el núcleo lo elimina. Cada proceso de espacio de usuario está sujeto a una gran cantidad de llamadas al sistema, muchas de las cuales son innecesarias. Su limitación reduce el área superficial total del kernel expuesta a la aplicación.

seccomp-bpf es una extensión de seccomp que permite el filtrado de llamadas del sistema mediante una política configurable. La combinación de llamadas restringidas y permitidas se coloca en perfiles, y diferentes perfiles se pueden propagar a diferentes contenedores. Proporciona un control más detallado que las funciones y le da al atacante un número limitado de llamadas al sistema desde dentro del contenedor durante una brecha de seguridad.

2) Módulos de seguridad de Linux (LSM)

Para comprender cómo funcionan los LSM, echemos un vistazo a los objetos del kernel.

objetos del núcleo

Cada objeto del kernel es simplemente un bloque de memoria asignado por el kernel. Almacena 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, incluidos objetos de token de acceso, objetos de evento, objetos de archivo, objetos de mapa de archivo, objetos de puerto de finalización de E/S, objetos de trabajo, objetos de ranura de correo, objetos de exclusión mutua, objetos de tubería, objetos de proceso, objetos de semáforo , objetos de subprocesos y objetos de temporizador de espera.

Arquitectura de enlace LSM

LSM

La interfaz LSM media el acceso a los objetos internos del kernel colocando ganchos en el kernel justo antes de que se acceda a ellos. Básicamente responde a la pregunta: «Puede en ejecutar», por ejemplo: «¿Puede un servidor web acceder a los archivos en los directorios de inicio de los usuarios?». Los tipos de objetos protegidos incluyen archivos, inodos, estructuras de tareas, credenciales y objetos de comunicación entre procesos. La manipulación de estos objetos proporciona la forma principal de representar cómo procesan los procesos. interactuar con su entorno, y al especificar cuidadosamente las interacciones permitidas, un administrador de seguridad puede dificultar que un atacante aproveche un error en un programa para pasar a otras áreas del sistema.

El módulo de seguridad de Linux (LSM) proporciona controles basados ​​en MAC con cambios mínimos en el propio núcleo LSM permite que los módulos brinden acceso a los objetos del núcleo colocando ganchos en el código del núcleo justo antes del acceso. El marco LSM proporciona un mecanismo para varias comprobaciones de seguridad que pueden enganchar las nuevas extensiones del kernel. El nombre «módulo» es un poco engañoso ya que estas extensiones no son módulos del kernel cargables, sino que se eligen 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 archivos 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 y qué no se puede acceder, para hacer cumplir el acceso permitido por una política.

Armadura de aplicaciones – Implementa una política centrada en tareas, donde los «perfiles» de tareas se crean y cargan desde el espacio del usuario. Los perfiles pueden permitir funciones como el acceso a la red y el acceso a socket sin procesar. 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 están perfiladas se ejecutan en un estado sin restricciones que se ajusta a los privilegios DAC estándar de Linux.

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, en su mayoría, se relacionó con los contenedores de Linux. Si desea echar un vistazo más de cerca, 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?

Deja una respuesta

Tu dirección de correo electrónico no será publicada.