10 capas de seguridad para contenedores Linux

Los contenedores proporcionan una manera fácil de empaquetar aplicaciones y entregarlas sin problemas desde el desarrollo hasta la prueba y la producción. Esto ayuda a garantizar la coherencia en una variedad de entornos, incluidos servidores físicos, máquinas virtuales (VM) o nubes privadas o públicas. Estos beneficios llevan a las organizaciones a adoptar contenedores rápidamente para desarrollar y administrar fácilmente las aplicaciones que agregan valor comercial.

Las empresas requieren una seguridad sólida, y cualquiera que ejecute servicios esenciales en contenedores preguntará: “¿Son seguros los contenedores?” y “¿Podemos confiar en los contenedores con nuestras aplicaciones?”

Asegurar contenedores es muy parecido a asegurar cualquier proceso en ejecución. Debes pensar en la seguridad en todas las capas del conjunto de soluciones antes de implementar y ejecutar tu contenedor. También debes pensar en la seguridad en toda la aplicación y el ciclo de vida del contenedor.

Debes probar estos 10 elementos clave para asegurar diferentes capas del conjunto de solución de contenedor y diferentes etapas del ciclo de vida del contenedor.

1. El sistema operativo host del contenedor y multicliente

Los contenedores facilitan a los desarrolladores construir y promover una aplicación y sus dependencias como una unidad y aprovechar al máximo los servidores. Esto al habilitar implementaciones de aplicaciones de múltiples clientes en un host compartido. Es fácil implementar múltiples aplicaciones en un único host, girando y apagando contenedores individuales según sea necesario.

Para aprovechar al máximo esta tecnología de empaquetado e implementación, el equipo de operaciones necesita el entorno adecuado para ejecutar contenedores. Las operaciones necesitan un sistema operativo que pueda asegurar los contenedores en los límites. Esto para asegurar el núcleo del host de los escapes de contenedores y asegurando los contenedores entre sí.

Los contenedores son procesos de Linux con aislamiento y confinamiento de recursos que te permiten ejecutar aplicaciones de espacio aislado en un núcleo host compartido. El enfoque para proteger los contenedores debe ser el mismo que para proteger cualquier proceso en ejecución en Linux.

Usar los privilegios es importante y sigue siendo la mejor práctica. Aún mejor es crear contenedores con el menor privilegio posible. Los contenedores deben ejecutarse como usuario, no como root.

A continuación, debes utilizar los múltiples niveles de seguridad disponibles en Linux. Los espacios de nombres de Linux, Linux con seguridad mejorada (SELinux), cgroups, capacidades y modo de computación segura (seccomp). Estas son cinco de las características de seguridad disponibles para proteger los contenedores.

2. Contenido del contenedor (debes usar fuentes confiables)

Cuando se trata de seguridad, lo que hay dentro de tu contenedor es importante. Desde hace algún tiempo, las aplicaciones e infraestructuras se han combinado de componentes fácilmente disponibles. Muchos de estos son paquetes de código abierto. Por ejemplo, el sistema operativo Linux, el servidor web Apache, la plataforma de aplicaciones empresariales Red Hat JBoss, PostgreSQL y Node.js.

Las versiones en contenedores de estos paquetes ahora también están disponibles, por lo que no tienes que crear el tuyo propio. Pero, al igual que con cualquier código que descargue de una fuente externa, debes saber dónde se originaron los paquetes. Además, quién los creó y si hay algún código malicioso dentro de ellos.

3. Registros de contenedores (acceso seguro a imágenes de contenedores)

Tus equipos están compilando contenedores que superponen el contenido sobre las imágenes de contenedores públicos descargados. Por lo tanto, es fundamental administrar el acceso y la promoción de las imágenes de contenedores descargadas. Asimismo, las imágenes compiladas internamente de la misma manera que se administran otros tipos de binarios.

Muchos registros privados admiten el almacenamiento de imágenes de contenedores. Debes seleccionar un registro privado que ayude a automatizar las políticas para el uso de imágenes de contenedor almacenadas en el registro.

4. Seguridad y el proceso de compilación

En un entorno en contenedores, el proceso de compilación de software es la etapa del ciclo de vida donde el código de la aplicación se integra con las bibliotecas de tiempo de ejecución necesarias.

Administrar este proceso de compilación es clave para asegurar el conjunto de software. Adherirse a una filosofía de “compilar una vez, desplegar en todas partes” asegura que el producto del proceso de compilación es exactamente lo que se implementa en la producción. También es importante mantener la inmutabilidad de tus contenedores. En otras palabras, no apliques parches a los contenedores en ejecución; mejor debes recompilarlos y volver a implementarlos.

