Comparativas del CIS
En este documento se presenta la comparativa de CIS Kubernetes. También explica lo siguiente:
- Cómo auditar el cumplimiento de los requisitos
- Qué configura GKE en Azure cuando no puedes implementar una recomendación por tu cuenta.
Usar CIS Benchmarks
El Center for Internet Security (CIS) publica comparativas de prácticas recomendadas de seguridad. El CIS Kubernetes Benchmark proporciona un conjunto de recomendaciones para configurar Kubernetes de forma que se mantenga una postura de seguridad sólida. La comparativa está vinculada a una versión específica de Kubernetes. El benchmark de Kubernetes del CIS se ha escrito para la distribución de código abierto de Kubernetes y se ha diseñado para que se pueda aplicar de forma universal en todas las distribuciones.
Versiones
Ten en cuenta que los números de versión de las diferentes comparativas pueden no ser los mismos.
Este documento hace referencia a estas versiones:
Versión de Anthos | Versión de Kubernetes | Versión de CIS Kubernetes Benchmark |
---|---|---|
1.14.0 | 1.25.3 | 1.23 |
CIS Benchmark de Kubernetes
Acceder a la comparativa
La guía de CIS Kubernetes está disponible en el sitio web de CIS.
Niveles de recomendación
En CIS Kubernetes Benchmark, hay dos niveles de recomendaciones.
Nivel | Descripción |
---|---|
Nivel 1 | Las recomendaciones tienen como objetivo: |
Nivel 2 | Amplía el perfil de nivel 1. Las recomendaciones presentan una o varias de las siguientes características: |
Estado de la evaluación
Se incluye un estado de evaluación para cada recomendación. El estado de la evaluación indica si la recomendación se puede automatizar o si requiere pasos manuales para implementarse. Ambos estados son igual de importantes y se determinan y se admiten tal como se define a continuación:
Puntuación | Descripción |
---|---|
Automatizada | Representa las recomendaciones para las que la evaluación de un control técnico se puede automatizar y validar por completo para determinar si se supera o no. Las recomendaciones incluirán la información necesaria para implementar la automatización. |
Manual | Representa las recomendaciones para las que la evaluación de un control técnico no se puede automatizar por completo y requiere que se sigan todos o algunos pasos manuales para validar que el estado configurado se ha definido correctamente. El estado esperado puede variar en función del entorno. |
Evaluación de GKE en Azure
Usamos los siguientes valores para especificar el estado de las recomendaciones de Kubernetes en GKE en Azure:
Estado | Descripción |
---|---|
Superada | Cumple una recomendación de referencia. |
No superada | No cumple una recomendación de comparativas. |
Control equivalente | No cumple los términos exactos de la recomendación de la prueba comparativa, pero existen otros mecanismos en GKE en Azure para proporcionar controles de seguridad equivalentes. |
Depende del entorno | GKE en Azure no configura elementos relacionados con esta recomendación. La configuración del usuario determina si su entorno cumple una recomendación de comparativas. |
Estado de GKE en Azure
Cuando crees un clúster con la versión especificada, se comportará de la siguiente manera en comparación con el benchmark de Kubernetes del CIS.
Estado de los clústeres de GKE en Azure:
# | Recomendación | Nivel | Estado |
---|---|---|---|
1 | Configuración de seguridad del plano de control | ||
1.1 | Archivos de configuración de nodos del plano de control | ||
1.1.1 | Asegúrate de que los permisos del archivo de especificación del pod del servidor de la API estén definidos en 644 o en un valor más restrictivo (automatizado) |
L1 | Superada |
1.1.2 | Asegúrate de que el archivo de especificación del pod del servidor de la API sea propiedad de root:root (automatizado) |
L1 | Superada |
1.1.3 | Asegúrate de que los permisos del archivo de especificación del pod del gestor de controladores se hayan definido en 644 o en un valor más restrictivo (automatizado) |
L1 | Superada |
1.1.4 | Asegúrate de que la propiedad del archivo de especificación del pod del gestor de controladores esté definida como root:root (automatizado) |
L1 | Superada |
1.1.5 | Asegúrate de que los permisos del archivo de especificación del pod del programador se hayan definido como 644 o más restrictivos (automatizado). |
L1 | Superada |
1.1.6 | Asegúrate de que el archivo de especificación del pod del programador sea propiedad de root:root (automatizado) |
L1 | Superada |
1.1.7 | Asegúrate de que los permisos del archivo de especificación del pod etcd estén definidos en 644 o en un valor más restrictivo (automatizado) |
L1 | Superada |
1.1.8 | Asegúrate de que la propiedad del archivo de especificación del pod de etcd esté definida como root:root (automatizado) |
L1 | Superada |
1.1.9 | Asegúrate de que los permisos del archivo de interfaz de red de contenedor estén definidos en 644 o en un valor más restrictivo (manual). |
L1 | Control equivalente |
1.1.10 | Asegúrate de que el archivo de interfaz de red de contenedor sea propiedad de root:root (manual) |
L1 | Control equivalente |
1.1.11 | Asegúrate de que los permisos del directorio de datos de etcd estén definidos en 700 o en un valor más restrictivo (automatizado) |
L1 | Control equivalente |
1.1.12 | Asegúrate de que el propietario del directorio de datos de etcd sea etcd:etcd (automatizado) |
L1 | Control equivalente |
1.1.13 | Asegúrate de que los permisos del archivo de configuración admin. se hayan definido en 600 o en un valor más restrictivo (automatizado) |
L1 | Control equivalente |
1.1.14 | Asegúrate de que la propiedad del archivo admin. conf esté configurada como root:root (automatizado) |
L1 | Control equivalente |
1.1.15 | Asegúrate de que los permisos del archivo de configuración del programador . se hayan definido como 644 o más restrictivos (automatizado) |
L1 | Superada |
1.1.16 | Asegúrate de que el archivo de configuración del programador . tenga asignado el propietario root:root (automatizado) |
L1 | Superada |
1.1.17 | Asegúrate de que los permisos del archivo . conf del controlador-gestor estén definidos como 644 o más restrictivos (automatizado) |
L1 | Superada |
1.1.18 | Asegúrate de que el archivo de configuración controller-manager. conf sea propiedad de root:root (automatizado) |
L1 | Superada |
1.1.19 | Asegúrate de que el directorio PKI de Kubernetes y la propiedad del archivo estén definidos como root:root (automatizado) |
L1 | Superada |
1.1.20 | Asegúrate de que los permisos del archivo de certificado de PKI de Kubernetes estén definidos en 644 o en un valor más restrictivo (manual). |
L1 | Superada |
1.1.21 | Asegúrate de que los permisos del archivo de claves de PKI de Kubernetes estén definidos en 600 (manual) |
L1 | Superada |
1.2 | Servidor de API | ||
1.2.1 | Asegúrate de que el argumento --anonymous-auth esté definido como false (manual) |
L1 | Superada |
1.2.2 | Asegúrate de que el parámetro --token-auth-file no esté definido (automatizado) |
L1 | Superada |
1.2.3 | Asegúrate de que no se haya definido -- DenyServiceExternalIPs (automatizado) |
L1 | Superada |
1.2.4 | Asegúrate de que el argumento --kubelet-https esté definido como true (automatizado) |
L1 | Superada |
1.2.5 | Asegúrate de que los argumentos --kubelet-client-certificate y --kubelet-client-key estén definidos correctamente (automatizado) |
L1 | Superada |
1.2.6 | Asegúrate de que el argumento --kubelet-certificate-authority esté configurado correctamente (automatizado) |
L1 | Superada |
1.2.7 | Asegúrate de que el argumento --authorization-mode no esté definido como AlwaysAllow (automatizado) |
L1 | Superada |
1.2.8 | Asegúrate de que el argumento --authorization-mode incluya Node (automatizado) |
L1 | Superada |
1.2.9 | Asegúrate de que el argumento --authorization-mode incluya RBAC (automatizado) |
L1 | Superada |
1.2.10 | Asegúrate de que el complemento de control de acceso EventRateLimit esté configurado (manual) | L1 | Advertencia |
1.2.11 | Asegúrate de que el complemento de control de acceso AlwaysAdmit no esté configurado (automatizado) | L1 | Superada |
1.2.12 | Asegúrate de que el complemento de control de acceso AlwaysPullImages esté definido (manual) | L1 | Advertencia |
1.2.13 | Asegúrate de que el complemento de control de admisión SecurityContextDeny esté definido si no se usa PodSecurityPolicy (manual) | L1 | Control equivalente |
1.2.14 | Asegúrate de que el complemento de control de acceso ServiceAccount esté configurado (automatizado) | L1 | Superada |
1.2.15 | Asegúrate de que el complemento de control de admisión NamespaceLifecycle esté configurado (automatizado) | L1 | Superada |
1.2.16 | Asegúrate de que el complemento de control de acceso NodeRestriction esté configurado (automatizado) | L1 | Superada |
1.2.17 | Asegúrate de que el argumento --secure-port no esté definido como 0 (automatizado) |
L1 | Superada |
1.2.18 | Asegúrate de que el argumento --profiling esté definido como false (automatizado) |
L1 | Superada |
1.2.19 | Asegúrate de que el argumento --audit-log-path esté definido (automatizado) |
L1 | Control equivalente |
1.2.20 | Asegúrate de que el argumento --audit-log-maxage esté definido como 30 o como corresponda (automatizado). |
L1 | Control equivalente |
1.2.21 | Asegúrate de que el argumento --audit-log-maxbackup esté definido como 10 o como corresponda (automatizado). |
L1 | Control equivalente |
1.2.22 | Asegúrate de que el argumento --audit-log-maxsize esté definido como 100 o como corresponda (automatizado). |
L1 | Control equivalente |
1.2.23 | Asegúrate de que el argumento --request-timeout esté configurado correctamente (manual) |
L1 | Superada |
1.2.24 | Asegúrate de que el argumento --service-account-lookup esté definido como true (automatizado) |
L1 | Superada |
1.2.25 | Asegúrate de que el argumento --service-account-key-file esté configurado correctamente (automatizado) |
L1 | Superada |
1.2.26 | Asegúrate de que los argumentos --etcd-certfile y --etcd-keyfile estén definidos correctamente (automatizado) |
L1 | Superada |
1.2.27 | Asegúrate de que los argumentos --tls-cert-file y --tls-private-key-file estén definidos correctamente (automatizado) |
L1 | Superada |
1.2.28 | Asegúrate de que el argumento --client-ca-file esté configurado correctamente (automatizado) |
L1 | Superada |
1.2.29 | Asegúrate de que el argumento --etcd-cafile esté configurado correctamente (automatizado) |
L1 | Superada |
1.2.30 | Asegúrate de que el argumento --encryption-provider-config esté configurado correctamente (manual) |
L1 | Superada |
1.2.31 | Asegurarse de que los proveedores de cifrado estén configurados correctamente (manual) | L1 | Superada |
1.2.32 | Asegúrate de que el servidor de la API solo usa cifrados criptográficos seguros (manual) | L1 | Superada |
1.3 | Gestor de controladores | ||
1.3.1 | Asegúrate de que el argumento --terminated-pod-gc-threshold esté configurado correctamente (manual) |
L1 | Superada |
1.3.2 | Asegúrate de que el argumento --profiling esté definido como false (automatizado) |
L1 | Superada |
1.3.3 | Asegúrate de que el argumento --use-service-account-credentials esté definido como true (automatizado) |
L1 | Superada |
1.3.4 | Asegúrate de que el argumento --service-account-private-key-file esté configurado correctamente (automatizado) |
L1 | Superada |
1.3.5 | Asegúrate de que el argumento --root-ca-file esté configurado correctamente (automatizado) |
L1 | Superada |
1.3.6 | Asegúrate de que el argumento RotateKubeletServerCertificate esté definido como true (automatizado) | L2 | Superada |
1.3.7 | Asegúrate de que el argumento --bind-address esté configurado como 127.0.0.1 (Automatizado). |
L1 | Superada |
1.4 | Programador | ||
1.4.1 | Asegúrate de que el argumento --profiling esté definido como false (automatizado) |
L1 | Superada |
1.4.2 | Asegúrate de que el argumento --bind-address esté configurado como 127.0.0.1 (Automatizado). |
L1 | Superada |
2 | Configuración de nodo de etcd | ||
2 | Configuración de nodo de etcd | ||
2.1 | Asegúrate de que los argumentos --cert-file y --key-file estén definidos correctamente (automatizado) |
L1 | Superada |
2.2 | Asegúrate de que el argumento --client-cert-auth esté definido como true (automatizado) |
L1 | Superada |
2.3 | Asegúrate de que el argumento --auto-tls no esté definido como true (automatizado) |
L1 | Superada |
2,4 | Asegúrate de que los argumentos --peer-cert-file y --peer-key-file estén definidos correctamente (automatizado) |
L1 | Superada |
2,5 | Asegúrate de que el argumento --peer-client-cert-auth esté definido como true (automatizado) |
L1 | Superada |
2.6 | Asegúrate de que el argumento --peer-auto-tls no esté definido como true (automatizado) |
L1 | Superada |
2,7 | Asegúrate de que se usa una autoridad de certificación única para etcd (manual) | L2 | Superada |
3 | Configuración del plano de control | ||
3.1 | Autenticación y autorización | ||
3.1.1 | No se debe usar la autenticación con certificado de cliente para los usuarios (manual) | L2 | Control equivalente |
3.2 | Logging | ||
3.2.1 | Asegúrate de que se haya creado una política de auditoría mínima (manual) | L1 | Superada |
3.2.2 | Asegurarse de que la política de auditoría abarca los problemas de seguridad clave (manual) | L2 | Control equivalente |
4 | Configuración de seguridad de los nodos de trabajo | ||
4.1 | Archivos de configuración de nodos de trabajador | ||
4.1.1 | Asegúrate de que los permisos del archivo de servicio kubelet estén definidos en 644 o en un valor más restrictivo (automatizado) |
L1 | Superada |
4.1.2 | Asegúrate de que el propietario del archivo de servicio kubelet sea root:root (automatizado) |
L1 | Superada |
4.1.3 | Si existe un archivo kubeconfig de proxy, asegúrate de que los permisos estén definidos en 644 o en un valor más restrictivo (manual). |
L1 | Superada |
4.1.4 | Si existe el archivo kubeconfig del proxy, asegúrate de que la propiedad esté definida en root:root (Manual). |
L1 | Superada |
4.1.5 | Asegúrate de que los permisos del archivo de configuración --kubeconfig kubelet. estén definidos como 644 o más restrictivos (automatizado) |
L1 | Superada |
4.1.6 | Asegúrate de que el archivo de configuración --kubeconfig kubelet. tiene asignado el valor root:root (automatizado) |
L1 | Superada |
4.1.7 | Asegúrate de que los permisos del archivo de autoridades de certificación estén definidos en 644 o en un valor más restrictivo (Manual). |
L1 | Superada |
4.1.8 | Asegúrate de que la propiedad del archivo de autoridades de certificación de cliente esté definida como root:root (Manual). |
L1 | Superada |
4.1.9 | Asegúrate de que el archivo de configuración --config de kubelet tenga permisos definidos como 644 o más restrictivos (automatizado). |
L1 | Superada |
4.1.10 | Asegúrate de que el archivo de configuración --config de kubelet sea propiedad de root:root (automatizado) |
L1 | Superada |
4.2 | Kubelet | ||
4.2.1 | Asegúrate de que el argumento --anonymous-auth esté definido como false (automatizado) |
L1 | Superada |
4.2.2 | Asegúrate de que el argumento --authorization-mode no esté definido como AlwaysAllow (automatizado) |
L1 | Superada |
4.2.3 | Asegúrate de que el argumento --client-ca-file esté configurado correctamente (automatizado) |
L1 | Superada |
4.2.4 | Asegúrate de que el argumento --read-only-port esté definido como 0 (Manual). |
L1 | No superada |
4.2.5 | Comprueba que el argumento --streaming-connection-idle-timeout no esté definido como 0 (Manual). |
L1 | Superada |
4.2.6 | Asegúrate de que el argumento --protect-kernel-defaults esté definido como true (automatizado) |
L1 | No superada |
4.2.7 | Asegúrate de que el argumento --make-iptables-util-chains esté definido como true (automatizado) |
L1 | Superada |
4.2.8 | Comprueba que el argumento --hostname-override no esté definido (Manual). |
L1 | Superada |
4.2.9 | Comprueba que el argumento --event-qps esté definido como 0 o como un nivel que asegure la captura de eventos adecuada (Manual). |
L2 | Advertencia |
4.2.10 | Asegúrate de que los argumentos --tls-cert-file y --tls-private-key-file estén definidos correctamente (Manual). |
L1 | Control equivalente |
4.2.11 | Asegúrate de que el argumento --rotate-certificates no esté definido como false (automatizado) |
L1 | Superada |
4.2.12 | Verifica que el argumento RotateKubeletServerCertificate esté definido como true (Manual) | L1 | Superada |
4.2.13 | Asegúrate de que Kubelet solo use cifrados criptográficos seguros (manual) | L1 | Superada |
Descripciones de los fallos y los controles equivalentes del clúster de administración de GKE en Azure:
# | Recomendación | Nivel | Estado | Valor | Justificación |
---|---|---|---|---|---|
1.1.9 | Asegúrate de que los permisos del archivo de interfaz de red de contenedor estén definidos en 644 o en un valor más restrictivo (manual). |
L1 | Control equivalente | 755 |
La ruta de la interfaz de red de contenedores de los clústeres de Anthos en Azure es /opt/cni/bin y su permiso se ha definido como 755 para el funcionamiento normal del clúster. |
1.1.10 | Asegúrate de que el archivo de interfaz de red de contenedor sea propiedad de root:root (manual) |
L1 | Control equivalente | root:root |
La ruta de la interfaz de red de contenedores de los clústeres de Anthos en Azure es /opt/cni/bin y su propiedad es root:root . |
1.1.11 | Asegúrate de que los permisos del directorio de datos de etcd estén definidos en 700 o en un valor más restrictivo (automatizado) |
L1 | Control equivalente | 755 |
El directorio de datos de etcd /opt/data/var/lib/etcd tiene los permisos 755 predeterminados, pero sus subdirectorios son 700 . |
1.1.12 | Asegúrate de que el propietario del directorio de datos de etcd sea etcd:etcd (automatizado) |
L1 | Control equivalente | root:root |
El contenedor etcd se ejecuta como root y el directorio de datos de etcd es propiedad de root:root . |
1.1.13 | Asegúrate de que los permisos del archivo de configuración admin. se hayan definido en 600 o en un valor más restrictivo (automatizado) |
L1 | Control equivalente | no se ha configurado | Los clústeres de Anthos en Azure no admiten kubeadm. |
1.1.14 | Asegúrate de que la propiedad del archivo admin. conf esté configurada como root:root (automatizado) |
L1 | Control equivalente | no se ha configurado | Los clústeres de Anthos en Azure no admiten kubeadm. |
1.2.10 | Asegúrate de que el complemento de control de acceso EventRateLimit esté configurado (manual) | L1 | Advertencia | no se ha configurado | Los clústeres de Anthos en Azure no admiten el controlador de admisión de límite de frecuencia de eventos, ya que es una función alfa de Kubernetes. |
1.2.12 | Asegúrate de que el complemento de control de acceso AlwaysPullImages esté definido (manual) | L1 | Advertencia | no se ha configurado | El controlador de admisión AlwaysPullImages proporciona cierta protección para las imágenes de registro privadas en clústeres multiinquilino no cooperativos, pero a costa de que los registros de contenedores sean un único punto de fallo para crear nuevos pods en todo el clúster. GKE en Azure no habilita el controlador de admisión AlwaysPullImages, por lo que los administradores de clústeres deben implementar la política de admisión para tomar esta decisión. |
1.2.13 | Asegúrate de que el complemento de control de admisión SecurityContextDeny esté definido si no se usa PodSecurityPolicy (manual) | L1 | Control equivalente | no se ha configurado | Los clústeres de Anthos en Azure definen políticas de seguridad predeterminadas. Los clientes pueden definir opciones relacionadas con la seguridad con un contexto de seguridad. Consulta más información en el artículo Información general sobre la seguridad. |
1.2.19 | Asegúrate de que el argumento --audit-log-path esté definido (automatizado) |
L1 | Control equivalente | no se ha configurado | Los clústeres de Anthos en Azure ofrecen la opción de registro de auditoría en la nube. Más información sobre los registros de auditoría de Cloud |
1.2.20 | Asegúrate de que el argumento --audit-log-maxage esté definido como 30 o como corresponda (automatizado). |
L1 | Control equivalente | no se ha configurado | Los clústeres de Anthos en Azure ofrecen la opción de registro de auditoría en la nube. Más información sobre los registros de auditoría de Cloud |
1.2.21 | Asegúrate de que el argumento --audit-log-maxbackup esté definido como 10 o como corresponda (automatizado). |
L1 | Control equivalente | no se ha configurado | Los clústeres de Anthos en Azure ofrecen la opción de registro de auditoría en la nube. Más información sobre los registros de auditoría de Cloud |
1.2.22 | Asegúrate de que el argumento --audit-log-maxsize esté definido como 100 o como corresponda (automatizado). |
L1 | Control equivalente | no se ha configurado | Los clústeres de Anthos en Azure ofrecen la opción de registro de auditoría en la nube. Más información sobre los registros de auditoría de Cloud |
3.1.1 | No se debe usar la autenticación con certificado de cliente para los usuarios (manual) | L2 | Control equivalente | Los clústeres de Anthos en Azure admiten OIDC como uno de los mecanismos de autenticación para conectarse a un clúster. Consulta más información sobre cómo conectarse y autenticarse en un clúster. | |
3.2.2 | Asegurarse de que la política de auditoría abarca los problemas de seguridad clave (manual) | L2 | Control equivalente | no se ha configurado | Los clústeres de Anthos en Azure ofrecen la opción de registro de auditoría en la nube. Más información sobre los registros de auditoría de Cloud |
4.2.4 | Asegúrate de que el argumento --read-only-port esté definido como 0 (Manual). |
L1 | No superada | 10255 | Actualmente, Anthos clusters on Azure asigna el valor 10255 al argumento --read-only-port para recoger métricas de kubelet. |
4.2.6 | Asegúrate de que el argumento --protect-kernel-defaults esté definido como true (automatizado) |
L1 | No superada | false |
Los clústeres de Anthos en Azure permiten que kubelet defina los ajustes del kernel necesarios. |
4.2.9 | Comprueba que el argumento --event-qps esté definido como 0 o como un nivel que asegure la captura de eventos adecuada (Manual). |
L2 | Advertencia | no se ha configurado | Los eventos son objetos de Kubernetes almacenados en etcd. Para evitar sobrecargar etcd, solo se conservan durante una hora y no son un mecanismo de auditoría de seguridad adecuado. Si permites un número ilimitado de eventos, tal como se sugiere en este control, el clúster estará expuesto a un riesgo innecesario de denegación de servicio y contradice la recomendación de usar EventRateLimits de admisión. Los eventos relevantes para la seguridad que deban almacenarse de forma permanente deben enviarse a los registros. |
4.2.10 | Asegúrate de que los argumentos --tls-cert-file y --tls-private-key-file estén definidos correctamente (Manual). |
L1 | Control equivalente | no se ha configurado | Los clústeres de Anthos en Azure gestionan el TLS del servidor kubelet mediante la marca serverTLSBootstrap . |
Cómo auditar las comparativas
Las instrucciones específicas para auditar cada recomendación están disponibles en el benchmark de CIS correspondiente. Sin embargo, puede que quieras automatizar algunas de estas comprobaciones para simplificar la verificación de estos controles en tu entorno. Las herramientas que se indican a continuación pueden ayudarte.
Auditoría automatizada de la comparativa de CIS Kubernetes
Puedes usar una herramienta de código abierto
kube-bench
para probar la configuración de tu clúster con la prueba comparativa de Kubernetes del CIS.
Asegúrate de especificar la versión adecuada. Por ejemplo:
kube-bench node --benchmark cis-1.23