Este documento presenta el CIS Kubernetes Benchmark. También explica:
- Cómo auditar su cumplimiento con el índice de referencia
- Lo que GKE en AWS configura donde no puede implementar una recomendación usted mismo.
Utilizando los puntos de referencia del CIS
El Centro para la Seguridad de Internet (CIS) publica benchmarks con recomendaciones de buenas prácticas de seguridad. El CIS Kubernetes Benchmark proporciona un conjunto de recomendaciones para configurar Kubernetes y lograr una sólida postura de seguridad. Este benchmark está vinculado a una versión específica de Kubernetes. Está diseñado para la distribución de código abierto de Kubernetes y su aplicación en todas las distribuciones es lo más universal posible.
Versiones
Tenga en cuenta que los números de versión para diferentes puntos de referencia pueden no ser los mismos.
Este documento se refiere a estas versiones:
Versión de Anthos | Versión de Kubernetes | Versión de referencia de Kubernetes de CIS |
---|---|---|
1.14.0 | 1.25.3 | 1.23 |
Punto de referencia de Kubernetes del CIS
Accediendo al punto de referencia
El benchmark CIS Kubernetes está disponible en el sitio web del CIS .
Niveles de recomendación
En el CIS Kubernetes Benchmark, hay dos niveles de recomendaciones.
Nivel | Descripción |
---|---|
Nivel 1 | Las recomendaciones pretenden: |
Nivel 2 | Amplía el perfil de Nivel 1. Las recomendaciones presentan una o más de las siguientes características: |
Estado de la evaluación
Cada recomendación incluye un estado de evaluación. Este indica si la recomendación puede automatizarse o si requiere pasos manuales para su implementación. Ambos estados son igualmente importantes y se determinan y respaldan como se define a continuación:
Tanteo | Descripción |
---|---|
Automatizado | Se presentan recomendaciones para que la evaluación de un control técnico pueda automatizarse completamente y validarse con un criterio de aprobación/rechazo. Las recomendaciones incluirán la información necesaria para implementar la automatización. |
Manual | Representa recomendaciones para las cuales la evaluación de un control técnico no puede automatizarse por completo y requiere todos o algunos pasos manuales para validar que el estado configurado se establece como se espera. El estado esperado puede variar según el entorno. |
Evaluación de GKE en AWS
Utilizamos los siguientes valores para especificar el estado de las recomendaciones de Kubernetes en GKE en AWS:
Estado | Descripción |
---|---|
Aprobar | Cumple con una recomendación de referencia. |
Fallar | No cumple con una recomendación de referencia. |
Control equivalente | No cumple con los términos exactos de la Recomendación de referencia, pero existen otros mecanismos en GKE en AWS para proporcionar controles de seguridad equivalentes. |
Depende del entorno | GKE en AWS no configura elementos relacionados con esta recomendación. La configuración del usuario determina si su entorno cumple con una recomendación de referencia. |
Estado de GKE en AWS
Al crear un nuevo clúster con la versión especificada , así es como funcionará en comparación con el punto de referencia CIS Kubernetes.
Estado de GKE en los clústeres de AWS:
# | 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úrese de que los permisos del archivo de especificación del pod del servidor API estén configurados en 644 o más restrictivos (automatizado) | L1 | Aprobar |
1.1.2 | Asegúrese de que la propiedad del archivo de especificación del pod del servidor API esté configurada como root:root (automatizado) | L1 | Aprobar |
1.1.3 | Asegúrese de que los permisos del archivo de especificación del pod del administrador del controlador estén configurados en 644 o más restrictivos (automatizado) | L1 | Aprobar |
1.1.4 | Asegúrese de que la propiedad del archivo de especificación del pod del administrador del controlador esté configurada como root:root (automatizado) | L1 | Aprobar |
1.1.5 | Asegúrese de que los permisos del archivo de especificación del pod del programador estén configurados en 644 o más restrictivos (automatizado) | L1 | Aprobar |
1.1.6 | Asegúrese de que la propiedad del archivo de especificación del pod del programador esté establecida en root:root (automatizado) | L1 | Aprobar |
1.1.7 | Asegúrese de que los permisos del archivo de especificación del pod etcd estén configurados en 644 o más restrictivos (automatizado) | L1 | Aprobar |
1.1.8 | Asegúrese de que la propiedad del archivo de especificación del pod etcd esté establecida en root:root (automatizado) | L1 | Aprobar |
1.1.9 | Asegúrese de que los permisos de archivo de la interfaz de red del contenedor estén configurados en 644 o más restrictivos (manual) | L1 | Control equivalente |
1.1.10 | Asegúrese de que la propiedad del archivo de interfaz de red del contenedor esté configurada como root:root (manual) | L1 | Control equivalente |
1.1.11 | Asegúrese de que los permisos del directorio de datos etcd estén configurados en 700 o más restrictivos (automatizado) | L1 | Control equivalente |
1.1.12 | Asegúrese de que la propiedad del directorio de datos etcd esté establecida en etcd:etcd (automatizado) | L1 | Control equivalente |
1.1.13 | Asegúrese de que los permisos del archivo . de administrador estén configurados en 600 o más restrictivos (automatizado) | L1 | Control equivalente |
1.1.14 | Asegúrese de que la propiedad del archivo . del administrador esté establecida en root:root (automatizado) | L1 | Control equivalente |
1.1.15 | Asegúrese de que los permisos del archivo . del programador estén configurados en 644 o más restrictivos (automatizado) | L1 | Aprobar |
1.1.16 | Asegúrese de que la propiedad del archivo . del programador esté establecida en root:root (automatizado) | L1 | Aprobar |
1.1.17 | Asegúrese de que los permisos del archivo . del controlador-administrador estén configurados en 644 o más restrictivos (automatizado) | L1 | Aprobar |
1.1.18 | Asegúrese de que la propiedad del archivo . del controlador-administrador esté establecida en root:root (automatizado) | L1 | Aprobar |
1.1.19 | Asegúrese de que el directorio PKI de Kubernetes y la propiedad del archivo estén configurados como root:root (automatizado) | L1 | Aprobar |
1.1.20 | Asegúrese de que los permisos del archivo del certificado PKI de Kubernetes estén configurados en 644 o más restrictivos (Manual) | L1 | Aprobar |
1.1.21 | Asegúrese de que los permisos del archivo de clave PKI de Kubernetes estén configurados en 600 (Manual) | L1 | Aprobar |
1.2 | Servidor API | ||
1.2.1 | Asegúrese de que el argumento --anonymous-auth esté establecido en falso (Manual) | L1 | Aprobar |
1.2.2 | Asegúrese de que el parámetro --token-auth-file no esté configurado (automatizado) | L1 | Aprobar |
1.2.3 | Asegúrese de que -- no esté configurado (automatizado) | L1 | Aprobar |
1.2.4 | Asegúrese de que el argumento --kubelet-https esté establecido en verdadero (automatizado) | L1 | Aprobar |
1.2.5 | Asegúrese de que los argumentos --kubelet-client-certificate y --kubelet-client-key estén configurados según corresponda (automatizado) | L1 | Aprobar |
1.2.6 | Asegúrese de que el argumento --kubelet-certificate-authority esté configurado como apropiado (automatizado) | L1 | Aprobar |
1.2.7 | Asegúrese de que el argumento --authorization-mode no esté configurado en AlwaysAllow (Automatizado) | L1 | Aprobar |
1.2.8 | Asegúrese de que el argumento --authorization-mode incluya Nodo (Automatizado) | L1 | Aprobar |
1.2.9 | Asegúrese de que el argumento --authorization-mode incluya RBAC (automatizado) | L1 | Aprobar |
1.2.10 | Asegúrese de que el complemento de control de admisión EventRateLimit esté configurado (Manual) | L1 | Advertir |
1.2.11 | Asegúrese de que el complemento de control de admisión AlwaysAdmit no esté configurado (automatizado) | L1 | Aprobar |
1.2.12 | Asegúrese de que el complemento de control de admisión AlwaysPullImages esté configurado (Manual) | L1 | Advertir |
1.2.13 | Asegúrese de que el complemento de control de admisión SecurityContextDeny esté configurado si no se utiliza PodSecurityPolicy (Manual) | L1 | Control equivalente |
1.2.14 | Asegúrese de que el complemento de control de admisión ServiceAccount esté configurado (automatizado) | L1 | Aprobar |
1.2.15 | Asegúrese de que el complemento de control de admisión NamespaceLifecycle esté configurado (automatizado) | L1 | Aprobar |
1.2.16 | Asegúrese de que el complemento de control de admisión NodeRestriction esté configurado (automatizado) | L1 | Aprobar |
1.2.17 | Asegúrese de que el argumento --secure-port no esté establecido en 0 (automatizado) | L1 | Aprobar |
1.2.18 | Asegúrese de que el argumento --profiling esté establecido en falso (automatizado) | L1 | Aprobar |
1.2.19 | Asegúrese de que el argumento --audit-log-path esté configurado (automatizado) | L1 | Control equivalente |
1.2.20 | Asegúrese de que el argumento --audit-log-maxage esté establecido en 30 o según corresponda (automatizado) | L1 | Control equivalente |
1.2.21 | Asegúrese de que el argumento --audit-log-maxbackup esté establecido en 10 o según corresponda (automatizado) | L1 | Control equivalente |
1.2.22 | Asegúrese de que el argumento --audit-log-maxsize esté establecido en 100 o según corresponda (automatizado) | L1 | Control equivalente |
1.2.23 | Asegúrese de que el argumento --request-timeout esté configurado como apropiado (Manual) | L1 | Aprobar |
1.2.24 | Asegúrese de que el argumento --service-account-lookup esté establecido en verdadero (automatizado) | L1 | Aprobar |
1.2.25 | Asegúrese de que el argumento --service-account-key-file esté configurado como apropiado (automatizado) | L1 | Aprobar |
1.2.26 | Asegúrese de que los argumentos --etcd-certfile y --etcd-keyfile estén configurados como apropiados (automatizado) | L1 | Aprobar |
1.2.27 | Asegúrese de que los argumentos --tls-cert-file y --tls-private-key-file estén configurados como apropiados (automatizado) | L1 | Aprobar |
1.2.28 | Asegúrese de que el argumento --client-ca-file esté configurado como apropiado (automatizado) | L1 | Aprobar |
1.2.29 | Asegúrese de que el argumento --etcd-cafile esté configurado como apropiado (automatizado) | L1 | Aprobar |
1.2.30 | Asegúrese de que el argumento --encryption-provider-config esté configurado como apropiado (Manual) | L1 | Aprobar |
1.2.31 | Asegúrese de que los proveedores de cifrado estén configurados adecuadamente (Manual) | L1 | Aprobar |
1.2.32 | Asegúrese de que el servidor API solo utilice cifrados criptográficos fuertes (manual) | L1 | Aprobar |
1.3 | Administrador del controlador | ||
1.3.1 | Asegúrese de que el argumento --terminated-pod-gc-threshold esté configurado como apropiado (Manual) | L1 | Aprobar |
1.3.2 | Asegúrese de que el argumento --profiling esté establecido en falso (automatizado) | L1 | Aprobar |
1.3.3 | Asegúrese de que el argumento --use-service-account-credentials esté establecido en verdadero (automatizado) | L1 | Aprobar |
1.3.4 | Asegúrese de que el argumento --service-account-private-key-file esté configurado como apropiado (automatizado) | L1 | Aprobar |
1.3.5 | Asegúrese de que el argumento --root-ca-file esté configurado como apropiado (automatizado) | L1 | Aprobar |
1.3.6 | Asegúrese de que el argumento RotateKubeletServerCertificate esté establecido en verdadero (automatizado) | L2 | Aprobar |
1.3.7 | Asegúrese de que el argumento --bind-address esté establecido en 127.0.0.1 (automatizado) | L1 | Aprobar |
1.4 | Programador | ||
1.4.1 | Asegúrese de que el argumento --profiling esté establecido en falso (automatizado) | L1 | Aprobar |
1.4.2 | Asegúrese de que el argumento --bind-address esté establecido en 127.0.0.1 (automatizado) | L1 | Aprobar |
2 | Configuración del nodo Etcd | ||
2 | Configuración del nodo Etcd | ||
2.1 | Asegúrese de que los argumentos --cert-file y --key-file estén configurados como apropiados (automatizado) | L1 | Aprobar |
2.2 | Asegúrese de que el argumento --client-cert-auth esté establecido en verdadero (automatizado) | L1 | Aprobar |
2.3 | Asegúrese de que el argumento --auto-tls no esté establecido en verdadero (automatizado) | L1 | Aprobar |
2.4 | Asegúrese de que los argumentos --peer-cert-file y --peer-key-file estén configurados como apropiados (automatizado) | L1 | Aprobar |
2.5 | Asegúrese de que el argumento --peer-client-cert-auth esté establecido en verdadero (automatizado) | L1 | Aprobar |
2.6 | Asegúrese de que el argumento --peer-auto-tls no esté establecido en verdadero (automatizado) | L1 | Aprobar |
2.7 | Asegúrese de que se utilice una autoridad de certificación única para etcd (Manual) | L2 | Aprobar |
3 | Configuración del plano de control | ||
3.1 | Autenticación y autorización | ||
3.1.1 | La autenticación del certificado de cliente no debe utilizarse para los usuarios (Manual) | L2 | Control equivalente |
3.2 | Explotación florestal | ||
3.2.1 | Asegúrese de que se cree una política de auditoría mínima (Manual) | L1 | Aprobar |
3.2.2 | Asegúrese de que la política de auditoría cubra las preocupaciones de seguridad clave (Manual) | L2 | Control equivalente |
4 | Configuración de seguridad del nodo de trabajo | ||
4.1 | Archivos de configuración del nodo de trabajo | ||
4.1.1 | Asegúrese de que los permisos de archivo del servicio kubelet estén configurados en 644 o más restrictivos (automatizado) | L1 | Aprobar |
4.1.2 | Asegúrese de que la propiedad del archivo de servicio kubelet esté establecida en root:root (automatizado) | L1 | Aprobar |
4.1.3 | Si existe un archivo proxy kubeconfig, asegúrese de que los permisos estén configurados en 644 o más restrictivos (Manual) | L1 | Aprobar |
4.1.4 | Si existe el archivo proxy kubeconfig, asegúrese de que la propiedad esté establecida en root:root (Manual) | L1 | Aprobar |
4.1.5 | Asegúrese de que los permisos del archivo --kubeconfig kubelet . conf estén configurados en 644 o más restrictivos (automatizado) | L1 | Aprobar |
4.1.6 | Asegúrese de que la propiedad del archivo --kubeconfig kubelet . conf esté establecida en root:root (automatizado) | L1 | Aprobar |
4.1.7 | Asegúrese de que los permisos de archivo de las autoridades de certificación estén configurados en 644 o más restrictivos (Manual) | L1 | Aprobar |
4.1.8 | Asegúrese de que la propiedad del archivo de autoridades de certificación del cliente esté establecida en root:root (Manual) | L1 | Aprobar |
4.1.9 | Asegúrese de que el archivo de configuración kubelet --config tenga permisos establecidos en 644 o más restrictivos (automatizado) | L1 | Aprobar |
4.1.10 | Asegúrese de que la propiedad del archivo de configuración kubelet --config esté establecida en root:root (automatizado) | L1 | Aprobar |
4.2 | Kubelet | ||
4.2.1 | Asegúrese de que el argumento --anonymous-auth esté establecido en falso (automatizado) | L1 | Aprobar |
4.2.2 | Asegúrese de que el argumento --authorization-mode no esté configurado en AlwaysAllow (Automatizado) | L1 | Aprobar |
4.2.3 | Asegúrese de que el argumento --client-ca-file esté configurado como apropiado (automatizado) | L1 | Aprobar |
4.2.4 | Asegúrese de que el argumento --read-only-port esté establecido en 0 (Manual) | L1 | Fallar |
4.2.5 | Asegúrese de que el argumento --streaming-connection-idle-timeout no esté establecido en 0 (Manual) | L1 | Aprobar |
4.2.6 | Asegúrese de que el argumento --protect-kernel-defaults esté establecido en verdadero (automatizado) | L1 | Fallar |
4.2.7 | Asegúrese de que el argumento --make-iptables-util-chains esté establecido en verdadero (automatizado) | L1 | Aprobar |
4.2.8 | Asegúrese de que el argumento --hostname-override no esté configurado (Manual) | L1 | Aprobar |
4.2.9 | Asegúrese de que el argumento --event-qps esté establecido en 0 o en un nivel que garantice la captura de eventos adecuada (Manual) | L2 | Advertir |
4.2.10 | Asegúrese de que los argumentos --tls-cert-file y --tls-private-key-file estén configurados como apropiados (Manual) | L1 | Control equivalente |
4.2.11 | Asegúrese de que el argumento --rotate-certificates no esté establecido en falso (automatizado) | L1 | Aprobar |
4.2.12 | Verifique que el argumento RotateKubeletServerCertificate esté establecido en verdadero (Manual) | L1 | Aprobar |
4.2.13 | Asegúrese de que Kubelet solo utilice cifrados criptográficos fuertes (manual) | L1 | Aprobar |
Descripciones de fallas y controles equivalentes para GKE en el clúster de administración de AWS:
# | Recomendación | Nivel | Estado | Valor | Justificación |
---|---|---|---|---|---|
1.1.9 | Asegúrese de que los permisos de archivo de la interfaz de red del contenedor estén configurados en 644 o más restrictivos (manual) | L1 | Control equivalente | 755 | La ruta de los clústeres Anthos en la interfaz de red de contenedores de AWS es /opt/cni/bin y su permiso está establecido en 755 para el funcionamiento normal del clúster. |
1.1.10 | Asegúrese de que la propiedad del archivo de interfaz de red del contenedor esté configurada como root:root (manual) | L1 | Control equivalente | root:root | La ruta de los clústeres Anthos en la interfaz de red de contenedores de AWS es /opt/cni/bin y su propiedad está configurada como root:root . |
1.1.11 | Asegúrese de que los permisos del directorio de datos etcd estén configurados en 700 o más restrictivos (automatizado) | L1 | Control equivalente | 755 | El directorio de datos etcd /opt/data/var/lib/etcd tiene los permisos predeterminados 755 pero sus subdirectorios son 700 . |
1.1.12 | Asegúrese de que la propiedad del directorio de datos etcd esté establecida en etcd:etcd (automatizado) | L1 | Control equivalente | root:root | El contenedor etcd se ejecuta como root y el directorio de datos etcd es propiedad de root:root . |
1.1.13 | Asegúrese de que los permisos del archivo . de administrador estén configurados en 600 o más restrictivos (automatizado) | L1 | Control equivalente | no establecido | Los clústeres Anthos en AWS no son compatibles con kubeadm. |
1.1.14 | Asegúrese de que la propiedad del archivo . del administrador esté establecida en root:root (automatizado) | L1 | Control equivalente | no establecido | Los clústeres Anthos en AWS no son compatibles con kubeadm. |
1.2.10 | Asegúrese de que el complemento de control de admisión EventRateLimit esté configurado (Manual) | L1 | Advertir | no establecido | Los clústeres de Anthos en AWS no admiten el controlador de admisión de límite de tasa de eventos, ya que es una función alfa de Kubernetes. |
1.2.12 | Asegúrese de que el complemento de control de admisión AlwaysPullImages esté configurado (Manual) | L1 | Advertir | no establecido | El controlador de admisión AlwaysPullImages proporciona cierta protección para las imágenes de registros privados en clústeres multiinquilino no cooperativos, a costa de convertir los registros de contenedores en un único punto de fallo para la creación de nuevos pods en todo el clúster. GKE en AWS no habilita el controlador de admisión AlwaysPullImages, lo que deja en manos de los administradores del clúster la tarea de implementar la política de admisión para compensar esta desventaja. |
1.2.13 | Asegúrese de que el complemento de control de admisión SecurityContextDeny esté configurado si no se utiliza PodSecurityPolicy (Manual) | L1 | Control equivalente | no establecido | Los clústeres de Anthos en AWS definen políticas de seguridad predeterminadas. Los clientes pueden configurar opciones de seguridad con un contexto de seguridad. Más información sobre la descripción general de seguridad . |
1.2.19 | Asegúrese de que el argumento --audit-log-path esté configurado (automatizado) | L1 | Control equivalente | no establecido | Los clústeres de Anthos en AWS ofrecen la opción de registro de auditoría en la nube. Más información sobre registros de auditoría en la nube . |
1.2.20 | Asegúrese de que el argumento --audit-log-maxage esté establecido en 30 o según corresponda (automatizado) | L1 | Control equivalente | no establecido | Los clústeres de Anthos en AWS ofrecen la opción de registro de auditoría en la nube. Más información sobre registros de auditoría en la nube . |
1.2.21 | Asegúrese de que el argumento --audit-log-maxbackup esté establecido en 10 o según corresponda (automatizado) | L1 | Control equivalente | no establecido | Los clústeres de Anthos en AWS ofrecen la opción de registro de auditoría en la nube. Más información sobre registros de auditoría en la nube . |
1.2.22 | Asegúrese de que el argumento --audit-log-maxsize esté establecido en 100 o según corresponda (automatizado) | L1 | Control equivalente | no establecido | Los clústeres de Anthos en AWS ofrecen la opción de registro de auditoría en la nube. Más información sobre registros de auditoría en la nube . |
3.1.1 | La autenticación del certificado de cliente no debe utilizarse para los usuarios (Manual) | L2 | Control equivalente | Los clústeres de Anthos en AWS admiten OIDC como uno de los mecanismos de autenticación para conectarse al clúster; más información en Conectarse y autenticarse en su clúster . | |
3.2.2 | Asegúrese de que la política de auditoría cubra las preocupaciones de seguridad clave (Manual) | L2 | Control equivalente | no establecido | Los clústeres de Anthos en AWS ofrecen la opción de registro de auditoría en la nube. Más información sobre registros de auditoría en la nube . |
4.2.4 | Asegúrese de que el argumento --read-only-port esté establecido en 0 (Manual) | L1 | Fallar | 10255 | Actualmente, los clústeres Anthos en AWS establecen el argumento --read-only-port en 10255 para recopilar métricas de kubelet. |
4.2.6 | Asegúrese de que el argumento --protect-kernel-defaults esté establecido en verdadero (automatizado) | L1 | Fallar | false | Los clústeres Anthos en AWS permiten que kubelet establezca la configuración de kernel necesaria. |
4.2.9 | Asegúrese de que el argumento --event-qps esté establecido en 0 o en un nivel que garantice la captura de eventos adecuada (Manual) | L2 | Advertir | no establecido | Los eventos son objetos de Kubernetes almacenados en etcd. Para evitar saturar etcd, solo se conservan durante una hora y no constituyen un mecanismo adecuado para la auditoría de seguridad. Permitir un número ilimitado de eventos, como se sugiere en este control, expone el clúster a un riesgo de denegación de servicio (DoS) innecesario y contradice la recomendación de usar EventRateLimits de admisión. Los eventos relevantes para la seguridad que requieren almacenamiento permanente deben enviarse a los registros. |
4.2.10 | Asegúrese de que los argumentos --tls-cert-file y --tls-private-key-file estén configurados como apropiados (Manual) | L1 | Control equivalente | no establecido | Los clústeres Anthos en AWS administran el TLS del servidor Kubelet mediante el indicador serverTLSBootstrap . |
Cómo auditar puntos de referencia
Las instrucciones específicas para auditar cada recomendación están disponibles en el punto de referencia CIS correspondiente. Sin embargo, puede que desee automatizar algunas de estas comprobaciones para simplificar la verificación de estos controles en su entorno. Las herramientas que se indican a continuación pueden ayudarle.
Auditoría automatizada del CIS Kubernetes Benchmark
Puede utilizar una herramienta de código abierto, kube-bench
para probar la configuración de su clúster frente al punto de referencia CIS Kubernetes.
Asegúrese de especificar la versión adecuada, por ejemplo,
kube-bench node --benchmark cis-1.23