Ya sea que trabajes en una industria altamente regulada o simplemente desees optimizar los esfuerzos de tu equipo. Debes diseñar tu gestión de imagen de contenedor y crear un proceso para aprovechar las capas del contenedor. Esto para implementar la separación de control, de modo que:

  • El equipo de operaciones gestiona las imágenes base
  • Los arquitectos administran middleware, tiempos de ejecución, bases de datos y otras soluciones similares
  • Los desarrolladores se centran en las capas de aplicación y solo escriben código

Finalmente, debes firmar tus contenedores personalizados para asegurarte de que no se modifiquen entre la compilación y la implementación.

5. Controlar lo que se puede implementar dentro de un clúster

Si algo falle durante el proceso de compilación. U Ocurren situaciones en las que se descubre una vulnerabilidad después de que se haya implementado una imagen. Debes agregar otra capa de seguridad en forma de herramientas para la implementación automatizada basada en políticas.

Echemos un vistazo a una aplicación creada con tres capas de imagen de contenedor: núcleo, middleware y la capa de aplicación. Se descubre un problema en la imagen central y esa imagen se recompila. Una vez que se completa la compilación, la imagen se inserta en el registro de la plataforma del contenedor. La plataforma puede detectar que la imagen ha cambiado. Para las compilaciones que dependen de esta imagen y tienen activadores definidos, la plataforma reconstruirá automáticamente la imagen de la aplicación, incorporando las bibliotecas fijas.

Una vez que se completa la compilación, la imagen se inserta en el registro interno de la plataforma del contenedor. Detecta inmediatamente los cambios en las imágenes en su registro interno y, para las aplicaciones en las que se definen los disparadores, implementa automáticamente la imagen actualizada. De esta manera se asegura que el código que se ejecuta en producción sea siempre idéntico a la imagen actualizada más recientemente. Todas estas capacidades trabajan juntas para integrar las capacidades de seguridad en tu proceso continuo de integración y despliegue continuo (CI/CD).

6. Orquestación de contenedores: asegurar la plataforma de contenedores

Por supuesto, las aplicaciones rara vez se muestran en un solo contenedor. Incluso las aplicaciones simples suelen tener una interfaz, un servidor y una base de datos. Y la implementación de aplicaciones modernas de microservicios en contenedores significa desplegar múltiples contenedores, a veces en el mismo host. En otras ocasiones distribuidos a través de múltiples hosts o nodos, como se muestra en este diagrama.

Al administrar la implementación de contenedores a escala, debes tener en cuenta:

  • ¿Qué contenedores deben implementarse en qué hosts?
  • Además, ¿Qué host tiene más capacidad?
  • ¿Qué contenedores necesitan acceso entre sí? ¿Cómo se descubrirán?
  • ¿Cómo controlará el acceso y la administración de los recursos compartidos, como la red y el almacenamiento?
  • Asimismo, ¿Cómo vas a monitorear el estado del contenedor?
  • ¿Cómo escalarás automáticamente la capacidad de la aplicación para satisfacer la demanda?
  • ¿Cómo habilitarás el autoservicio para desarrolladores mientras cumples con los requisitos de seguridad?

Dada la gran cantidad de capacidades tanto para desarrolladores como para operadores, el control de acceso basado en roles es un elemento crítico de la plataforma de contenedores. Por ejemplo, los servidores de administración de orquestaciones son un punto central de acceso y deben recibir el más alto nivel de escrutinio de seguridad. Las API´s son clave para automatizar la administración de contenedores a escala y se utilizan para validar y configurar los datos para pods. También, servicios y controladores de replicación. Realizar la validación del proyecto en las solicitudes entrantes; e invocar disparadores en otros componentes principales del sistema.

7. Aislamiento de red

Implementar aplicaciones modernas de microservicios en contenedores a menudo significa implementar múltiples contenedores distribuidos en múltiples nodos. Con la defensa de la red en mente, necesitas una forma de aislar las aplicaciones entre sí dentro de un clúster.

Un servicio típico de contenedor de nube pública, como Google Container Engine (GKE), Azure Container Services o AWS, son servicios de una sola instancia. Te permiten ejecutar tus contenedores en el clúster de máquina virtual que inicias. Para la tenencia segura de contenedores múltiples, deseas una plataforma de contenedores que te permita tomar un solo clúster. También que te permitan segmentar el tráfico para aislar a diferentes usuarios, equipos, aplicaciones y entornos dentro de ese clúster.

