Pod Security - Amazon EKS

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.

Pod Security

La especificación del módulo incluye una variedad de atributos diferentes que pueden reforzar o debilitar tu postura general en materia de seguridad. Como profesional de Kubernetes, tu principal preocupación debería ser evitar que un proceso que se ejecuta en un contenedor escape a los límites de aislamiento del tiempo de ejecución del contenedor y acceda al host subyacente.

Capacidades de Linux

Los procesos que se ejecutan dentro de un contenedor se ejecutan en el contexto del usuario root [de Linux] de forma predeterminada. Si bien las acciones de root dentro de un contenedor están limitadas en parte por el conjunto de capacidades de Linux que el motor de ejecución del contenedor asigna a los contenedores, estos privilegios predeterminados podrían permitir a un atacante aumentar sus privilegios u obtener acceso a información confidencial vinculada al host, incluidos los secretos y. ConfigMaps A continuación, se muestra una lista de las capacidades predeterminadas asignadas a los contenedores. Para obtener información adicional sobre cada capacidad, consulte http://man7. org/linux/man-pages/man7/capabilities.7.html.

CAP_AUDIT_WRITE, CAP_CHOWN, CAP_DAC_OVERRIDE, CAP_FOWNER, CAP_FSETID, CAP_KILL, CAP_MKNOD, CAP_NET_BIND_SERVICE, CAP_NET_RAW, CAP_SETGID, CAP_SETUID, CAP_SETFCAP, CAP_SETPCAP, CAP_SYS_CHROOT

EC2 y las cápsulas Fargate tienen asignadas las capacidades antes mencionadas de forma predeterminada. Además, las capacidades de Linux solo se pueden eliminar de los pods de Fargate.

Los pods que se ejecutan con privilegios heredan todas las capacidades de Linux asociadas a la raíz en el host. Esto debe evitarse si es posible.

Autorización de nodos

Todos los nodos de trabajo de Kubernetes utilizan un modo de autorización denominado Autorización de nodos. La autorización de nodos autoriza todas las solicitudes de API que se originan en el kubelet y permite a los nodos realizar las siguientes acciones:

Operaciones de lectura:

  • servicios

  • puntos de conexión

  • nodos

  • vainas

  • secretos, mapas de configuración, notificaciones de volumen persistentes y volúmenes persistentes relacionados con los pods enlazados al nodo del kubelet

Operaciones de escritura:

  • nodos y estado de los nodos (habilite el complemento de NodeRestriction admisión para limitar que un kubelet modifique su propio nodo)

  • pods y estado del pod (habilite el complemento de NodeRestriction admisión para limitar un kubelet y modificar los pods enlazados a sí mismo)

  • eventos

Operaciones relacionadas con la autenticación:

  • Acceso de lectura y escritura a la API CertificateSigningRequest (CSR) para el arranque de TLS

  • la capacidad de crear y realizar comprobaciones delegadas TokenReview SubjectAccessReview authentication/authorization

EKS utiliza el controlador de admisión por restricciones de nodos, que solo permite al nodo modificar un conjunto limitado de atributos del nodo y objetos del módulo que están enlazados al nodo. Sin embargo, un atacante que consiga acceder al host podrá seguir recopilando información confidencial sobre el entorno a través de la API de Kubernetes, lo que le permitirá moverse lateralmente dentro del clúster.

Soluciones de seguridad Pod

Política de seguridad de Pod (PSP)

En el pasado, los recursos de la Política de seguridad de los pods (PSP) se utilizaban para especificar un conjunto de requisitos que los pods tenían que cumplir antes de poder crearlos. A partir de la versión 1.21 de Kubernetes, las PSP quedaron en desuso. Está previsto que se eliminen en la versión 1.25 de Kubernetes.

importante

PSPs están en desuso en la versión 1.21 de Kubernetes. Tendrá hasta la versión 1.25 o aproximadamente 2 años para realizar la transición a una alternativa. En este documento se explica el motivo de esta obsolescencia.

