En este documento se presenta el benchmark de Kubernetes de CIS, se explica cómo auditar el cumplimiento del benchmark y se explica qué configura Google Distributed Cloud (GDC) aislado cuando no puedes implementar una recomendación por tu cuenta.
Acerca de las comparativas del CIS
El Center for Internet Security (CIS) publica comparativas de prácticas recomendadas de seguridad. El benchmark de Kubernetes del CIS ofrece un conjunto de recomendaciones para configurar Kubernetes de forma que se mantenga una posición de seguridad sólida. El benchmark está vinculado a una versión específica de Kubernetes. El benchmark de Kubernetes de 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 la forma más universal posible en todas las distribuciones.
Acceder a la comparativa
La guía CIS Kubernetes Benchmark está disponible en el sitio web de CIS.
Niveles de recomendación
En la siguiente tabla se describen los niveles de recomendación de los estándares CIS Kubernetes Benchmark.
| Nivel | Descripción |
|---|---|
| Nivel 1 | Las recomendaciones presentan una o varias de las siguientes características: |
| 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 implementarla. Ambos estados son igual de importantes y se determinan y admiten tal como se define en las siguientes tablas.
Versiones
La evaluación hace referencia a las siguientes versiones:
| Versión de GDC en Bare Metal | Versión de Kubernetes | Versión de CIS Kubernetes Benchmark |
|---|---|---|
| 1,30 | 1.30.9 | v0.10.4 |
Estado del clúster de Kubernetes de GDC aislado
| # | 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 de archivo de la especificación del pod del servidor de la API estén definidos como 600 o más restrictivos (automatizado) |
L1 | Superada |
| 1.1.2 | Asegúrate de que la propiedad del archivo de especificación del pod del servidor de la API esté definida como root:root (automatizado) |
L1 | Superada |
| 1.1.3 | Asegúrate de que los permisos de archivo de la especificación del pod del gestor de controladores estén definidos como 600 o más restrictivos (automatizado) |
L1 | Superada |
| 1.1.4 | Asegúrate de que la propiedad del archivo de especificación del pod del gestor de controladores sea root:root (automatizado) |
L1 | Superada |
| 1.1.5 | Asegúrate de que los permisos de archivo de la especificación del pod del programador sean 600 o más restrictivos (automatizado) |
L1 | Superada |
| 1.1.6 | Asegúrate de que la propiedad del archivo de especificación del pod del programador esté asignada a root:root (automatizado) |
L1 | Superada |
| 1.1.7 | Asegúrate de que los permisos de archivo de la especificación del pod etcd sean 600 o más restrictivos (automatizado) |
L1 | Superada |
| 1.1.8 | Asegúrate de que la propiedad del archivo de especificación del pod etcd esté asignada a root:root (automatizado) |
L1 | Superada |
| 1.1.9 | Asegúrate de que los permisos de archivos de la interfaz de red de contenedores estén definidos como 600 o más restrictivos (manual) |
L1 | Advertencia |
| 1.1.10 | Asegúrate de que la propiedad del archivo de la interfaz de red de contenedores esté asignada a root:root (manual) |
L1 | Advertencia |
| 1.1.11 | Asegúrate de que los permisos del directorio de datos de etcd estén definidos como 700 o más restrictivos (automatizado) |
L1 | Superada |
| 1.1.12 | Asegúrate de que la propiedad del directorio de datos de etcd esté definida como etcd:etcd (automatizado) |
L1 | No superada |
| 1.1.13 | Asegúrate de que los permisos de archivos de credenciales administrativas predeterminados estén definidos como 600 (automatizado) |
L1 | Superada |
| 1.1.14 | Asegúrate de que la propiedad del archivo de credenciales administrativas predeterminado esté definida como root:root (automatizado) |
L1 | Superada |
| 1.1.15 | Asegúrate de que los permisos del archivo scheduler.conf estén definidos como 600 o más restrictivos (automatizado) |
L1 | Superada |
| 1.1.16 | Asegúrate de que la propiedad del archivo scheduler.conf sea root:root (automatizado) |
L1 | No superada |
| 1.1.17 | Asegúrate de que los permisos del archivo controller-manager.conf estén definidos como 600 o más restrictivos (automatizado) |
L1 | Superada |
| 1.1.18 | Asegúrate de que la propiedad del archivo controller-manager.conf sea root:root (automatizado) |
L1 | No superada |
| 1.1.19 | Asegúrate de que la propiedad del directorio y de los archivos de la PKI de Kubernetes esté asignada a root:root (automatizado) |
L1 | No superada |
| 1.1.20 | Asegúrate de que los permisos de los archivos de certificados de la infraestructura de clave pública de Kubernetes sean 600 o más restrictivos (manual) |
L1 | Advertencia |
| 1.1.21 | Asegúrate de que los permisos de los archivos de claves de la PKI de Kubernetes estén definidos como 600 (manual) |
L1 | Advertencia |
| 1.2 | Servidor de la API | ||
| 1.2.1 | Asegúrate de que el argumento --anonymous-auth tenga el valor false (manual) |
L1 | Advertencia |
| 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 el --DenyServiceExternalIPs esté definido (manual) |
L1 | Advertencia |
| 1.2.4 | Asegúrate de que los argumentos --kubelet-client-certificate y --kubelet-client-key estén configurados correctamente (automatizado) |
L1 | Superada |
| 1.2.5 | Asegúrate de que el argumento --kubelet-certificate-authority esté configurado correctamente (automatizado) |
L1 | Superada |
| 1.2.6 | Asegúrate de que el argumento --authorization-mode no esté definido como AlwaysAllow (automatizado) |
L1 | Superada |
| 1.2.7 | Asegúrate de que el argumento --authorization-mode incluya Node (automatizado) |
L1 | Superada |
| 1.2.8 | Asegúrate de que el argumento --authorization-mode incluya RBAC (automatizado) |
L1 | Superada |
| 1.2.9 | Asegúrate de que el complemento de control de admisión EventRateLimit esté configurado (manual) |
L1 | Advertencia |
| 1.2.10 | Asegúrate de que el complemento de control de admisión AlwaysAdmit no esté definido (automatizado) |
L1 | Superada |
| 1.2.11 | Asegúrate de que el complemento de control de admisión AlwaysPullImages esté configurado (manual) |
L1 | Advertencia |
| 1.2.12 | Asegúrate de que el complemento de control de admisión ServiceAccount esté configurado (automatizado) |
L1 | Superada |
| 1.2.13 | Asegúrate de que el complemento de control de admisión NamespaceLifecycle esté configurado (automatizado) |
L1 | Superada |
| 1.2.14 | Asegúrate de que el complemento de control de admisión NodeRestriction esté configurado (automatizado) |
L1 | Superada |
| 1.2.15 | Asegúrate de que el argumento --profiling tenga el valor false (automatizado) |
L1 | Superada |
| 1.2.16 | Asegúrate de que el argumento --audit-log-path esté definido (automatizado) |
L1 | Superada |
| 1.2.17 | Asegúrate de que el argumento --audit-log-maxage esté definido como 30 o según corresponda (automatizado) |
L1 | Superada |
| 1.2.18 | Asegúrate de que el argumento --audit-log-maxbackup esté definido como 10 o según corresponda (automatizado) |
L1 | Superada |
| 1.2.19 | Asegúrate de que el argumento --audit-log-maxsize esté definido como 100 o según corresponda (automatizado) |
L1 | Superada |
| 1.2.20 | Asegúrate de que el argumento --request-timeout esté configurado correctamente (manual) |
L1 | Advertencia |
| 1.2.21 | Asegúrate de que el argumento --service-account-lookup tenga el valor true (automatizado) |
L1 | Superada |
| 1.2.22 | Asegúrate de que el argumento --service-account-key-file esté configurado correctamente (automatizado) |
L1 | Superada |
| 1.2.23 | Asegúrate de que los argumentos --etcd-certfile y --etcd-keyfile estén configurados correctamente (automatizado) |
L1 | Superada |
| 1.2.24 | Asegúrate de que los argumentos --tls-cert-file y --tls-private-key-file estén configurados correctamente (automatizado) |
L1 | Superada |
| 1.2.25 | Asegúrate de que el argumento --client-ca-file esté configurado correctamente (automatizado) |
L1 | Superada |
| 1.2.26 | Asegúrate de que el argumento --etcd-cafile esté configurado correctamente (automatizado) |
L1 | Superada |
| 1.2.27 | Asegúrate de que el argumento --encryption-provider-config esté configurado correctamente (manual) |
L1 | Superada |
| 1.2.28 | Asegúrate de que los proveedores de cifrado estén configurados correctamente (manual) | L1 | Superada |
| 1.2.29 | Asegúrate de que el servidor de la API solo use cifrados criptográficos seguros (manual) | L1 | Superada |
| 1.3 | Controller Manager | ||
| 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 --profiling argument esté definido como false (automatizado) |
L1 | Superada |
| 1.3.3 | Asegúrate de que el argumento --use-service-account-credentials tenga el valor 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 tenga el valor true (automatizado) |
L2 | Superada |
| 1.3.7 | Asegúrate de que el argumento --bind-address tenga el valor 127.0.0.1 (automatizado) |
L1 | No superada |
| 1.4 | Programador | ||
| 1.4.1 | Asegúrate de que el argumento --profiling tenga el valor false (automatizado) |
L1 | Superada |
| 1.4.2 | Asegúrate de que el argumento --bind-address tenga el valor 127.0.0.1 (automatizado) |
L1 | No superada |
Comparativas de auditoría
Las instrucciones específicas para auditar cada recomendación están disponibles como parte de la comparativa de CIS correspondiente. Sin embargo, puede que quieras automatizar algunas de estas comprobaciones para simplificar la verificación de estos controles en tu entorno. La siguiente herramienta puede ayudarte con esto.
Auditoría automatizada de CIS Kubernetes Benchmark
Puedes usar la herramienta de código abierto kube-bench para probar la configuración de tu clúster con respecto al benchmark de Kubernetes de CIS.
Asegúrate de especificar la versión adecuada. Por ejemplo:
kube-bench --benchmark BENCHMARK_VERSION
Sustituye BENCHMARK_VERSION por la versión de CIS Kubernetes Benchmark que estés usando para evaluar tu clúster.
Para ejecutar secciones específicas de CIS Benchmark, como master, node o etcd, usa el comando run --targets. Por ejemplo:
kube-bench run --targets master,node
Para obtener más información, consulta la documentación de kube-bench sobre cómo ejecutar kube-bench y sobre comandos y marcas.