Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Protección de la infraestructura (hosts)
Si bien es importante proteger las imágenes de los contenedores, es igual de importante proteger la infraestructura en la que se ejecutan. En esta sección, se analizan diferentes formas de mitigar los riesgos derivados de los ataques lanzados directamente contra el servidor. Estas directrices deben utilizarse junto con las descritas en la sección Seguridad en tiempo de ejecución.
Recomendaciones
Utilice un sistema operativo optimizado para ejecutar contenedores
Considere la posibilidad de usar Flatcar Linux, Project Atomic, RancherOS y Bottlerocket
Como alternativa, utilice la AMI optimizada para EKS para sus nodos de trabajo de Kubernetes. La AMI optimizada para EKS se publica periódicamente y contiene un conjunto mínimo de paquetes de sistema operativo y binarios necesarios para ejecutar sus cargas de trabajo en contenedores.
Consulte la especificación de compilación de Amazon EKS AMI RHEL
Mantenga actualizado el sistema operativo de su nodo de trabajo
Independientemente de si utiliza un sistema operativo host optimizado para contenedores, como Bottlerocket, o un Amazon Machine Image más grande, pero aún minimalista, como el optimizado para EKS AMIs, se recomienda mantener estas imágenes del sistema operativo anfitrión actualizadas con los últimos parches de seguridad.
Si está optimizado para EKS AMIs, consulte periódicamente el registro de cambios o el canal de notas de
Trate su infraestructura como algo inmutable y automatice la sustitución de sus nodos de trabajo
En lugar de realizar actualizaciones in situ, sustituya a sus trabajadores cuando haya un nuevo parche o actualización disponible. Esto puede abordarse de dos maneras. Puede añadir instancias a un grupo de escalado automático existente mediante la AMI más reciente, ya que acordona y vacía los nodos de forma secuencial hasta que todos los nodos del grupo se sustituyan por la AMI más reciente. Como alternativa, puede añadir instancias a un nuevo grupo de nodos y, al mismo tiempo, acordonar y drenar los nodos del grupo de nodos anterior de forma secuencial hasta que se hayan reemplazado todos los nodos. Los grupos de nodos gestionados por EKS utilizan el primer enfoque y mostrarán un mensaje en la consola para actualizar a sus trabajadores cuando haya una nueva AMI disponible. eksctl
también tiene un mecanismo para crear grupos de nodos con la AMI más reciente y para acordonar y drenar correctamente los pods de los grupos de nodos antes de que se terminen las instancias. Si decide utilizar un método diferente para sustituir los nodos de trabajo, le recomendamos encarecidamente que automatice el proceso para minimizar la supervisión humana, ya que es probable que tenga que sustituir a los trabajadores periódicamente a medida que salgan nuevos nodos y cuando updates/patches se actualice el plano de control.
Con EKS Fargate, AWS actualizará automáticamente la infraestructura subyacente a medida que haya actualizaciones disponibles. A menudo, esto se puede hacer sin problemas, pero puede haber ocasiones en las que una actualización provoque que el pod se reprograme. Por lo tanto, le recomendamos que cree implementaciones con varias réplicas cuando ejecute la aplicación como un pod de Fargate.
Ejecute kube-bench periódicamente para verificar el cumplimiento de los puntos de referencia del CIS para Kubernetes
kube-bench es un proyecto de código abierto de Aqua que evalúa tu clúster comparándolo con los puntos de referencia del CIS para Kubernetes. El punto de referencia describe las mejores prácticas para proteger los clústeres de Kubernetes no gestionados. El índice de referencia de Kubernetes del CIS abarca el plano de control y el plano de datos. Dado que Amazon EKS proporciona un plano de control totalmente gestionado, no se aplican todas las recomendaciones del CIS Kubernetes Benchmark. Para garantizar que este ámbito refleje la forma en que se implementa Amazon EKS, AWS creó el Amazon EKS Benchmark de la CEI. El índice de referencia EKS proviene del Kubernetes Benchmark de CIS, con aportaciones adicionales de la comunidad y consideraciones de configuración específicas para los clústeres de EKS.
Cuando ejecutes kube-bench
Minimice el acceso a los nodos de trabajo
En lugar de habilitar el acceso SSH, utilice el administrador de sesiones SSM cuando necesite acceder de forma remota a un host. A diferencia de las claves SSH, que se pueden perder, copiar o compartir, el administrador de sesiones le permite controlar el acceso a las EC2 instancias mediante IAM. Además, proporciona una pista de auditoría y un registro de los comandos que se ejecutaron en la instancia.
A partir del 19 de agosto de 2020, los grupos de nodos gestionados admiten plantillas personalizadas AMIs y de EC2 lanzamiento. Esto le permite incrustar el agente SSM en la AMI o instalarlo mientras se inicia el nodo de trabajo. Si prefiere no modificar la AMI optimizada ni la plantilla de lanzamiento del ASG, puede instalar el agente SSM con una, DaemonSet como en este
Política de IAM mínima para el acceso SSH basado en SSM
La política administrada por AmazonSSMManagedInstanceCore
AWS contiene una serie de permisos que no son necesarios para SSM Session Manager/SSM RunCommand si solo quiere evitar el acceso a SSH. En concreto, son motivo de preocupación los *
permisos ssm:GetParameter(s)
que permitirían al rol acceder a todos los parámetros del almacén de parámetros (incluso SecureStrings con la clave de KMS administrada por AWS configurada).
La siguiente política de IAM contiene el conjunto mínimo de permisos para permitir el acceso a los nodos a través de SSM Systems Manager.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnableAccessViaSSMSessionManager", "Effect": "Allow", "Action": [ "ssmmessages:OpenDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:CreateControlChannel", "ssm:UpdateInstanceInformation" ], "Resource": "*" }, { "Sid": "EnableSSMRunCommand", "Effect": "Allow", "Action": [ "ssm:UpdateInstanceInformation", "ec2messages:SendReply", "ec2messages:GetMessages", "ec2messages:GetEndpoint", "ec2messages:FailMessage", "ec2messages:DeleteMessage", "ec2messages:AcknowledgeMessage" ], "Resource": "*" } ] }
Una vez implementada esta política y el complemento Session Manager instalado, puede ejecutar
aws ssm start-session --target [INSTANCE_ID_OF_EKS_NODE]
para acceder al nodo.
nota
También puede considerar la posibilidad de añadir permisos para habilitar el registro del administrador de sesiones.
Despliegue a los trabajadores en subredes privadas
Al desplegar a los trabajadores en subredes privadas, se minimiza su exposición a Internet, donde suelen originarse los ataques. A partir del 22 de abril de 2020, la subred en la que se desplieguen controlará la asignación de direcciones IP públicas a los nodos de un grupo de nodos gestionado. Antes de esto, a los nodos de un grupo de nodos gestionado se les asignaba automáticamente una IP pública. Si decide implementar sus nodos de trabajo en subredes públicas, implemente reglas restrictivas de grupos de seguridad de AWS para limitar su exposición.
Ejecute Amazon Inspector para evaluar la exposición, las vulnerabilidades y las desviaciones de los hosts con respecto a las mejores prácticas
Puede utilizar Amazon Inspector para comprobar si hay accesos no intencionados a la red a sus nodos y si hay vulnerabilidades en las EC2 instancias de Amazon subyacentes.
Amazon Inspector puede proporcionar datos sobre vulnerabilidades y exposiciones comunes (CVE) para sus EC2 instancias de Amazon solo si el agente Amazon EC2 Systems Manager (SSM) está instalado y activado. Este agente viene preinstalado en varias Amazon Machine Images (AMIs), incluido Amazon Linux AMIs optimizado para EKS. Independientemente del estado del agente de SSM, todas tus EC2 instancias de Amazon se escanean para detectar problemas de accesibilidad de la red. Para obtener más información sobre la configuración de escaneos para Amazon EC2, consulta Escanear EC2 instancias de Amazon.
importante
El Inspector no se puede ejecutar en la infraestructura utilizada para ejecutar los pods de Fargate.
Alternativas
¡Corre SELinux
nota
Disponible en Red Hat Enterprise Linux (RHEL), CentOS, Bottlerocket y Amazon Linux 2023
SELinux proporciona una capa de seguridad adicional para mantener los contenedores aislados unos de otros y del host. SELinux permite a los administradores aplicar controles de acceso (MAC) obligatorios para cada usuario, aplicación, proceso y archivo. Considérelo como un mecanismo de salvaguardia que restringe las operaciones que se pueden realizar con recursos específicos en función de un conjunto de etiquetas. En EKS, se SELinux puede usar para evitar que los contenedores accedan a los recursos de los demás.
Las SELinux políticas de contenedores se definen en el paquete container-selinuxcontainer_t
etiqueta a la que sirve de alias. svirt_lxc_net_t
Estas políticas impiden eficazmente que los contenedores accedan a determinadas funciones del servidor.
Cuando se configura SELinux para Docker, Docker etiqueta automáticamente las cargas de trabajo container_t
como un tipo y asigna a cada contenedor un nivel de MCS único. Esto aislará los contenedores unos de otros. Si necesita restricciones más flexibles, puede crear su propio perfil en el SElinux que se concedan permisos a un contenedor para acceder a áreas específicas del sistema de archivos. Esto es similar a PSPs que puedes crear diferentes perfiles para distintos contenedores o pods. Por ejemplo, puede tener un perfil para cargas de trabajo generales con un conjunto de controles restrictivos y otro para las cosas que requieren un acceso privilegiado.
SELinux for Containers tiene un conjunto de opciones que se pueden configurar para modificar las restricciones predeterminadas. Los siguientes valores SELinux booleanos se pueden activar o desactivar en función de sus necesidades:
Booleano | Predeterminado/a | Descripción |
---|---|---|
|
|
Permita que los contenedores accedan a los puertos privilegiados del host. Por ejemplo, si tiene un contenedor que necesita asignar los puertos 443 u 80 del host. |
|
|
Permita que los contenedores administren la configuración del grupo. Por ejemplo, un contenedor que ejecute systemd necesitará que esté habilitado. |
|
|
Permita que los contenedores usen un sistema de archivos ceph. |
De forma predeterminada, los contenedores pueden guardar /usr
y read/execute leer la mayor parte del /etc
contenido. Los archivos que están debajo /var/lib/docker
y /var/lib/containers
tienen la etiquetacontainer_var_lib_t
. Para ver una lista completa de los valores predeterminados, las etiquetas consultan el archivo container.fc
docker container run -it \ -v /var/lib/docker/image/overlay2/repositories.json:/host/repositories.json \ centos:7 cat /host/repositories.json # cat: /host/repositories.json: Permission denied docker container run -it \ -v /etc/passwd:/host/etc/passwd \ centos:7 cat /host/etc/passwd # cat: /host/etc/passwd: Permission denied
Los archivos etiquetados con container_file_t
son los únicos archivos en los que los contenedores pueden escribir. Si desea que se pueda escribir en un montaje de volumen, tendrá que especificar :z
o al :Z
final.
-
:z
volverá a etiquetar los archivos para que el contenedor pueda leer/escribir -
:Z
volverá a etiquetar los archivos para que solo el contenedor pueda leer/escribir
ls -Z /var/lib/misc # -rw-r--r--. root root system_u:object_r:var_lib_t:s0 postfix.aliasesdb-stamp docker container run -it \ -v /var/lib/misc:/host/var/lib/misc:z \ centos:7 echo "Relabeled!" ls -Z /var/lib/misc #-rw-r--r--. root root system_u:object_r:container_file_t:s0 postfix.aliasesdb-stamp
docker container run -it \ -v /var/log:/host/var/log:Z \ fluentbit:latest
En Kubernetes, el reetiquetado es ligeramente diferente. En lugar de hacer que Docker vuelva a etiquetar automáticamente los archivos, puede especificar una etiqueta MCS personalizada para ejecutar el pod. Los volúmenes que admiten el reetiquetado se volverán a etiquetar automáticamente para que sean accesibles. Los módulos que tengan la etiqueta MCS correspondiente podrán acceder al volumen. Si necesitas un aislamiento estricto, establece una etiqueta MCS diferente para cada cápsula.
securityContext: seLinuxOptions: # Provide a unique MCS label per container # You can specify user, role, and type also # enforcement based on type and level (svert) level: s0:c144:c154
En este ejemplo, s0:c144:c154
corresponde a una etiqueta MCS asignada a un archivo al que el contenedor puede acceder.
En EKS, puede crear políticas que permitan la ejecución de contenedores privilegiados, como FluentD, y crear SELinux una política que le permita leer desde /var/log en el host sin necesidad de volver a etiquetar el directorio del host. Los pods con la misma etiqueta podrán acceder a los mismos volúmenes del host.
Hemos implementado un ejemplo AMIs para Amazon EKS
aviso
SELinux ignorará los contenedores cuyo tipo no esté confinado.
Herramientas y recursos
-
SELinuxPolíticas de seguridad de envío y RBAC de Kubernetes para aplicaciones locales
-
Generar SELinux políticas para contenedores con Udica
describe una herramienta que analiza las capacidades, los puertos y los puntos de montaje de Linux en los archivos de especificaciones de los contenedores, y genera un conjunto de SELinux reglas que permiten que el contenedor funcione correctamente -
Cuadernos de estrategias de AMI Hardening
para reforzar el sistema operativo a fin de cumplir con los diferentes requisitos reglamentarios -
Keiko Upgrade Manager
, un proyecto de código abierto de Intuit que organiza la rotación de los nodos trabajadores.