Migración a una nueva solución de seguridad para módulos

Dado que PSPs se eliminaron a partir de la versión 1.25 de Kubernetes, los administradores y operadores de clústeres deben reemplazar esos controles de seguridad. Hay dos soluciones que pueden cubrir esta necesidad:

Tanto la solución PAC como la PSS pueden coexistir con la PSP; se pueden utilizar en clústeres antes de eliminar la PSP. Esto facilita la adopción al migrar desde PSP. Consulte este documento cuando esté pensando en migrar de PSP a PSS.

Kyverno, una de las soluciones de PAC que se describen a continuación, tiene una guía específica en una entrada de blog para migrar de una solución PSPs a otra, que incluye políticas análogas, comparaciones de características y un procedimiento de migración. Se ha publicado información y orientación adicionales sobre la migración a Kyverno con respecto a la admisión de Pod Security (PSA) en el blog de AWS aquí.

Policy-as-code (PAC)

Policy-as-code Las soluciones (PAC) proporcionan barandillas para guiar a los usuarios del clúster y evitar comportamientos no deseados mediante controles prescritos y automatizados. El PAC utiliza los controladores de admisión dinámica de Kubernetes para interceptar el flujo de solicitudes del servidor API de Kubernetes, mediante una llamada de webhook, y mutar y validar las cargas útiles de las solicitudes, en función de las políticas escritas y almacenadas como código. La mutación y la validación se producen antes de que la solicitud del servidor de API provoque un cambio en el clúster. Las soluciones de PAC utilizan políticas para hacer coincidir las cargas útiles de las solicitudes del servidor de API y actuar en función de ellas, en función de la taxonomía y los valores.

Hay varias soluciones PAC de código abierto disponibles para Kubernetes. Estas soluciones no forman parte del proyecto Kubernetes; provienen del ecosistema de Kubernetes. Algunas soluciones de PAC se enumeran a continuación.

Para obtener más información sobre las soluciones de PAC y cómo ayudarlo a seleccionar la solución adecuada para sus necesidades, consulte los enlaces siguientes.

Estándares de seguridad para Pod (PSS) y Pod Security Admission (PSA)

En respuesta a la obsolescencia de la PSP y a la continua necesidad de controlar la seguridad de los módulos out-of-the-box, el Grupo de Interés Especial sobre Autenticación de Kubernetes creó los Estándares de Seguridad (PSS) y los Sistemas de Admisión de Seguridad para los Pod (PSA). La iniciativa de la PSA incluye un proyecto de webhook para el controlador de admisión que implementa los controles definidos en el PSS. Este enfoque de controlador de admisión se parece al utilizado en las soluciones PAC.