Con los espacios de nombres de red, cada colección de contenedores (conocida como “pod”) obtiene su propia IP y rango de puertos para unirse. Aislando así las redes de pod entre sí en el nodo. Los pods de diferentes espacios de nombres no pueden enviar paquetes ni recibir paquetes de pods y servicios de un proyecto diferente de forma predeterminada. Con la excepción de las opciones que se detallan a continuación.

Puedes usar estas características para aislar entornos de desarrollador, prueba y producción dentro de un clúster. Sin embargo, esta proliferación de direcciones IP y puertos hace que las redes sean más complicadas. Además, los contenedores están diseñados para ir y venir. Debes invertir en herramientas que administren esta complejidad por ti. La herramienta preferida es una plataforma contenedor que utiliza redes definidas por software (SDN). Esta proporciona una red de clúster unificada que permite la comunicación entre contenedores a través del clúster.

8. Almacenamiento

Los contenedores son útiles tanto para aplicaciones sin estado como con estado. La protección del almacenamiento adjunto es un elemento clave para asegurar los servicios con estado. Las plataformas de contenedores deben proporcionar complementos para múltiples tipos de almacenamiento, incluidos los sistemas de archivos de red (NFS), AWS Elastic Block Stores (EBS). Asimismo, GCE Persistent Disks, GlusterFS, iSCSI, RADOS (Ceph), Cinder, etc.

Un volumen persistente (PV) se puede montar en un host de cualquier forma admitida por el proveedor de recursos. Los proveedores tendrán diferentes capacidades, y los modos de acceso de cada PV se configuran en los modos específicos admitidos por ese volumen en particular. Por ejemplo, NFS puede admitir múltiples clientes de lectura/escritura, pero un PV NFS específico podría exportarse en el servidor como solo lectura. Cada PV tiene su propio conjunto de modos de acceso que describen las capacidades de ese PV específico, como ReadWriteOnce, ReadOnlyMany y ReadWriteMany.

9. Gestión de API, seguridad de punto final e inicio de sesión único (SSO)

Asegurar tus aplicaciones incluye administrar la autenticación y autorización de aplicaciones y API.

Las capacidades de SSO web son una parte clave de las aplicaciones modernas. Las plataformas de contenedores pueden venir con varios servicios en contenedores para que los desarrolladores los usen al compilar sus aplicaciones.

Las API son clave para aplicaciones compuestas de microservicios. Estas aplicaciones tienen múltiples servicios API independientes, lo que lleva a la proliferación de puntos finales de servicio, que requieren herramientas adicionales para el gobierno. También se recomienda una herramienta de administración de API. Todas las plataformas API deben ofrecer una variedad de opciones estándar para la autenticación y seguridad API. Estas se pueden usar solas o en combinación, para emitir credenciales y controlar el acceso.

Estas opciones incluyen claves API estándar, ID de aplicación y pares de claves, y OAuth 2.0.

10. Roles y gestión de acceso en una federación de clúster

En julio de 2016, Kubernetes 1.3 introdujo Kubernetes Federated Clusters . Esta es una de las nuevas y emocionantes características que evolucionan en Kubernetes, actualmente en versión beta en Kubernetes 1.6. Federation es útil para implementar y acceder a servicios de aplicaciones que abarcan varios clústeres que se ejecutan en la nube pública o en los centros de datos empresariales. Los clústeres múltiples pueden ser útiles para habilitar la alta disponibilidad de la aplicación en múltiples zonas de disponibilidad. También para permitir la administración común de implementaciones o migraciones en múltiples proveedores de la nube, como AWS, Google Cloud y Azure.

Al administrar clústeres federados, debes asegurarte de que tus herramientas brinden la seguridad que necesitas en las diferentes instancias de la plataforma de implementación. Como siempre, la autenticación y la autorización son la clave, así como la capacidad de transferir datos de manera segura a tus aplicaciones. Esto donde sea que se ejecuten, y administrar la tenencia múltiple de aplicaciones a través de clústeres. Kubernetes está ampliando la Federación de clústeres para incluir compatibilidad con secretos federados, espacios de nombres federados y objetos.

Elegir una plataforma de contenedores

Por supuesto, no se trata solo de seguridad. Tu plataforma de contenedores debe proporcionar una experiencia que funcione para tus desarrolladores y tu equipo de operaciones. Deben ofrecer una plataforma de aplicaciones segura, basada en contenedores de grado empresarial que permita el mejor desempeño a los desarrolladores y operadores. Esto sin comprometer las funciones que necesita cada equipo, al tiempo que mejora la eficiencia operativa y la utilización de la infraestructura.