Según la documentación de Kubernetes, el PSS «define tres políticas diferentes para cubrir ampliamente el espectro de la seguridad. Estas políticas son acumulativas y van desde las muy permisivas hasta las muy restrictivas. `»

Estas políticas se definen de la siguiente manera:

  • Privilegiado: política sin restricciones (insegura) que proporciona el nivel de permisos más amplio posible. Esta política permite escalamientos de privilegios conocidos. Es la ausencia de una política. Esto es bueno para aplicaciones como agentes de registro CNIs, controladores de almacenamiento y otras aplicaciones de todo el sistema que necesitan un acceso privilegiado.

  • Base de referencia: política mínimamente restrictiva que impide las escaladas de privilegios conocidas. Permite la configuración de pod predeterminada (especificada mínimamente). La política básica prohíbe el uso de HostNetwork, HostPID, HostPC, HostPath, HostPort y la imposibilidad de añadir capacidades de Linux, entre otras restricciones.

  • Restringido: política muy restringida, que sigue las mejores prácticas actuales de Pod Harding. Esta política se hereda de la base y añade restricciones adicionales, como la imposibilidad de ejecutarse como root o como grupo root. Las políticas restringidas pueden afectar a la capacidad de funcionamiento de una aplicación. Están destinadas principalmente a ejecutar aplicaciones críticas para la seguridad.

Estas políticas definen los perfiles para la ejecución de los módulos, organizados en tres niveles: acceso privilegiado y acceso restringido.

Para implementar los controles definidos por el PSS, el PSA funciona de tres modos:

  • hacer cumplir: las infracciones de la política provocarán el rechazo del módulo.

  • auditoría: las infracciones de las políticas provocarán la adición de una anotación de auditoría al evento registrado en el registro de auditoría, pero de lo contrario están permitidas.

  • advertencia: las infracciones de las políticas generarán una advertencia dirigida al usuario, pero de lo contrario están permitidas.

Estos modos y los niveles de perfil (restricción) se configuran en el nivel del espacio de nombres de Kubernetes, mediante etiquetas, como se muestra en el siguiente ejemplo.

apiVersion: v1 kind: Namespace metadata: name: policy-test labels: pod-security.kubernetes.io/enforce: restricted

Cuando se utilizan de forma independiente, estos modos operativos tienen respuestas diferentes que se traducen en experiencias de usuario diferentes. El modo de aplicación impedirá que se creen pods si los PodSpecs respectivos infringen el nivel de restricción configurado. Sin embargo, en este modo, no se impedirá que los objetos de Kubernetes que no sean pods y que creen pods, como los despliegues, se apliquen al clúster, incluso si el PodSpec incluido en ellos infringe el PSS aplicado. En este caso, se aplicará el despliegue, mientras que no se podrán aplicar los pods.

Se trata de una experiencia de usuario difícil, ya que no hay ningún indicio inmediato de que el objeto de despliegue aplicado correctamente oculte la creación fallida del pod. El PodSpecs infractor no creará pods. Al inspeccionar el recurso de despliegue con él, kubectl get deploy <DEPLOYMENT_NAME> -oyaml se mostrará el mensaje del .status.conditions elemento de los pods fallidos, tal y como se muestra a continuación.

... status: conditions: - lastTransitionTime: "2022-01-20T01:02:08Z" lastUpdateTime: "2022-01-20T01:02:08Z" message: 'pods "test-688f68dc87-tw587" is forbidden: violates PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "test" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "test" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "test" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "test" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")' reason: FailedCreate status: "True" type: ReplicaFailure ...

Tanto en el modo de auditoría como en el de advertencia, las restricciones de los pods no impiden que se creen e inicien los pods infractores. Sin embargo, en estos modos, las anotaciones de auditoría en los eventos del registro de auditoría del servidor API y las advertencias a los clientes del servidor API, como kubectl, se activan, respectivamente, cuando los pods, así como los objetos que los crean, contienen PodSpecs con infracciones. A continuación se muestra un kubectl mensaje de advertencia.

Warning: would violate PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "test" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "test" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "test" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "test" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost") deployment.apps/test created

Los modos de auditoría y advertencia del PSA son útiles a la hora de introducir el PSS sin afectar negativamente a las operaciones del clúster.

Los modos operativos del PSA no se excluyen mutuamente y se pueden utilizar de forma acumulativa. Como se muestra a continuación, los múltiples modos se pueden configurar en un único espacio de nombres.

apiVersion: v1 kind: Namespace metadata: name: policy-test labels: pod-security.kubernetes.io/audit: restricted pod-security.kubernetes.io/enforce: restricted pod-security.kubernetes.io/warn: restricted

En el ejemplo anterior, las advertencias y anotaciones de auditoría fáciles de usar se proporcionan al aplicar las implementaciones, mientras que la aplicación de las infracciones también se proporciona a nivel de grupo. De hecho, varias etiquetas de PSA pueden utilizar diferentes niveles de perfil, como se muestra a continuación.

apiVersion: v1 kind: Namespace metadata: name: policy-test labels: pod-security.kubernetes.io/enforce: baseline pod-security.kubernetes.io/warn: restricted

En el ejemplo anterior, el PSA está configurado para permitir la creación de todos los grupos que cumplan el nivel de perfil básico y, a continuación, avisar sobre los grupos (y los objetos que crean grupos) que infrinjan el nivel de perfil restringido. Este es un enfoque útil para determinar los posibles impactos al cambiar del perfil de referencia a uno restringido.

Cápsulas existentes

Si se modifica un espacio de nombres con los pods existentes para utilizar un perfil PSS más restrictivo, los modos de auditoría y advertencia generarán los mensajes adecuados; sin embargo, el modo de aplicación no eliminará los pods. Los mensajes de advertencia se muestran a continuación.

Warning: existing pods in namespace "policy-test" violate the new PodSecurity enforce level "restricted:latest" Warning: test-688f68dc87-htm8x: allowPrivilegeEscalation != false, unrestricted capabilities, runAsNonRoot != true, seccompProfile namespace/policy-test configured

Exenciones

La PSA utiliza las exenciones para excluir la aplicación de infracciones contra grupos que, de otro modo, se habrían aplicado. Estas exenciones se enumeran a continuación.

  • Nombres de usuario: se ignoran las solicitudes de los usuarios con un nombre de usuario autenticado (o suplantado) exento.

  • RuntimeClassNames: se ignoran los pods y los recursos de carga de trabajo que especifican un nombre de clase de ejecución exento.

  • Espacios de nombres: se ignoran los pods y los recursos de carga de trabajo de un espacio de nombres exento.

Estas exenciones se aplican de forma estática en la configuración del controlador de admisión de la PSA como parte de la configuración del servidor API.

En la implementación de Validating Webhook, las exenciones se pueden configurar dentro de un ConfigMaprecurso de Kubernetes que se monta como un volumen en el contenedor. pod-security-webhook

apiVersion: v1 kind: ConfigMap metadata: name: pod-security-webhook namespace: pod-security-webhook data: podsecurityconfiguration.yaml: | apiVersion: pod-security.admission.config.k8s.io/v1 kind: PodSecurityConfiguration defaults: enforce: "restricted" enforce-version: "latest" audit: "restricted" audit-version: "latest" warn: "restricted" warn-version: "latest" exemptions: # Array of authenticated usernames to exempt. usernames: [] # Array of runtime class names to exempt. runtimeClasses: [] # Array of namespaces to exempt. namespaces: ["kube-system","policy-test1"]

Como se ve en el ConfigMap YAML anterior, el nivel de PSS predeterminado para todo el clúster se ha establecido como restringido para todos los modos de PSA, auditar, aplicar y advertir. Esto afecta a todos los espacios de nombres, excepto a los que están exentos:. namespaces: ["kube-system","policy-test1"] Además, en el ValidatingWebhookConfigurationrecurso, que se ve a continuación, el espacio de pod-security-webhooknombres también está exento del PSS configurado.

... webhooks: # Audit annotations will be prefixed with this name - name: "pod-security-webhook.kubernetes.io" # Fail-closed admission webhooks can present operational challenges. # You may want to consider using a failure policy of Ignore, but should # consider the security tradeoffs. failurePolicy: Fail namespaceSelector: # Exempt the webhook itself to avoid a circular dependency. matchExpressions: - key: kubernetes.io/metadata.name operator: NotIn values: ["pod-security-webhook"] ...
importante

Las admisiones de Pod Security pasaron a ser estables en Kubernetes v1.25. Si querías usar la función Pod Security Admission antes de activarla de forma predeterminada, tenías que instalar el controlador de admisión dinámico (webhook mutante). Puedes encontrar las instrucciones para instalar y configurar el webhook aquí.

Elegir entre los estándares de seguridad policy-as-code y Pod

Los estándares de seguridad de Pod (PSS) se desarrollaron para sustituir a la política de seguridad de Pod (PSP), proporcionando una solución integrada en Kubernetes y que no requería soluciones del ecosistema de Kubernetes. Dicho esto, las soluciones policy-as-code (PAC) son considerablemente más flexibles.

La siguiente lista de ventajas y desventajas está diseñada para ayudarlo a tomar una decisión más informada sobre la solución de seguridad de su módulo.

Policy-as-code (en comparación con los estándares de seguridad de Pod)

Ventajas:

  • Más flexible y detallado (se reduce a los atributos de los recursos si es necesario)

  • No solo se centra en los módulos, sino que se puede utilizar con diferentes recursos y acciones

  • No solo se aplica a nivel de espacio de nombres

  • Más maduros que los estándares de seguridad de Pod

  • Las decisiones se pueden basar en cualquier elemento de la carga útil de solicitud del servidor API, así como en los recursos del clúster existentes y en los datos externos (según la solución)

  • Admite la mutación de las solicitudes del servidor de API antes de la validación (depende de la solución)

  • Puede generar políticas y recursos de Kubernetes complementarios (depende de la solución): a partir de las políticas de pod, Kyverno puede generar automáticamente políticas para controladores de nivel superior, como las implementaciones. Kyverno también puede generar recursos adicionales de Kubernetes «`cuando se crea un nuevo recurso o cuando se actualiza la fuente`» mediante Generate Rules.)

  • Se puede usar para desplazarse a la izquierda, hacia las canalizaciones del CICD, antes de realizar llamadas al servidor API de Kubernetes (depende de la solución)

  • Se puede usar para implementar comportamientos que no están necesariamente relacionados con la seguridad, como las mejores prácticas, los estándares organizacionales, etc.

  • Se puede usar en casos de uso ajenos a Kubernetes (depende de la solución)

  • Gracias a la flexibilidad, la experiencia del usuario se puede ajustar a las necesidades de los usuarios

Desventajas:

  • No está integrado en Kubernetes

  • Es más complejo de aprender, configurar y soportar

  • La creación de políticas puede requerir nuevas skills/languages/capabilities

Entrada a Pod Security (en comparación policy-as-code con)

Ventajas:

  • Integrado en Kubernetes

  • Más fácil de configurar

  • No hay nuevos idiomas que usar ni políticas que crear

  • Si el nivel de admisión predeterminado del clúster está configurado como privilegiado, las etiquetas de los espacios de nombres se pueden utilizar para incluir los espacios de nombres en los perfiles de seguridad del módulo.

Desventajas:

  • No es tan flexible o granular como policy-as-code

  • Solo 3 niveles de restricciones

  • Se centra principalmente en las cápsulas

Resumen

Si actualmente no dispones de una solución de seguridad para cápsulas, aparte de la PSP, y la postura de seguridad que necesitas para tu cápsula se ajusta al modelo definido en las normas de seguridad para cápsulas (PSS), lo más fácil sería adoptar la PSS en lugar de una solución. policy-as-code Sin embargo, si la postura de seguridad de su módulo no se ajusta al modelo de PSS, o si tiene pensado añadir controles adicionales, además de los definidos por el PSS, entonces una policy-as-code solución le parecería más adecuada.

Recomendaciones

Utilice varios modos de admisión segura (PSA) del pod para una mejor experiencia de usuario

Como se mencionó anteriormente, el modo de aplicación del PSA impide que se apliquen cápsulas con infracciones de PSS, pero no detiene a los controladores de nivel superior, como los despliegues. De hecho, la implementación se aplicará correctamente sin ningún indicio de que los pods no se hayan aplicado. Si bien puedes usar kubectl para inspeccionar el objeto de despliegue y descubrir el mensaje de error del pod en la PSA, la experiencia de usuario podría ser mejor. Para mejorar la experiencia del usuario, se deben utilizar varios modos de PSA (auditar, aplicar, advertir).

apiVersion: v1 kind: Namespace metadata: name: policy-test labels: pod-security.kubernetes.io/audit: restricted pod-security.kubernetes.io/enforce: restricted pod-security.kubernetes.io/warn: restricted

En el ejemplo anterior, con el modo de aplicación definido, cuando se intenta aplicar al servidor API de Kubernetes un manifiesto de despliegue con infracciones de PSS en el PodSpec correspondiente, el despliegue se aplicará correctamente, pero los pods no. Además, dado que los modos de auditoría y advertencia también están habilitados, el cliente del servidor de API recibirá un mensaje de advertencia y el evento del registro de auditoría del servidor de API también se anotará con un mensaje.

Restrinja los contenedores que pueden ejecutarse como privilegiados

Como se ha mencionado, los contenedores que se ejecutan con privilegios heredan todas las capacidades de Linux asignadas a la raíz del host. Rara vez los contenedores necesitan este tipo de privilegios para funcionar correctamente. Existen varios métodos que se pueden utilizar para restringir los permisos y las capacidades de los contenedores.

importante

Fargate es un tipo de lanzamiento que le permite ejecutar contenedores «sin servidor» en los que los contenedores de un pod se ejecutan en una infraestructura que administra AWS. Con Fargate, no puedes ejecutar un contenedor privilegiado ni configurar tu pod para que use HostNetwork o HostPort.

No ejecute procesos en contenedores como root

Todos los contenedores se ejecutan como root de forma predeterminada. Esto podría resultar problemático si un atacante es capaz de aprovechar una vulnerabilidad de la aplicación y obtener acceso desde el shell al contenedor en ejecución. Puede mitigar este riesgo de varias maneras. En primer lugar, quitando la carcasa de la imagen del contenedor. En segundo lugar, añade la directiva USER a tu Dockerfile o ejecuta los contenedores del pod como usuario no root. El PodSpec de Kubernetes incluye un conjunto de campos, en, que te permiten especificar el grupo de usuarios and/or en spec.securityContext el que se ejecutará la aplicación. Estos campos son y respectivamente. runAsUser runAsGroup

Para hacer cumplir el uso del spec.securityContext PodSpec de Kubernetes y sus elementos asociados, se pueden añadir a los clústeres los estándares de seguridad de Pod policy-as-code o Pod. Estas soluciones le permiten escribir o usar políticas o perfiles que puedan validar las cargas útiles entrantes de solicitudes del servidor API de Kubernetes antes de que se almacenen en etcd. Además, policy-as-code las soluciones pueden modificar las solicitudes entrantes y, en algunos casos, generar nuevas solicitudes.

Nunca ejecute Docker en Docker ni monte el socket en el contenedor

Si bien esto te permite grabar build/run imágenes en contenedores Docker, básicamente estás cediendo el control total del nodo al proceso que se ejecuta en el contenedor. Si necesitas crear imágenes de contenedores en Kubernetes, usa Kaniko, buildah o un servicio de compilación similar. CodeBuild

nota

Los clústeres de Kubernetes que se utilizan para el procesamiento del CICD, como la creación de imágenes de contenedores, deben aislarse de los clústeres que ejecutan cargas de trabajo más generalizadas.

Restrinja el uso de HostPath o, si es necesario, restrinja los prefijos que se pueden usar y configure el volumen como de solo lectura

hostPathes un volumen que monta un directorio desde el host directamente al contenedor. Los pods rara vez necesitarán este tipo de acceso, pero si lo necesitan, debes ser consciente de los riesgos. De forma predeterminada, los pods que se ejecutan como root tendrán acceso de escritura al sistema de archivos expuesto por HostPath. Esto podría permitir a un atacante modificar la configuración del kubelet, crear enlaces simbólicos a directorios o archivos no expuestos directamente por HostPath, por ejemplo, /etc/shadow, instalar claves ssh, leer los secretos guardados en el servidor y otras acciones maliciosas. Para mitigar los riesgos de HostPath, configúrelo como, por ejemplo: spec.containers.volumeMounts readOnly

volumeMounts: - name: hostPath-volume readOnly: true mountPath: /host-path

También debe usar policy-as-code soluciones para restringir los directorios que pueden usar los hostPath volúmenes o evitar su hostPath uso por completo. Puede utilizar las políticas básicas o restringidas de los estándares de seguridad de Pod para evitar el uso dehostPath.

Para obtener más información sobre los peligros de la escalada de privilegios, lee el blog de Seth Art Bad Pods: Kubernetes Pod Privilege Escalation.

Establezca solicitudes y límites para cada contenedor para evitar la contención de recursos y los ataques de DoS

En teoría, un pod sin solicitudes ni límites puede consumir todos los recursos disponibles en un host. A medida que se programan más pods en un nodo, es posible que el nodo sufra una presión en la CPU o la memoria, lo que puede provocar que el Kubelet cierre o expulse los pods del nodo. Si bien no se puede evitar que esto suceda por completo, establecer solicitudes y límites ayudará a minimizar la contención de recursos y a mitigar el riesgo que supone el uso de aplicaciones mal escritas que consumen una cantidad excesiva de recursos.

podSpecEsto te permite especificar las solicitudes y los límites de la CPU y la memoria. La CPU se considera un recurso comprimible porque puede estar sobresuscrita. La memoria es incompresible, es decir, no se puede compartir entre varios contenedores.

Cuando especificas las solicitudes de CPU o memoria, básicamente estás designando la cantidad de memoria que se garantiza que obtendrán los contenedores. Kubernetes agrega las solicitudes de todos los contenedores de un pod para determinar en qué nodo programar el pod. Si un contenedor supera la cantidad de memoria solicitada, puede ser cancelado si hay una presión de memoria en el nodo.

Los límites son la cantidad máxima de recursos de CPU y memoria que puede consumir un contenedor y corresponden directamente al memory.limit_in_bytes valor del cgroup creado para el contenedor. Un contenedor que supere el límite de memoria será eliminado mediante OOM. Si un contenedor supera su límite de CPU, se estrangulará.

nota

Al usar un contenedorresources.limits, se recomienda encarecidamente que el uso de los recursos del contenedor (también conocido como huella de recursos) se base en datos y sea preciso, en función de las pruebas de carga. A falta de una huella de recursos precisa y fiable, el contenedor resources.limits puede ser acolchado. Por ejemplo, resources.limits.memory podría rellenarse entre un 20 y un 30% más que los máximos observables, para tener en cuenta las posibles imprecisiones en los límites de los recursos de memoria.

Kubernetes usa tres clases de calidad de servicio (QoS) para priorizar las cargas de trabajo que se ejecutan en un nodo. Entre ellos se incluyen:

  • garantizado

  • reventable

  • mejor esfuerzo

Si los límites y las solicitudes no están establecidos, el pod se configura como de máximo esfuerzo (prioridad más baja). Los módulos que hacen el mejor esfuerzo son los primeros en morir cuando no hay suficiente memoria. Si los límites están establecidos en todos los contenedores del módulo, o si las solicitudes y los límites se establecen con los mismos valores y no iguales a 0, el módulo se configura como garantizado (máxima prioridad). Los módulos garantizados no se eliminarán a menos que superen los límites de memoria configurados. Si los límites y las solicitudes están configurados con valores diferentes y no iguales a 0, o si un contenedor del pod establece límites y los demás no, o tienen límites establecidos para diferentes recursos, los pods se configuran como burstable (prioridad media). Estos módulos tienen algunas garantías de recursos, pero se pueden eliminar una vez que superen la memoria solicitada.

importante

Las solicitudes no afectan al memory_limit_in_bytes valor del cgroup del contenedor; el límite del cgroup se establece en la cantidad de memoria disponible en el host. Sin embargo, si el valor de las solicitudes es demasiado bajo, el kubelet podría poner fin al pod si la memoria del nodo se ve presionada.

Clase Priority (Prioridad) Condición Condición de muerte

Garantizada

highest

límite = solicitud! = 0

Supere únicamente los límites de memoria

ampliable

medium

límite! = solicitud! = 0

Se puede matar si se supera la memoria solicitada

El mejor esfuerzo

lowest

El límite y la solicitud no están establecidos

El primero en morir cuando no hay suficiente memoria

Para obtener información adicional sobre la QoS de los recursos, consulte la documentación de Kubernetes.

Puedes forzar el uso de las solicitudes y los límites estableciendo una cuota de recursos en un espacio de nombres o creando un rango de límites. Una cuota de recursos te permite especificar la cantidad total de recursos, por ejemplo, la CPU y la RAM, asignados a un espacio de nombres. Cuando se aplica a un espacio de nombres, te obliga a especificar las solicitudes y los límites de todos los contenedores desplegados en ese espacio de nombres. Por el contrario, los rangos de límites ofrecen un control más detallado de la asignación de recursos. Con los rangos de límites, puede min/max utilizar los recursos de CPU y memoria por pod o por contenedor dentro de un espacio de nombres. También puedes usarlos para establecer los valores de solicitud/límite predeterminados si no se proporciona ninguno.

Policy-as-code Las soluciones se pueden usar para hacer cumplir las solicitudes y los límites, o incluso para crear las cuotas de recursos y los rangos de límites cuando se crean los espacios de nombres.

No permita la escalación privilegiada

La escalada privilegiada permite que un proceso cambie el contexto de seguridad en el que se ejecuta. Sudo es un buen ejemplo de ello, al igual que los binarios con el bit SUID o SGID. La escalada de privilegios es básicamente una forma de que los usuarios ejecuten un archivo con los permisos de otro usuario o grupo. Para evitar que un contenedor utilice la escalación con privilegios, implemente una política de policy-as-code mutación allowPrivilegeEscalation que se establezca en false o establezca securityContext.allowPrivilegeEscalation en. podSpec Policy-as-code Las políticas también se pueden usar para evitar que las solicitudes del servidor de API se realicen correctamente si se detecta una configuración incorrecta. Los estándares de seguridad de los pods también se pueden usar para evitar que los pods utilicen la escalada de privilegios.

Deshabilita los montajes ServiceAccount de los tokens

En el caso de los pods que no necesiten acceder a la API de Kubernetes, puedes deshabilitar el montaje automático de un ServiceAccount token según las especificaciones de un pod o para todos los pods que usen una determinada especificación. ServiceAccount

apiVersion: v1 kind: Pod metadata: name: pod-no-automount spec: automountServiceAccountToken: false
apiVersion: v1 kind: ServiceAccount metadata: name: sa-no-automount automountServiceAccountToken: false

Inhabilita la detección de servicios

En el caso de los pods que no necesitan buscar ni llamar a los servicios del clúster, puedes reducir la cantidad de información que se proporciona a un pod. Puede configurar la política de DNS del pod para que no utilice CoreDNS y no exponga los servicios del espacio de nombres del pod como variables de entorno. Consulta los documentos de Kubernetes sobre variables de entorno para obtener más información sobre los enlaces de los servicios. El valor predeterminado de la política de DNS de un pod es «ClusterFirst», que usa el DNS del clúster, mientras que el valor no predeterminado, «Predeterminado», usa la resolución de DNS del nodo subyacente. Consulta los documentos de Kubernetes sobre la política de DNS del pod para obtener más información.

apiVersion: v1 kind: Pod metadata: name: pod-no-service-info spec: dnsPolicy: Default # "Default" is not the true default value enableServiceLinks: false

Configura tus imágenes con un sistema de archivos raíz de solo lectura

La configuración de las imágenes con un sistema de archivos raíz de solo lectura evita que un atacante sobrescriba un binario del sistema de archivos que utiliza la aplicación. Si la aplicación tiene que escribir en el sistema de archivos, considere la posibilidad de escribir en un directorio temporal o adjuntar y montar un volumen. Para hacer cumplir esto, configure los pods de la SecurityContext siguiente manera:

... securityContext: readOnlyRootFilesystem: true ...

Policy-as-code y los estándares de seguridad del pod se pueden usar para hacer cumplir este comportamiento.

Según Windows, los contenedores de Kubernetes securityContext.readOnlyRootFilesystem no se pueden configurar true para un contenedor que se ejecute en Windows, ya que se requiere acceso de escritura para que los procesos del registro y del sistema se ejecuten dentro del contenedor.

Herramientas y recursos