Guía de autoevaluación CIS 1.11

Descripción general

Este documento es un complemento a la guía de protección de seguridad de RKE2. La guía de protección proporciona orientación prescriptiva para proteger una instalación de producción de RKE2, y esta guía de referencia está destinada a ayudarte a evaluar el nivel de seguridad del clúster protegido frente a cada control en el benchmark de Kubernetes CIS. Está destinada a ser utilizada por operadores de RKE2, equipos de seguridad, auditores y tomadores de decisiones.

Esta guía es específica para la línea de lanzamiento v1.29-1.34 de RKE2 y la versión v1.11 del Benchmark de Kubernetes CIS.

Para más información sobre cada control, incluyendo justificaciones detalladas y descripciones de las verificaciones, puedes consultar la sección correspondiente del Benchmark de Kubernetes CIS v1.8. Puedes descargar el benchmark, después de crear una cuenta gratuita, en Centro para la Seguridad en Internet (CIS).

Metodología de pruebas de controles

Cada control en el Benchmark de Kubernetes CIS fue evaluado contra un clúster de RKE2 que fue configurado de acuerdo con la guía de protección adjunta.

Estos son los posibles resultados para cada control:

  • APROBADO - El control está automatizado (puntuado: verdadero). El clúster de RKE2 en prueba pasó la auditoría descrita en el benchmark.

  • No aplicable - El control no es aplicable (tipo: skip) a RKE2 debido a cómo está diseñado para operar. La sección de justificación explicará por qué es así.

  • Advertencia - El control es manual (puntuado: falso) en el benchmark CIS y depende de la intervención manual del operador. La sección de remediación proporcionará orientación sobre cómo lograr un resultado de APROBADO.

1 Configuración de Seguridad del Plano de Control

1.1 Archivos de configuración del nodo 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 600 o más restrictivos (Automatizado)

Resultado: PASS

Auditoría:

stat -c permissions=%a /var/lib/rancher/rke2/agent/pod-manifests/kube-apiserver.yaml

Resultado Esperado: los permisos son 600, se esperaban 600 o más restrictivos

Valor Devuelto:
permissions=600
Solución:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo del plano de control. Por ejemplo, chmod 600 /var/lib/rancher/rke2/agent/pod-manifests/kube-apiserver.yaml

1.1.2 Asegúrese de que la propiedad del archivo de especificación del pod del servidor API esté configurada en root:root (Automatizado)

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /var/lib/rancher/rke2/agent/pod-manifests/kube-apiserver.yaml; then stat -c %U:%G /var/lib/rancher/rke2/agent/pod-manifests/kube-apiserver.yaml; fi'

Resultado Esperado: 'root:root' es igual a 'root:root'

Valor Devuelto:
root:root
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo del plano de control. Por ejemplo, chown root:root /var/lib/rancher/rke2/agent/pod-manifests/kube-apiserver.yaml

1.1.3 Asegúrese de que los permisos del archivo de especificación del pod del administrador de control estén configurados en 600 o más restrictivos (Automatizado)

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /var/lib/rancher/rke2/agent/pod-manifests/kube-controller-manager.yaml; then stat -c permissions=%a /var/lib/rancher/rke2/agent/pod-manifests/kube-controller-manager.yaml; fi'

Resultado Esperado: los permisos son 600, se esperaban 600 o más restrictivos

Valor Devuelto:
permissions=600
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo del plano de control. Por ejemplo, chmod 600 /var/lib/rancher/rke2/agent/pod-manifests/kube-controller-manager.yaml

1.1.4 Asegúrese de que la propiedad del archivo de especificación del pod del administrador de control esté configurada en root:root (Automatizado)

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /var/lib/rancher/rke2/agent/pod-manifests/kube-controller-manager.yaml; then stat -c %U:%G /var/lib/rancher/rke2/agent/pod-manifests/kube-controller-manager.yaml; fi'

Resultado Esperado: 'root:root' es igual a 'root:root'

Valor Devuelto:
root:root
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo del plano de control. Por ejemplo, chown root:root /var/lib/rancher/rke2/agent/pod-manifests/kube-controller-manager.yaml

1.1.5 Asegúrese de que los permisos del archivo de especificación del pod del programador estén configurados en 600 o más restrictivos (Automatizado)

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /var/lib/rancher/rke2/agent/pod-manifests/kube-scheduler.yaml; then stat -c permissions=%a /var/lib/rancher/rke2/agent/pod-manifests/kube-scheduler.yaml; fi'

Resultado Esperado: los permisos son 600, se esperaban 600 o más restrictivos

Valor Devuelto:
permissions=600
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo del plano de control. Por ejemplo, chmod 600 /var/lib/rancher/rke2/agent/pod-manifests/kube-scheduler.yaml

1.1.6 Asegúrese de que la propiedad del archivo de especificación del pod del programador esté configurada en root:root (Automatizado)

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /var/lib/rancher/rke2/agent/pod-manifests/kube-scheduler.yaml; then stat -c %U:%G /var/lib/rancher/rke2/agent/pod-manifests/kube-scheduler.yaml; fi'

Resultado Esperado: 'root:root' está presente

Valor Devuelto:
root:root
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo del plano de control. Por ejemplo, chown root:root /var/lib/rancher/rke2/agent/pod-manifests/kube-scheduler.yaml

1.1.7 Asegúrese de que los permisos del archivo de especificación del pod de etcd estén configurados en 600 o más restrictivos (Manual)

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /var/lib/rancher/rke2/agent/pod-manifests/etcd.yaml; then stat -c permissions=%a /var/lib/rancher/rke2/agent/pod-manifests/etcd.yaml; fi'

Resultado Esperado: los permisos son 600, se esperaban 600 o más restrictivos

Valor Devuelto:
permissions=600
Solución:

Si se ejecuta solo el maestro sin rol de etcd, esta verificación no es aplicable. Si los roles de controlplane y etcd están presentes en los mismos nodos pero esta verificación es una advertencia, ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo del plano de control. Por ejemplo, chmod 600 /var/lib/rancher/rke2/agent/pod-manifests/etcd.yaml

1.1.8 Asegúrese de que la propiedad del archivo de especificación del pod de etcd esté configurada en root:root (Manual)

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /var/lib/rancher/rke2/agent/pod-manifests/etcd.yaml; then stat -c %U:%G /var/lib/rancher/rke2/agent/pod-manifests/etcd.yaml; fi'

Resultado Esperado: 'root:root' es igual a 'root:root'

Valor Devuelto:
root:root
Solución:

Si se ejecuta solo el maestro sin rol de etcd, esta verificación no es aplicable. Si los roles de controlplane y etcd están presentes en los mismos nodos pero esta verificación es una advertencia, ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo del plano de control. Por ejemplo, chown root:root /var/lib/rancher/rke2/agent/pod-manifests/etcd.yaml

1.1.9 Asegúrate de que los permisos del archivo de la interfaz de red de contenedor estén configurados en 600 o más restrictivos (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Ten en cuenta que para muchos CNIs, se crea un archivo de bloqueo con permisos 750. Esto es esperado y se puede ignorar. Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo de control. Por ejemplo, chmod 600 /var/lib/cni/networks/<filename> and chmod 600 /etc/cni/net.d/<filename>

1.1.10 Asegúrese de que la propiedad del archivo de la interfaz de red de contenedor esté establecida en root:root (Manual)

Resultado: PASS

Auditoría:

ps -fC ${kubeletbin:-kubelet} | grep -- --cni-conf-dir || echo "/etc/cni/net.d" | sed 's%.*cni-conf-dir[= ]\([^ ]*\).*%\1%' | xargs -I{} find {} -mindepth 1 | xargs --no-run-if-empty stat -c %U:%G
find /var/lib/cni/networks -type f 2> /dev/null | xargs --no-run-if-empty stat -c %U:%G

Resultado Esperado: 'root:root' está presente

Valor Devuelto:
root:root
root:root
root:root
root:root
root:root
root:root
root:root
root:root
root:root
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo de control. Por ejemplo, chown root:root <path/to/cni/files>

1.1.11 Asegúrese de que los permisos del directorio de datos de etcd estén establecidos en 700 o más restrictivos (Manual)

Resultado: PASS

Auditoría:

stat -c permissions=%a /var/lib/rancher/rke2/server/db/etcd

Resultado Esperado: los permisos son 700, se esperaba 700 o más restrictivos

Valor Devuelto:
permissions=700
Solución:

Si se ejecuta solo el maestro sin rol de etcd, esta verificación no es aplicable. Si los roles de plano de control y etcd están presentes en los mismos nodos pero esta verificación es una advertencia, entonces en el nodo del servidor etcd, obtén el directorio de datos de etcd, pasado como un argumento --data-dir, del comando 'ps -ef | grep etcd'. Ejecuta el siguiente comando (basado en el directorio de datos de etcd encontrado arriba). Por ejemplo, chmod 700 /var/lib/rancher/rke2/server/db/etcd

1.1.12 Asegúrese de que la propiedad del directorio de datos de etcd esté establecida en etcd:etcd (Manual)

Resultado: PASS

Auditoría:

stat -c %U:%G /var/lib/rancher/rke2/server/db/etcd

Resultado Esperado: 'etcd:etcd' está presente

Valor devuelto:
etcd:etcd
Solución:

Si se ejecuta solo el maestro sin rol de etcd, esta verificación no es aplicable. Si los roles de plano de control y etcd están presentes en los mismos nodos pero esta verificación es una advertencia, entonces en el nodo del servidor etcd, obtén el directorio de datos de etcd, pasado como un argumento --data-dir, del comando 'ps -ef | grep etcd'. Ejecuta el siguiente comando (basado en el directorio de datos de etcd encontrado arriba). Por ejemplo, chown etcd:etcd /var/lib/rancher/rke2/server/db/etcd

1.1.13 Asegúrese de que los permisos del archivo admin.conf estén configurados a 600 o más restrictivos (Automatizado)

Resultado: PASS

Auditoría:

stat -c permissions=%a /var/lib/rancher/rke2/server/cred/admin.kubeconfig

Resultado Esperado: los permisos son 600, se esperaban 600 o más restrictivos

Valor Devuelto:
permissions=600
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo del plano de control. Por ejemplo, chmod 600 /var/lib/rancher/rke2/server/cred/admin.kubeconfig

1.1.14 Asegúrese de que la propiedad del archivo admin.conf esté configurada a root:root (Automatizado)

Resultado: PASS

Auditoría:

stat -c %U:%G /var/lib/rancher/rke2/server/cred/admin.kubeconfig

Resultado Esperado: 'root:root' es igual a 'root:root'

Valor Devuelto:
root:root
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo del plano de control. Por ejemplo, chown root:root /var/lib/rancher/rke2/server/cred/admin.kubeconfig

1.1.15 Asegúrese de que los permisos del archivo scheduler.conf estén configurados a 600 o más restrictivos (Automatizado)

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /var/lib/rancher/rke2/server/cred/scheduler.kubeconfig; then stat -c permissions=%a /var/lib/rancher/rke2/server/cred/scheduler.kubeconfig; fi'

Resultado Esperado: los permisos son 600, se esperaban 600 o más restrictivos

Valor Devuelto:
permissions=600
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo de control. Por ejemplo, chmod 600 /var/lib/rancher/rke2/server/cred/scheduler.kubeconfig

1.1.16 Asegúrese de que la propiedad del archivo scheduler.conf esté configurada a root:root (Automatizado)

Resultado: PASS

Auditoría:

stat -c %U:%G /var/lib/rancher/rke2/server/cred/scheduler.kubeconfig

Resultado Esperado: 'root:root' es igual a 'root:root'

Valor Devuelto:
root:root
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo de control. Por ejemplo, chown root:root /var/lib/rancher/rke2/server/cred/scheduler.kubeconfig

1.1.17 Asegúrate de que los permisos del archivo controller-manager.conf estén configurados a 600 o más restrictivos (Automatizado)

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /var/lib/rancher/rke2/server/cred/controller.kubeconfig; then stat -c permissions=%a /var/lib/rancher/rke2/server/cred/controller.kubeconfig; fi'

Resultado Esperado: los permisos son 600, se esperaban 600 o más restrictivos

Valor Devuelto:
permissions=600
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo de control. Por ejemplo, chmod 600 /var/lib/rancher/rke2/server/cred/controller.kubeconfig

1.1.18 Asegúrate de que la propiedad del archivo controller-manager.conf esté configurada a root:root (Automatizado)

Resultado: PASS

Auditoría:

stat -c %U:%G /var/lib/rancher/rke2/server/cred/controller.kubeconfig

Resultado Esperado: 'root:root' es igual a 'root:root'

Valor Devuelto:
root:root
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo de control. Por ejemplo, chown root:root /var/lib/rancher/rke2/server/cred/controller.kubeconfig

1.1.19 Asegúrate de que la propiedad del directorio y archivo PKI de Kubernetes esté configurada a root:root (Automatizado)

Resultado: PASS

Auditoría:

stat -c %U:%G /var/lib/rancher/rke2/server/tls

Resultado Esperado: 'root:root' es igual a 'root:root'

Valor Devuelto:
root:root
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo de control. Por ejemplo, chown -R root:root /var/lib/rancher/rke2/server/tls

1.1.20 Asegúrate de que los permisos del archivo de certificado PKI de Kubernetes estén configurados en 644 o más restrictivos (Automatizado)

Resultado: PASS

Auditoría:

stat -c permissions=%a /var/lib/rancher/rke2/server/tls/*.crt

Resultado Esperado: los permisos son 644, se esperaba 644 o más restrictivos

Valor devuelto:
permissions=644
permissions=644
permissions=644
permissions=644
permissions=644
permissions=644
permissions=644
permissions=644
permissions=644
permissions=644
permissions=644
permissions=644
permissions=644
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo de control. Por ejemplo, chmod -R 644 /var/lib/rancher/rke2/server/tls/*.crt Por defecto, RKE2 establece los permisos del archivo de certificado PKI en 644, se admiten permisos más restrictivos como 600.

1.1.21 Asegúrate de que los permisos del archivo de clave PKI de Kubernetes estén configurados a 600 (Automatizado)

Resultado: PASS

Auditoría:

stat -c permissions=%a /var/lib/rancher/rke2/server/tls/*.key

Resultado Esperado: los permisos son 600, se esperaban 600 o más restrictivos

Valor Devuelto:
permissions=600
permissions=600
permissions=600
permissions=600
permissions=600
permissions=600
permissions=600
permissions=600
permissions=600
permissions=600
permissions=600
permissions=600
permissions=600
permissions=600
permissions=600
permissions=600
permissions=600
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en el nodo de control. Por ejemplo, chmod -R 600 /var/lib/rancher/rke2/server/tls/*.key

1.2 Servidor API

1.2.1 Asegúrate de que el argumento --anonymous-auth esté configurado a false (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--anonymous-auth' es igual a 'false'

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 establece el argumento --anonymous-auth en false. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier cosa similar a lo siguiente.

kube-apiserver-arg:
  - "anonymous-auth=true"

1.2.2 Asegúrese de que el parámetro --token-auth-file no esté configurado (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--token-auth-file' no está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Remediación:

Sigue la documentación y configura mecanismos alternativos para la autenticación. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier cosa similar a lo siguiente.

kube-apiserver-arg:
  - "token-auth-file=<path>"

1.2.3 Asegúrate de que el --DenyServiceExternalIPs esté configurado (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Por defecto, RKE2 no establece DenyServiceExternalIPs. Para habilitar esta opción, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml como se indica a continuación.

kube-apiserver-arg:
  - "enable-admission-plugins=DenyServiceExternalIPs"

1.2.4 Asegúrate de que los argumentos --kubelet-client-certificate y --kubelet-client-key estén configurados adecuadamente (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--kubelet-client-certificate' está presente Y '--kubelet-client-key' está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 proporciona automáticamente el certificado y la clave del cliente kubelet. Se generan y se encuentran en /var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt y /var/lib/rancher/rke2/server/tls/client-kube-apiserver.key. Si por alguna razón necesitas proporcionar tu propio certificado y clave, puedes establecer los parámetros a continuación en el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml.

kube-apiserver-arg:
  - "kubelet-client-certificate=<path/to/client-cert-file>"
  - "kubelet-client-key=<path/to/client-key-file>"

1.2.5 Asegúrate de que el argumento --kubelet-certificate-authority esté configurado adecuadamente (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--kubelet-certificate-authority' está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 proporciona automáticamente el archivo de certificado CA del kubelet, en /var/lib/rancher/rke2/server/tls/server-ca.crt. Si por alguna razón necesitas proporcionar tu propio certificado CA, considera usar las herramientas shell de certificados de rke2. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier línea como la siguiente.

kube-apiserver-arg:
  - "kubelet-certificate-authority=<path/to/ca-cert-file>"

1.2.6 Asegúrate de que el argumento --authorization-mode no esté configurado como AlwaysAllow (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--authorization-mode' no tiene 'AlwaysAllow'

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 no establece el --authorization-mode como AlwaysAllow. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml, elimina cualquier línea como la siguiente.

kube-apiserver-arg:
  - "authorization-mode=AlwaysAllow"

1.2.7 Asegúrate de que el argumento --authorization-mode incluya Node (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--authorization-mode' tiene 'Node'

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 establece el --authorization-mode en Node y RBAC. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml, asegúrate de que no estás sobrescribiendo el authorization-mode.

1.2.8 Asegúrate de que el argumento --authorization-mode incluya RBAC (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--authorization-mode' tiene 'RBAC'

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 establece el --authorization-mode en Node y RBAC. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml. Asegúrate de que no estás sobrescribiendo el authorization-mode.

1.2.9 Asegúrate de que el plugin de control de admisión EventRateLimit esté configurado (Manual)

Resultado: WARN (ADVERTENCIA)

Remediación: Sigue la documentación de Kubernetes y establece los límites deseados en un archivo de configuración. Luego, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y establece los parámetros a continuación.

kube-apiserver-arg:
  - "enable-admission-plugins=...,EventRateLimit,..."
  - "admission-control-config-file=<path/to/configuration/file>"

1.2.10 Asegúrate de que el plugin de control de admisión AlwaysAdmit no esté configurado (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--habilitar-plugins-de-admisión' no tiene 'AlwaysAdmit' O '--habilitar-plugins-de-admisión' no está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 no establece el --enable-admission-plugins en AlwaysAdmit. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml, elimina cualquier línea como la siguiente.

kube-apiserver-arg:
  - "enable-admission-plugins=AlwaysAdmit"

1.2.11 Asegúrate de que el plugin de control de admisión AlwaysPullImages esté configurado (Manual)

Resultado: WARN (ADVERTENCIA)

Remediación: Permisivo, según las directrices de CIS, "Esta configuración podría afectar a clústeres fuera de línea o aislados, que tienen imágenes precargadas y no tienen acceso a un registro para obtener imágenes en uso." Esta configuración no es apropiada para clústeres que utilizan esta configuración." Edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml en el nodo de control y establece el parámetro --enable-admission-plugins para incluir AlwaysPullImages. --enable-admission-plugins=…​,AlwaysPullImages,…​

1.2.12 Asegúrate de que el plugin de control de admisión ServiceAccount esté configurado (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--deshabilitar-plugins-de-admisión' está presente O '--deshabilitar-plugins-de-admisión' no está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 no establece el --disable-admission-plugins en nada. Sigue la documentación y crea objetos ServiceAccount según tu entorno. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier línea como la siguiente.

kube-apiserver-arg:
  - "disable-admission-plugins=ServiceAccount"

1.2.13 Asegúrate de que el plugin de control de admisión NamespaceLifecycle esté configurado (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--deshabilitar-plugins-de-admisión' está presente O '--deshabilitar-plugins-de-admisión' no está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 no establece el --disable-admission-plugins en nada. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier línea como la siguiente.

kube-apiserver-arg:
  - "disable-admission-plugins=...,NamespaceLifecycle,..."

1.2.14 Asegúrate de que el plugin de control de admisión NodeRestriction esté configurado (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--enable-admission-plugins' tiene 'NodeRestriction'

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 establece el --enable-admission-plugins en NodeRestriction. Revisa el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y asegúrate de que no estás sobrescribiendo los plugins de admisión. Si lo estás, incluye NodeRestriction en la lista.

kube-apiserver-arg:
  - "enable-admission-plugins=...,NodeRestriction,..."

1.2.15 Asegúrate de que el argumento --profiling esté establecido en false (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--profiling' es igual a 'falso'

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 establece el argumento --profiling en falso. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier línea como la siguiente.

kube-apiserver-arg:
  - "profiling=true"

1.2.16 Asegúrate de que el argumento --audit-log-path esté establecido (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--audit-log-path' está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 establece el argumento --audit-log-path en /var/lib/rancher/rke2/server/logs/audit.log. Si deseas cambiar esto, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml en el nodo de control y establece el parámetro --audit-log-path en una ruta y archivo adecuados donde te gustaría que se escribieran los registros de auditoría, por ejemplo,

kube-apiserver-arg:
  - "audit-log-path=/var/log/rke2/audit.log"

1.2.17 Asegúrate de que el argumento --audit-log-maxage esté establecido en 30 o según corresponda (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--audit-log-maxage' es mayor o igual a 30

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 establece el argumento --audit-log-maxage en 30 días. Si deseas cambiar esto, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml en el nodo de control y establece el parámetro --audit-log-maxage en un número de días apropiado, por ejemplo,

kube-apiserver-arg:
  - "audit-log-maxage=40"

1.2.18 Asegúrate de que el argumento --audit-log-maxbackup esté establecido en 10 o según corresponda (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--audit-log-maxbackup' es mayor o igual a 10

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 establece el argumento --audit-log-maxbackup en 10. Si deseas cambiar esto, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml en el nodo de control y establece el parámetro --audit-log-maxbackup en un valor apropiado. Por ejemplo,

kube-apiserver-arg:
  - "audit-log-maxbackup=15"

1.2.19 Asegúrate de que el argumento --audit-log-maxsize esté establecido en 100 o según corresponda (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--audit-log-maxsize' es mayor o igual a 100

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 establece el argumento --audit-log-maxsize en 100 MB. Si deseas cambiar esto, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml en el nodo de control y establece el parámetro --audit-log-maxsize en un tamaño apropiado en MB. Por ejemplo,

kube-apiserver-arg:
  - "audit-log-maxsize=150"

1.2.20 Asegúrate de que el argumento --request-timeout esté establecido como corresponde (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--request-timeout' no está presente O '--request-timeout' está presente

Valor devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Permisivo, según las directrices de CIS, "se recomienda establecer este límite según sea apropiado y cambiar el límite predeterminado de 60 segundos solo si es necesario". Edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y establece el parámetro a continuación si es necesario. Por ejemplo,

kube-apiserver-arg:
  - "request-timeout=300s"

1.2.21 Asegúrate de que el argumento --service-account-lookup esté establecido en true (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--service-account-lookup' no está presente O '--service-account-lookup' está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 no establece el argumento --service-account-lookup. Edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y establece el service-account-lookup. Por ejemplo,

kube-apiserver-arg:
  - "service-account-lookup=true"

Alternativamente, puedes eliminar el parámetro service-account-lookup de este archivo para que se aplique el valor predeterminado.

1.2.22 Asegúrate de que el argumento --service-account-key-file esté establecido según sea apropiado (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--service-account-key-file' está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

RKE2 genera y establece automáticamente el archivo de clave de la cuenta de servicio. Se encuentra en /var/lib/rancher/rke2/server/tls/service.key. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier línea como la siguiente.

kube-apiserver-arg:
  - "service-account-key-file=<path>"

1.2.23 Asegúrate de que los argumentos --etcd-certfile y --etcd-keyfile estén establecidos según sea apropiado (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--etcd-certfile' está presente Y '--etcd-keyfile' está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

RKE2 genera y establece automáticamente los archivos de certificado y clave etcd. Se encuentran en /var/lib/rancher/rke2/server/tls/etcd/client.crt y /var/lib/rancher/rke2/server/tls/etcd/client.key. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier línea como la siguiente.

kube-apiserver-arg:
  - "etcd-certfile=<path>"
  - "etcd-keyfile=<path>"

1.2.24 Asegúrate de que los argumentos --tls-cert-file y --tls-private-key-file estén establecidos según sea apropiado (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--tls-cert-file' está presente Y '--tls-private-key-file' está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 genera y proporciona automáticamente el certificado TLS y la clave privada para el apiserver. Se generan y se encuentran en /var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt y /var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier línea como la siguiente.

kube-apiserver-arg:
  - "tls-cert-file=<path>"
  - "tls-private-key-file=<path>"

1.2.25 Asegúrate de que el argumento --client-ca-file esté configurado adecuadamente (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--client-ca-file' está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 proporciona automáticamente el archivo de autoridad del certificado del cliente. Se genera y se encuentra en /var/lib/rancher/rke2/server/tls/client-ca.crt. Si por alguna razón necesitas proporcionar tu propio certificado CA, considera usar la herramienta shell de certificados de rke2. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier línea como la siguiente.

kube-apiserver-arg:
  - "client-ca-file=<path>"

1.2.26 Asegúrate de que el argumento --etcd-cafile esté configurado adecuadamente (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--etcd-cafile' está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, RKE2 proporciona automáticamente el archivo de autoridad del certificado etcd. Se genera y se encuentra en /var/lib/rancher/rke2/server/tls/client-ca.crt. Si por alguna razón necesitas proporcionar tu propio certificado CA, considera usar la herramienta shell de certificados de rke2. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier línea como la siguiente.

kube-apiserver-arg:
  - "etcd-cafile=<path>"

1.2.27 Asegúrate de que el argumento --encryption-provider-config esté establecido como corresponde (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--encryption-provider-config' está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

RKE2 siempre está configurado para cifrar secretos. El cifrado de secretos se gestiona con la herramienta shell rke2 secrets-encrypt. Si es necesario, puedes encontrar la configuración de cifrado generada en /var/lib/rancher/rke2/server/cred/encryption-config.json.

1.2.28 Asegúrate de que los proveedores de cifrado estén configurados adecuadamente (Automatizado)

Resultado: PASS

Auditoría:

ENCRYPTION_PROVIDER_CONFIG=$(ps -ef | grep kube-apiserver | grep -- --encryption-provider-config | sed 's%.*encryption-provider-config[= ]\([^ ]*\).*%\1%')
if test -e $ENCRYPTION_PROVIDER_CONFIG; then grep -o 'providers\"\:\[.*\]' $ENCRYPTION_PROVIDER_CONFIG | grep -o "[A-Za-z]*" | head -2 | tail -1  | sed 's/^/provider=/'; fi

Resultado Esperado: 'provider' contiene elementos válidos de 'aescbc,kms,secretbox'

Valor Devuelto:
provider=aescbc
Solución:

RKE2 siempre está configurado para utilizar el proveedor de cifrado aescbc para cifrar secretos. El cifrado de secretos se gestiona con la herramienta shell rke2 secrets-encrypt. Si es necesario, puedes encontrar la configuración de cifrado generada en /var/lib/rancher/rke2/server/cred/encryption-config.json.

1.2.29 Asegúrate de que el Servidor API solo utilice Cifrados Criptográficos Fuertes (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--tls-cipher-suites' contiene elementos válidos de 'TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384'

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Por defecto, el kube-apiserver de RKE2 cumple con esta prueba. Los cambios en estos valores pueden causar regresiones, por lo tanto, asegúrate de que todos los clientes del apiserver soporten la nueva configuración TLS antes de aplicarla en implementaciones de producción. Si se requiere una configuración TLS personalizada, considera también crear una versión personalizada de esta regla que se alinee con tus requisitos. Si esta verificación falla, elimina cualquier configuración personalizada relacionada con tls-cipher-suites o actualiza el archivo /etc/rancher/rke2/config.yaml para que coincida con la predeterminada añadiendo lo siguiente: kube-apiserver-arg:

  • "tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305"

1.2.30 Asegúrate de que el parámetro --service-account-extend-token-expiration esté configurado en false (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-apiserver

Resultado Esperado: '--service-account-extend-token-expiration' es igual a 'false'

Valor devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
Solución:

Edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y establece el parámetro --service-account-extend-token-expiration en false antes de recargar rke2, como se indica a continuación: kube-apiserver-arg:

  • "service-account-extend-token-expiration=false" Por defecto, este parámetro está configurado como verdadero.

1.3 Gestor de Controladores

1.3.1 Asegúrate de que el argumento --terminated-pod-gc-threshold esté configurado adecuadamente (Manual)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-controller-manager

Resultado Esperado: '--terminated-pod-gc-threshold' está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18380    2666  1 16:15 ?        00:00:04 kube-controller-manager --permit-port-sharing=true --flex-volume-plugin-dir=/var/lib/kubelet/volumeplugins --terminated-pod-gc-threshold=1000 --allocate-node-cidrs=true --authentication-kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --authorization-kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --bind-address=127.0.0.1 --cluster-cidr=10.42.0.0/16 --cluster-signing-kube-apiserver-client-cert-file=/var/lib/rancher/rke2/server/tls/client-ca.nochain.crt --cluster-signing-kube-apiserver-client-key-file=/var/lib/rancher/rke2/server/tls/client-ca.key --cluster-signing-kubelet-client-cert-file=/var/lib/rancher/rke2/server/tls/client-ca.nochain.crt --cluster-signing-kubelet-client-key-file=/var/lib/rancher/rke2/server/tls/client-ca.key --cluster-signing-kubelet-serving-cert-file=/var/lib/rancher/rke2/server/tls/server-ca.nochain.crt --cluster-signing-kubelet-serving-key-file=/var/lib/rancher/rke2/server/tls/server-ca.key --cluster-signing-legacy-unknown-cert-file=/var/lib/rancher/rke2/server/tls/server-ca.nochain.crt --cluster-signing-legacy-unknown-key-file=/var/lib/rancher/rke2/server/tls/server-ca.key --configure-cloud-routes=false --controllers=*,tokencleaner,-service,-route,-cloud-node-lifecycle --kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --profiling=false --root-ca-file=/var/lib/rancher/rke2/server/tls/server-ca.crt --secure-port=10257 --service-account-private-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --tls-cert-file=/var/lib/rancher/rke2/server/tls/kube-controller-manager/kube-controller-manager.crt --tls-private-key-file=/var/lib/rancher/rke2/server/tls/kube-controller-manager/kube-controller-manager.key --use-service-account-credentials=true
Solución:

Por defecto, RKE2 establece un terminated-pod-gc-threshold de 1000. Si necesitas cambiar este valor, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml en el nodo del plano de control y establece el --terminated-pod-gc-threshold a un umbral adecuado,

kube-controller-manager-arg:
  - "terminated-pod-gc-threshold=10"

1.3.2 Asegúrate de que el argumento --profiling esté configurado en falso (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-controller-manager

Resultado Esperado: '--profiling' es igual a 'falso'

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18380    2666  1 16:15 ?        00:00:04 kube-controller-manager --permit-port-sharing=true --flex-volume-plugin-dir=/var/lib/kubelet/volumeplugins --terminated-pod-gc-threshold=1000 --allocate-node-cidrs=true --authentication-kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --authorization-kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --bind-address=127.0.0.1 --cluster-cidr=10.42.0.0/16 --cluster-signing-kube-apiserver-client-cert-file=/var/lib/rancher/rke2/server/tls/client-ca.nochain.crt --cluster-signing-kube-apiserver-client-key-file=/var/lib/rancher/rke2/server/tls/client-ca.key --cluster-signing-kubelet-client-cert-file=/var/lib/rancher/rke2/server/tls/client-ca.nochain.crt --cluster-signing-kubelet-client-key-file=/var/lib/rancher/rke2/server/tls/client-ca.key --cluster-signing-kubelet-serving-cert-file=/var/lib/rancher/rke2/server/tls/server-ca.nochain.crt --cluster-signing-kubelet-serving-key-file=/var/lib/rancher/rke2/server/tls/server-ca.key --cluster-signing-legacy-unknown-cert-file=/var/lib/rancher/rke2/server/tls/server-ca.nochain.crt --cluster-signing-legacy-unknown-key-file=/var/lib/rancher/rke2/server/tls/server-ca.key --configure-cloud-routes=false --controllers=*,tokencleaner,-service,-route,-cloud-node-lifecycle --kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --profiling=false --root-ca-file=/var/lib/rancher/rke2/server/tls/server-ca.crt --secure-port=10257 --service-account-private-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --tls-cert-file=/var/lib/rancher/rke2/server/tls/kube-controller-manager/kube-controller-manager.crt --tls-private-key-file=/var/lib/rancher/rke2/server/tls/kube-controller-manager/kube-controller-manager.key --use-service-account-credentials=true
Solución:

Por defecto, RKE2 establece el argumento --profiling en falso. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier línea como la siguiente.

kube-controller-manager-arg:
  - "profiling=true"

1.3.3 Asegúrate de que el argumento --use-service-account-credentials esté configurado en verdadero (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-controller-manager

Resultado Esperado: '--use-service-account-credentials' no es igual a 'falso'

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18380    2666  1 16:15 ?        00:00:04 kube-controller-manager --permit-port-sharing=true --flex-volume-plugin-dir=/var/lib/kubelet/volumeplugins --terminated-pod-gc-threshold=1000 --allocate-node-cidrs=true --authentication-kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --authorization-kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --bind-address=127.0.0.1 --cluster-cidr=10.42.0.0/16 --cluster-signing-kube-apiserver-client-cert-file=/var/lib/rancher/rke2/server/tls/client-ca.nochain.crt --cluster-signing-kube-apiserver-client-key-file=/var/lib/rancher/rke2/server/tls/client-ca.key --cluster-signing-kubelet-client-cert-file=/var/lib/rancher/rke2/server/tls/client-ca.nochain.crt --cluster-signing-kubelet-client-key-file=/var/lib/rancher/rke2/server/tls/client-ca.key --cluster-signing-kubelet-serving-cert-file=/var/lib/rancher/rke2/server/tls/server-ca.nochain.crt --cluster-signing-kubelet-serving-key-file=/var/lib/rancher/rke2/server/tls/server-ca.key --cluster-signing-legacy-unknown-cert-file=/var/lib/rancher/rke2/server/tls/server-ca.nochain.crt --cluster-signing-legacy-unknown-key-file=/var/lib/rancher/rke2/server/tls/server-ca.key --configure-cloud-routes=false --controllers=*,tokencleaner,-service,-route,-cloud-node-lifecycle --kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --profiling=false --root-ca-file=/var/lib/rancher/rke2/server/tls/server-ca.crt --secure-port=10257 --service-account-private-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --tls-cert-file=/var/lib/rancher/rke2/server/tls/kube-controller-manager/kube-controller-manager.crt --tls-private-key-file=/var/lib/rancher/rke2/server/tls/kube-controller-manager/kube-controller-manager.key --use-service-account-credentials=true
Solución:

Por defecto, RKE2 establece el argumento --use-service-account-credentials en verdadero. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier línea como la siguiente.

kube-controller-manager-arg:
  - "use-service-account-credentials=false"

1.3.4 Asegúrate de que el argumento --service-account-private-key-file esté configurado adecuadamente (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-controller-manager

Resultado Esperado: '--service-account-private-key-file' está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18380    2666  1 16:15 ?        00:00:04 kube-controller-manager --permit-port-sharing=true --flex-volume-plugin-dir=/var/lib/kubelet/volumeplugins --terminated-pod-gc-threshold=1000 --allocate-node-cidrs=true --authentication-kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --authorization-kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --bind-address=127.0.0.1 --cluster-cidr=10.42.0.0/16 --cluster-signing-kube-apiserver-client-cert-file=/var/lib/rancher/rke2/server/tls/client-ca.nochain.crt --cluster-signing-kube-apiserver-client-key-file=/var/lib/rancher/rke2/server/tls/client-ca.key --cluster-signing-kubelet-client-cert-file=/var/lib/rancher/rke2/server/tls/client-ca.nochain.crt --cluster-signing-kubelet-client-key-file=/var/lib/rancher/rke2/server/tls/client-ca.key --cluster-signing-kubelet-serving-cert-file=/var/lib/rancher/rke2/server/tls/server-ca.nochain.crt --cluster-signing-kubelet-serving-key-file=/var/lib/rancher/rke2/server/tls/server-ca.key --cluster-signing-legacy-unknown-cert-file=/var/lib/rancher/rke2/server/tls/server-ca.nochain.crt --cluster-signing-legacy-unknown-key-file=/var/lib/rancher/rke2/server/tls/server-ca.key --configure-cloud-routes=false --controllers=*,tokencleaner,-service,-route,-cloud-node-lifecycle --kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --profiling=false --root-ca-file=/var/lib/rancher/rke2/server/tls/server-ca.crt --secure-port=10257 --service-account-private-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --tls-cert-file=/var/lib/rancher/rke2/server/tls/kube-controller-manager/kube-controller-manager.crt --tls-private-key-file=/var/lib/rancher/rke2/server/tls/kube-controller-manager/kube-controller-manager.key --use-service-account-credentials=true
Solución:

Por defecto, RKE2 proporciona automáticamente el archivo de clave privada de la cuenta de servicio. Se genera y se encuentra en /var/lib/rancher/rke2/server/tls/service.current.key. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier línea como la siguiente.

kube-controller-manager-arg:
  - "service-account-private-key-file=<path>"

1.3.5 Asegúrate de que el argumento --root-ca-file esté configurado adecuadamente (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-controller-manager

Resultado Esperado: '--root-ca-file' está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18380    2666  1 16:15 ?        00:00:04 kube-controller-manager --permit-port-sharing=true --flex-volume-plugin-dir=/var/lib/kubelet/volumeplugins --terminated-pod-gc-threshold=1000 --allocate-node-cidrs=true --authentication-kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --authorization-kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --bind-address=127.0.0.1 --cluster-cidr=10.42.0.0/16 --cluster-signing-kube-apiserver-client-cert-file=/var/lib/rancher/rke2/server/tls/client-ca.nochain.crt --cluster-signing-kube-apiserver-client-key-file=/var/lib/rancher/rke2/server/tls/client-ca.key --cluster-signing-kubelet-client-cert-file=/var/lib/rancher/rke2/server/tls/client-ca.nochain.crt --cluster-signing-kubelet-client-key-file=/var/lib/rancher/rke2/server/tls/client-ca.key --cluster-signing-kubelet-serving-cert-file=/var/lib/rancher/rke2/server/tls/server-ca.nochain.crt --cluster-signing-kubelet-serving-key-file=/var/lib/rancher/rke2/server/tls/server-ca.key --cluster-signing-legacy-unknown-cert-file=/var/lib/rancher/rke2/server/tls/server-ca.nochain.crt --cluster-signing-legacy-unknown-key-file=/var/lib/rancher/rke2/server/tls/server-ca.key --configure-cloud-routes=false --controllers=*,tokencleaner,-service,-route,-cloud-node-lifecycle --kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --profiling=false --root-ca-file=/var/lib/rancher/rke2/server/tls/server-ca.crt --secure-port=10257 --service-account-private-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --tls-cert-file=/var/lib/rancher/rke2/server/tls/kube-controller-manager/kube-controller-manager.crt --tls-private-key-file=/var/lib/rancher/rke2/server/tls/kube-controller-manager/kube-controller-manager.key --use-service-account-credentials=true
Solución:

Por defecto, RKE2 proporciona automáticamente el archivo CA raíz. Se genera y se encuentra en /var/lib/rancher/rke2/server/tls/server-ca.crt. Si por alguna razón necesitas proporcionar tu propio certificado CA, considera utilizar la herramienta shell rke2 certificate. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier línea como la siguiente.

kube-controller-manager-arg:
  - "root-ca-file=<path>"

1.3.6 Asegúrate de que el argumento RotateKubeletServerCertificate esté configurado en verdadero (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-controller-manager

Resultado Esperado: '--feature-gates' está presente O '--feature-gates' no está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18380    2666  1 16:15 ?        00:00:04 kube-controller-manager --permit-port-sharing=true --flex-volume-plugin-dir=/var/lib/kubelet/volumeplugins --terminated-pod-gc-threshold=1000 --allocate-node-cidrs=true --authentication-kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --authorization-kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --bind-address=127.0.0.1 --cluster-cidr=10.42.0.0/16 --cluster-signing-kube-apiserver-client-cert-file=/var/lib/rancher/rke2/server/tls/client-ca.nochain.crt --cluster-signing-kube-apiserver-client-key-file=/var/lib/rancher/rke2/server/tls/client-ca.key --cluster-signing-kubelet-client-cert-file=/var/lib/rancher/rke2/server/tls/client-ca.nochain.crt --cluster-signing-kubelet-client-key-file=/var/lib/rancher/rke2/server/tls/client-ca.key --cluster-signing-kubelet-serving-cert-file=/var/lib/rancher/rke2/server/tls/server-ca.nochain.crt --cluster-signing-kubelet-serving-key-file=/var/lib/rancher/rke2/server/tls/server-ca.key --cluster-signing-legacy-unknown-cert-file=/var/lib/rancher/rke2/server/tls/server-ca.nochain.crt --cluster-signing-legacy-unknown-key-file=/var/lib/rancher/rke2/server/tls/server-ca.key --configure-cloud-routes=false --controllers=*,tokencleaner,-service,-route,-cloud-node-lifecycle --kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --profiling=false --root-ca-file=/var/lib/rancher/rke2/server/tls/server-ca.crt --secure-port=10257 --service-account-private-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --tls-cert-file=/var/lib/rancher/rke2/server/tls/kube-controller-manager/kube-controller-manager.crt --tls-private-key-file=/var/lib/rancher/rke2/server/tls/kube-controller-manager/kube-controller-manager.key --use-service-account-credentials=true
Solución:

Por defecto, RKE2 no establece el feature gate RotateKubeletServerCertificate. Si has habilitado este feature gate, deberías eliminarlo. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml, elimina cualquier línea como la siguiente.

kube-controller-manager-arg:
  - "feature-gate=RotateKubeletServerCertificate"

1.3.7 Asegúrate de que el argumento --bind-address esté configurado en 127.0.0.1 (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-controller-manager

Resultado Esperado: '--bind-address' es igual a '127.0.0.1' O '--bind-address' no está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18380    2666  1 16:15 ?        00:00:04 kube-controller-manager --permit-port-sharing=true --flex-volume-plugin-dir=/var/lib/kubelet/volumeplugins --terminated-pod-gc-threshold=1000 --allocate-node-cidrs=true --authentication-kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --authorization-kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --bind-address=127.0.0.1 --cluster-cidr=10.42.0.0/16 --cluster-signing-kube-apiserver-client-cert-file=/var/lib/rancher/rke2/server/tls/client-ca.nochain.crt --cluster-signing-kube-apiserver-client-key-file=/var/lib/rancher/rke2/server/tls/client-ca.key --cluster-signing-kubelet-client-cert-file=/var/lib/rancher/rke2/server/tls/client-ca.nochain.crt --cluster-signing-kubelet-client-key-file=/var/lib/rancher/rke2/server/tls/client-ca.key --cluster-signing-kubelet-serving-cert-file=/var/lib/rancher/rke2/server/tls/server-ca.nochain.crt --cluster-signing-kubelet-serving-key-file=/var/lib/rancher/rke2/server/tls/server-ca.key --cluster-signing-legacy-unknown-cert-file=/var/lib/rancher/rke2/server/tls/server-ca.nochain.crt --cluster-signing-legacy-unknown-key-file=/var/lib/rancher/rke2/server/tls/server-ca.key --configure-cloud-routes=false --controllers=*,tokencleaner,-service,-route,-cloud-node-lifecycle --kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --profiling=false --root-ca-file=/var/lib/rancher/rke2/server/tls/server-ca.crt --secure-port=10257 --service-account-private-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --tls-cert-file=/var/lib/rancher/rke2/server/tls/kube-controller-manager/kube-controller-manager.crt --tls-private-key-file=/var/lib/rancher/rke2/server/tls/kube-controller-manager/kube-controller-manager.key --use-service-account-credentials=true
Solución:

Por defecto, RKE2 establece el argumento --bind-address en 127.0.0.1. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier línea como la siguiente.

kube-controller-manager-arg:
  - "bind-address=<IP>"

1.4 Planificador

1.4.1 Asegúrate de que el argumento --profiling esté configurado en falso (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-scheduler

Resultado Esperado: '--profiling' es igual a 'falso'

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18054    2705  0 16:15 ?        00:00:01 kube-scheduler --permit-port-sharing=true --authentication-kubeconfig=/var/lib/rancher/rke2/server/cred/scheduler.kubeconfig --authorization-kubeconfig=/var/lib/rancher/rke2/server/cred/scheduler.kubeconfig --bind-address=127.0.0.1 --kubeconfig=/var/lib/rancher/rke2/server/cred/scheduler.kubeconfig --profiling=false --secure-port=10259 --tls-cert-file=/var/lib/rancher/rke2/server/tls/kube-scheduler/kube-scheduler.crt --tls-private-key-file=/var/lib/rancher/rke2/server/tls/kube-scheduler/kube-scheduler.key
Solución:

Por defecto, RKE2 establece el argumento --profiling en falso. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier línea como la siguiente.

kube-scheduler-arg:
  - "profiling=true"

1.4.2 Asegúrate de que el argumento --bind-address esté configurado en 127.0.0.1 (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -fC kube-scheduler

Resultado Esperado: '--bind-address' es igual a '127.0.0.1' O '--bind-address' no está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       18054    2705  0 16:15 ?        00:00:01 kube-scheduler --permit-port-sharing=true --authentication-kubeconfig=/var/lib/rancher/rke2/server/cred/scheduler.kubeconfig --authorization-kubeconfig=/var/lib/rancher/rke2/server/cred/scheduler.kubeconfig --bind-address=127.0.0.1 --kubeconfig=/var/lib/rancher/rke2/server/cred/scheduler.kubeconfig --profiling=false --secure-port=10259 --tls-cert-file=/var/lib/rancher/rke2/server/tls/kube-scheduler/kube-scheduler.crt --tls-private-key-file=/var/lib/rancher/rke2/server/tls/kube-scheduler/kube-scheduler.key
Solución:

Por defecto, RKE2 establece el argumento --bind-address en 127.0.0.1. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier línea como la siguiente.

kube-scheduler-arg:
  - "bind-address=<IP>"

2 Configuración de Nodo Etcd

2 Configuración de Nodo Etcd

2.1 Asegúrate de que los argumentos --cert-file y --key-file estén configurados adecuadamente (Automatizado)

Resultado: PASS

Auditoría:

cat /var/lib/rancher/rke2/server/db/etcd/config

Resultado Esperado: '.client-transport-security.cert-file' es igual a '/var/lib/rancher/rke2/server/tls/etcd/server-client.crt' Y '.client-transport-security.key-file' es igual a '/var/lib/rancher/rke2/server/tls/etcd/server-client.key'

Valor devuelto:
advertise-client-urls: https://10.10.10.100:2379
client-transport-security:
  cert-file: /var/lib/rancher/rke2/server/tls/etcd/server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/rke2/server/tls/etcd/server-client.key
  trusted-ca-file: /var/lib/rancher/rke2/server/tls/etcd/server-ca.crt
data-dir: /var/lib/rancher/rke2/server/db/etcd
election-timeout: 5000
experimental-initial-corrupt-check: true
experimental-watch-progress-notify-interval: 5000000000
heartbeat-interval: 500
initial-advertise-peer-urls: https://10.10.10.100:2380
initial-cluster: server-0-d66375b4=https://10.10.10.100:2380
initial-cluster-state: new
listen-client-http-urls: https://127.0.0.1:2382
listen-client-urls: https://127.0.0.1:2379,https://10.10.10.100:2379
listen-metrics-urls: http://127.0.0.1:2381
listen-peer-urls: https://127.0.0.1:2380,https://10.10.10.100:2380
log-outputs:
- stderr
logger: zap
name: server-0-d66375b4
peer-transport-security:
  cert-file: /var/lib/rancher/rke2/server/tls/etcd/peer-server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/rke2/server/tls/etcd/peer-server-client.key
  trusted-ca-file: /var/lib/rancher/rke2/server/tls/etcd/peer-ca.crt
snapshot-count: 10000
socket-options:
  reuse-address: true
  reuse-port: true
Solución:

Por defecto, RKE2 genera archivos de certificado y clave para etcd. Estos se encuentran en /var/lib/rancher/rke2/server/tls/etcd/. Si esta comprobación falla, asegúrate de que el archivo de configuración /var/lib/rancher/rke2/server/db/etcd/config no ha sido modificado para usar archivos de certificado y clave personalizados.

2.2 Asegúrate de que el argumento --client-cert-auth esté configurado en true (Automatizado)

Resultado: PASS

Auditoría:

cat /var/lib/rancher/rke2/server/db/etcd/config

Resultado Esperado: 'ETCD_CLIENT_CERT_AUTH' está presente O '.client-transport-security.client-cert-auth' es igual a 'true'

Valor devuelto:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=server-0
ETCD_UNSUPPORTED_ARCH=
FILE_HASH=e37e99a1db555b43d54d98f8bd294bd808aed0b4791c9d1d94b05bcc783e66d6
NO_PROXY=.svc,.cluster.local,10.42.0.0/16,10.43.0.0/16
HOME=/
Solución:

Por defecto, RKE2 establece el parámetro --client-cert-auth en verdadero. Si esta comprobación falla, asegúrate de que el archivo de configuración /var/lib/rancher/rke2/server/db/etcd/config no ha sido modificado para desactivar la autenticación del certificado del cliente.

2.3 Asegúrate de que el argumento --auto-tls no esté configurado en true (Automatizado)

Resultado: PASS

Auditoría:

cat /var/lib/rancher/rke2/server/db/etcd/config

Resultado Esperado: 'ETCD_AUTO_TLS' no está presente O 'ETCD_AUTO_TLS' está presente O '.client-transport-security.auto-tls' está presente

Valor devuelto:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=server-0
ETCD_UNSUPPORTED_ARCH=
FILE_HASH=e37e99a1db555b43d54d98f8bd294bd808aed0b4791c9d1d94b05bcc783e66d6
NO_PROXY=.svc,.cluster.local,10.42.0.0/16,10.43.0.0/16
HOME=/
Solución:

Por defecto, RKE2 no establece el parámetro --auto-tls. Si esta comprobación falla, edita el archivo de especificación del pod etcd /var/lib/rancher/rke2/server/db/etcd/config en el nodo maestro y elimina el parámetro --auto-tls o configúralo en falso. client-transport-security: auto-tls: falso

2.4 Asegúrate de que los argumentos --peer-cert-file y --peer-key-file estén configurados adecuadamente (Automatizado)

Resultado: PASS

Auditoría:

cat /var/lib/rancher/rke2/server/db/etcd/config

Resultado Esperado: '.peer-transport-security.cert-file' es igual a '/var/lib/rancher/rke2/server/tls/etcd/peer-server-client.crt' Y '.peer-transport-security.key-file' es igual a '/var/lib/rancher/rke2/server/tls/etcd/peer-server-client.key'

Valor devuelto:
advertise-client-urls: https://10.10.10.100:2379
client-transport-security:
  cert-file: /var/lib/rancher/rke2/server/tls/etcd/server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/rke2/server/tls/etcd/server-client.key
  trusted-ca-file: /var/lib/rancher/rke2/server/tls/etcd/server-ca.crt
data-dir: /var/lib/rancher/rke2/server/db/etcd
election-timeout: 5000
experimental-initial-corrupt-check: true
experimental-watch-progress-notify-interval: 5000000000
heartbeat-interval: 500
initial-advertise-peer-urls: https://10.10.10.100:2380
initial-cluster: server-0-d66375b4=https://10.10.10.100:2380
initial-cluster-state: new
listen-client-http-urls: https://127.0.0.1:2382
listen-client-urls: https://127.0.0.1:2379,https://10.10.10.100:2379
listen-metrics-urls: http://127.0.0.1:2381
listen-peer-urls: https://127.0.0.1:2380,https://10.10.10.100:2380
log-outputs:
- stderr
logger: zap
name: server-0-d66375b4
peer-transport-security:
  cert-file: /var/lib/rancher/rke2/server/tls/etcd/peer-server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/rke2/server/tls/etcd/peer-server-client.key
  trusted-ca-file: /var/lib/rancher/rke2/server/tls/etcd/peer-ca.crt
snapshot-count: 10000
socket-options:
  reuse-address: true
  reuse-port: true
Solución:

Por defecto, RKE2 genera archivos de certificado y clave de par para etcd. Estos se encuentran en /var/lib/rancher/rke2/server/tls/etcd/. Si esta comprobación falla, asegúrate de que el archivo de configuración /var/lib/rancher/rke2/server/db/etcd/config no ha sido modificado para usar archivos de certificado y clave de par personalizados.

2.5 Asegúrate de que el argumento --peer-client-cert-auth esté configurado en "true" (Automatizado)

Resultado: PASS

Auditoría:

cat /var/lib/rancher/rke2/server/db/etcd/config

Resultado Esperado: 'ETCD_PEER_CLIENT_CERT_AUTH' está presente O '.peer-transport-security.client-cert-auth' es igual a 'true'

Valor devuelto:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=server-0
ETCD_UNSUPPORTED_ARCH=
FILE_HASH=e37e99a1db555b43d54d98f8bd294bd808aed0b4791c9d1d94b05bcc783e66d6
NO_PROXY=.svc,.cluster.local,10.42.0.0/16,10.43.0.0/16
HOME=/
Solución:

Por defecto, RKE2 establece el parámetro --peer-cert-auth en true. Si esta comprobación falla, asegúrate de que el archivo de configuración /var/lib/rancher/rke2/server/db/etcd/config no ha sido modificado para desactivar la autenticación del certificado del cliente de par.

2.6 Asegúrate de que el argumento --peer-auto-tls no esté configurado en "true" (Automatizado)

Resultado: PASS

Auditoría:

cat /var/lib/rancher/rke2/server/db/etcd/config

Resultado Esperado: 'ETCD_PEER_AUTO_TLS' no está presente O 'ETCD_PEER_AUTO_TLS' está presente O '.peer-transport-security.auto-tls' está presente

Valor devuelto:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=server-0
ETCD_UNSUPPORTED_ARCH=
FILE_HASH=e37e99a1db555b43d54d98f8bd294bd808aed0b4791c9d1d94b05bcc783e66d6
NO_PROXY=.svc,.cluster.local,10.42.0.0/16,10.43.0.0/16
HOME=/
Solución:

Por defecto, RKE2 no establece el parámetro --peer-auto-tls. Si esta comprobación falla, edita el archivo de especificación del pod etcd /var/lib/rancher/rke2/server/db/etcd/config en el nodo maestro y elimina el parámetro --peer-auto-tls o configúralo en falso. peer-transport-security: auto-tls: falso

2.7 Asegúrate de que se utilice una Autoridad de Certificación única para etcd (Automatizado)

Resultado: PASS

Auditoría:

cat /var/lib/rancher/rke2/server/db/etcd/config

Resultado Esperado: 'ETCD_TRUSTED_CA_FILE' está presente O '.peer-transport-security.trusted-ca-file' es igual a '/var/lib/rancher/rke2/server/tls/etcd/peer-ca.crt'

Valor devuelto:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=server-0
ETCD_UNSUPPORTED_ARCH=
FILE_HASH=e37e99a1db555b43d54d98f8bd294bd808aed0b4791c9d1d94b05bcc783e66d6
NO_PROXY=.svc,.cluster.local,10.42.0.0/16,10.43.0.0/16
HOME=/
Solución:

Por defecto, RKE2 genera una CA única para etcd. Esto se encuentra en /var/lib/rancher/rke2/server/tls/etcd/peer-ca.crt. Si esta comprobación falla, asegúrate de que el archivo de configuración /var/lib/rancher/rke2/server/db/etcd/config no ha sido modificado para utilizar una CA compartida.

3 Configuración del Plano de Control

3.1 Autenticación y Autorización

3.1.1 La autenticación con certificado de cliente no debe ser utilizada para usuarios (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Los mecanismos alternativos proporcionados por Kubernetes, como el uso de OIDC, deben ser implementados en lugar de certificados de cliente.

3.1.2 La autenticación con tokens de cuenta de servicio no debe ser utilizada para usuarios (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Se deben implementar mecanismos alternativos proporcionados por Kubernetes, como el uso de OIDC, en lugar de tokens de cuenta de servicio.

3.1.3 La autenticación con tokens de inicio no debe ser utilizada para usuarios (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Se deben implementar mecanismos alternativos proporcionados por Kubernetes, como el uso de OIDC, en lugar de tokens de inicio.

3.2 Registro

3.2.1 Asegúrate de que se cree una política de auditoría mínima (Automatizado)

Resultado: PASS

Auditoría:

/bin/ps -ef | grep kube-apiserver | grep -v grep

Resultado Esperado: '--audit-policy-file' está presente

Valor devuelto:
root       18280   17706  5 16:15 ?        00:00:16 kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --audit-policy-file=/etc/rancher/rke2/audit-policy.yaml --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log --advertise-address=10.10.10.100 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,rke2 --authorization-mode=Node,RBAC --bind-address=0.0.0.0 --cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml --enable-admission-plugins=NodeRestriction --enable-aggregator-routing=true --enable-bootstrap-token-auth=true --encryption-provider-config=/var/lib/rancher/rke2/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/rke2/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/rke2/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/rke2/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/rke2/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/rke2/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/rke2/server/tls/request-header-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/rke2/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --service-node-port-range=30000-32767 --storage-backend=etcd3 --tls-cert-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-private-key-file=/var/lib/rancher/rke2/server/tls/serving-kube-apiserver.key
root       18380    2666  1 16:15 ?        00:00:04 kube-controller-manager --permit-port-sharing=true --flex-volume-plugin-dir=/var/lib/kubelet/volumeplugins --terminated-pod-gc-threshold=1000 --allocate-node-cidrs=true --authentication-kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --authorization-kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --bind-address=127.0.0.1 --cluster-cidr=10.42.0.0/16 --cluster-signing-kube-apiserver-client-cert-file=/var/lib/rancher/rke2/server/tls/client-ca.nochain.crt --cluster-signing-kube-apiserver-client-key-file=/var/lib/rancher/rke2/server/tls/client-ca.key --cluster-signing-kubelet-client-cert-file=/var/lib/rancher/rke2/server/tls/client-ca.nochain.crt --cluster-signing-kubelet-client-key-file=/var/lib/rancher/rke2/server/tls/client-ca.key --cluster-signing-kubelet-serving-cert-file=/var/lib/rancher/rke2/server/tls/server-ca.nochain.crt --cluster-signing-kubelet-serving-key-file=/var/lib/rancher/rke2/server/tls/server-ca.key --cluster-signing-legacy-unknown-cert-file=/var/lib/rancher/rke2/server/tls/server-ca.nochain.crt --cluster-signing-legacy-unknown-key-file=/var/lib/rancher/rke2/server/tls/server-ca.key --configure-cloud-routes=false --controllers=*,tokencleaner,-service,-route,-cloud-node-lifecycle --kubeconfig=/var/lib/rancher/rke2/server/cred/controller.kubeconfig --profiling=false --root-ca-file=/var/lib/rancher/rke2/server/tls/server-ca.crt --secure-port=10257 --service-account-private-key-file=/var/lib/rancher/rke2/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --tls-cert-file=/var/lib/rancher/rke2/server/tls/kube-controller-manager/kube-controller-manager.crt --tls-private-key-file=/var/lib/rancher/rke2/server/tls/kube-controller-manager/kube-controller-manager.key --use-service-account-credentials=true
Solución:

Crea un archivo de política de auditoría para tu clúster.

3.2.2 Asegúrate de que la política de auditoría cubra las principales preocupaciones de seguridad (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Revisa la política de auditoría proporcionada para el clúster y asegúrate de que cubra al menos las siguientes áreas,

  • Acceso a secretos gestionados por el clúster. Se debe tener cuidado de solo registrar metadatos para solicitudes a secretos, ConfigMaps y TokenReviews, para evitar el riesgo de registrar datos sensibles.

  • Modificación de objetos Pod y despliegue.

  • Uso de pods/exec, pods/portforward, pods/proxy y services/proxy. Para la mayoría de las solicitudes, se recomienda registrar mínimamente a nivel de metadatos (el nivel más básico de registro).

4 Configuración de Seguridad de Nodos Trabajadores

4.1 Archivos de configuración del nodo trabajador

4.1.1 Asegúrate de que los permisos del archivo de servicio kubelet estén configurados en 600 o más restrictivos (Automatizado)

Resultado: No corresponde

Justificación:

El kubelet es gestionado por el proceso RKE2. No hay un archivo de servicio kubelet, toda la configuración se pasa como argumentos en tiempo de ejecución.

4.1.2 Asegúrate de que la propiedad del archivo de servicio kubelet esté configurada como root:root (Automatizado)

Resultado: No corresponde

Justificación:

El kubelet es gestionado por el proceso RKE2. No hay un archivo de servicio kubelet, toda la configuración se pasa como argumentos en tiempo de ejecución.

4.1.3 Si existe el archivo kubeconfig del proxy, asegúrate de que los permisos estén configurados en 600 o más restrictivos (Automatizado)

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /var/lib/rancher/rke2/agent/kubeproxy.kubeconfig; then stat -c permissions=%a /var/lib/rancher/rke2/agent/kubeproxy.kubeconfig; fi'

Resultado Esperado: los permisos son 600, se esperaban 600 o más restrictivos

Valor Devuelto:
permissions=600
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en cada nodo trabajador. Por ejemplo, chmod 600 /var/lib/rancher/rke2/agent/kubeproxy.kubeconfig

4.1.4 Si existe un archivo kubeconfig de proxy, asegúrate de que la propiedad esté configurada en root:root (Automatizado)

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /var/lib/rancher/rke2/agent/kubeproxy.kubeconfig; then stat -c %U:%G /var/lib/rancher/rke2/agent/kubeproxy.kubeconfig; fi'

Resultado Esperado: 'root:root' está presente

Valor Devuelto:
root:root
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en cada nodo trabajador. Por ejemplo, chown root:root /var/lib/rancher/rke2/agent/kubeproxy.kubeconfig

4.1.5 Asegúrate de que los permisos del archivo --kubeconfig kubelet.conf estén configurados en 600 o más restrictivos (Automatizado)

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /var/lib/rancher/rke2/agent/kubelet.kubeconfig; then stat -c permissions=%a /var/lib/rancher/rke2/agent/kubelet.kubeconfig; fi'

Resultado Esperado: los permisos son 600, se esperaban 600 o más restrictivos

Valor Devuelto:
permissions=600
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en cada nodo trabajador. Por ejemplo, chmod 600 /var/lib/rancher/rke2/agent/kubelet.kubeconfig

4.1.6 Asegúrate de que la propiedad del archivo --kubeconfig kubelet.conf esté configurada en root:root (Automatizado)

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /var/lib/rancher/rke2/agent/kubelet.kubeconfig; then stat -c %U:%G /var/lib/rancher/rke2/agent/kubelet.kubeconfig; fi'

Resultado Esperado: 'root:root' es igual a 'root:root'

Valor Devuelto:
root:root
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en cada nodo trabajador. Por ejemplo, chown root:root /var/lib/rancher/rke2/agent/kubelet.kubeconfig

4.1.7 Asegúrate de que los permisos del archivo de autoridades de certificación estén configurados en 600 o más restrictivos (Automatizado)

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /var/lib/rancher/rke2/agent/client-ca.crt; then stat -c permissions=%a /var/lib/rancher/rke2/agent/client-ca.crt; fi'

Resultado Esperado: los permisos son 600, se esperaban 600 o más restrictivos

Valor Devuelto:
permissions=600
Remediación:

Ejecuta el siguiente comando (basado en la ubicación del archivo en tu sistema) en cada nodo trabajador. Por ejemplo, chmod 600 /var/lib/rancher/rke2/agent/client-ca.crt

4.1.8 Asegúrate de que la propiedad del archivo de autoridades de certificación del cliente esté configurada en root:root (Automatizado)

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /var/lib/rancher/rke2/agent/client-ca.crt; then stat -c %U:%G /var/lib/rancher/rke2/agent/client-ca.crt; fi'

Resultado Esperado: 'root:root' es igual a 'root:root'

Valor Devuelto:
root:root
Remediación:

Ejecuta el siguiente comando para modificar la propiedad del --client-ca-file. chown root:root /var/lib/rancher/rke2/agent/client-ca.crt

4.1.9 Si se está utilizando el archivo de configuración kubelet config.yaml, valida que los permisos estén establecidos en 600 o más restrictivos (Automatizado)

Resultado: No corresponde

Justificación:

El kubelet es gestionado por el proceso RKE2. No hay archivo de configuración del kubelet, toda la configuración se pasa como argumentos en tiempo de ejecución.

4.1.10 Si se está utilizando el archivo de configuración kubelet config.yaml, valida que la propiedad del archivo esté establecida en root:root (Automatizado)

Resultado: No corresponde

Justificación:

El kubelet es gestionado por el proceso RKE2. No hay archivo de configuración del kubelet, toda la configuración se pasa como argumentos en tiempo de ejecución.

4.2 Kubelet

4.2.1 Asegúrate de que el argumento --anonymous-auth esté configurado en false (Automatizado)

Resultado: PASS

Auditoría:

/bin/cat /var/lib/rancher/rke2/agent/etc/kubelet.conf.d/00-rke2-defaults.conf

Resultado Esperado: '.authentication.anonymous.enabled' es igual a 'false'

Valor devuelto:
address: 0.0.0.0
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 2m0s
    enabled: true
  x509:
    clientCAFile: /var/lib/rancher/rke2/agent/client-ca.crt
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 5m0s
    cacheUnauthorizedTTL: 30s
cgroupDriver: systemd
clusterDNS:
- 10.43.0.10
clusterDomain: cluster.local
containerRuntimeEndpoint: unix:///run/k3s/containerd/containerd.sock
cpuManagerReconcilePeriod: 10s
crashLoopBackOff: {}
evictionHard:
  imagefs.available: 5%
  nodefs.available: 5%
evictionMinimumReclaim:
  imagefs.available: 10%
  nodefs.available: 10%
evictionPressureTransitionPeriod: 5m0s
failSwapOn: false
fileCheckFrequency: 20s
healthzBindAddress: 127.0.0.1
httpCheckFrequency: 20s
imageMaximumGCAge: 0s
imageMinimumGCAge: 2m0s
kind: KubeletConfiguration
logging:
  flushFrequency: 5s
  format: text
  options:
    json:
      infoBufferSize: "0"
    text:
      infoBufferSize: "0"
  verbosity: 0
memorySwap: {}
nodeStatusReportFrequency: 5m0s
nodeStatusUpdateFrequency: 10s
protectKernelDefaults: true
resolvConf: /run/systemd/resolve/resolv.conf
runtimeRequestTimeout: 2m0s
serializeImagePulls: false
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /var/lib/rancher/rke2/agent/pod-manifests
streamingConnectionIdleTimeout: 4h0m0s
syncFrequency: 1m0s
tlsCertFile: /var/lib/rancher/rke2/agent/serving-kubelet.crt
tlsPrivateKeyFile: /var/lib/rancher/rke2/agent/serving-kubelet.key
volumeStatsAggPeriod: 1m0s
Solución:

Por defecto, RKE2 establece el --anonymous-auth en false. Si esta comprobación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml, elimina cualquier línea similar a la siguiente.

kubelet-arg:
  - "anonymous-auth=true"

Según tu sistema, reinicia el servicio RKE2. Por ejemplo, systemctl restart rke2-server.service

4.2.2 Asegúrate de que el argumento --authorization-mode no esté configurado como AlwaysAllow (Automatizado)

Resultado: PASS

Auditoría:

/bin/cat /var/lib/rancher/rke2/agent/etc/kubelet.conf.d/00-rke2-defaults.conf

Resultado Esperado: '.authorization.mode' no tiene 'AlwaysAllow'

Valor devuelto:
address: 0.0.0.0
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 2m0s
    enabled: true
  x509:
    clientCAFile: /var/lib/rancher/rke2/agent/client-ca.crt
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 5m0s
    cacheUnauthorizedTTL: 30s
cgroupDriver: systemd
clusterDNS:
- 10.43.0.10
clusterDomain: cluster.local
containerRuntimeEndpoint: unix:///run/k3s/containerd/containerd.sock
cpuManagerReconcilePeriod: 10s
crashLoopBackOff: {}
evictionHard:
  imagefs.available: 5%
  nodefs.available: 5%
evictionMinimumReclaim:
  imagefs.available: 10%
  nodefs.available: 10%
evictionPressureTransitionPeriod: 5m0s
failSwapOn: false
fileCheckFrequency: 20s
healthzBindAddress: 127.0.0.1
httpCheckFrequency: 20s
imageMaximumGCAge: 0s
imageMinimumGCAge: 2m0s
kind: KubeletConfiguration
logging:
  flushFrequency: 5s
  format: text
  options:
    json:
      infoBufferSize: "0"
    text:
      infoBufferSize: "0"
  verbosity: 0
memorySwap: {}
nodeStatusReportFrequency: 5m0s
nodeStatusUpdateFrequency: 10s
protectKernelDefaults: true
resolvConf: /run/systemd/resolve/resolv.conf
runtimeRequestTimeout: 2m0s
serializeImagePulls: false
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /var/lib/rancher/rke2/agent/pod-manifests
streamingConnectionIdleTimeout: 4h0m0s
syncFrequency: 1m0s
tlsCertFile: /var/lib/rancher/rke2/agent/serving-kubelet.crt
tlsPrivateKeyFile: /var/lib/rancher/rke2/agent/serving-kubelet.key
volumeStatsAggPeriod: 1m0s
Solución:

Por defecto, RKE2 no establece el --authorization-mode como AlwaysAllow. Si esta comprobación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml, elimina cualquier línea similar a la siguiente.

kubelet-arg:
  - "authorization-mode=AlwaysAllow"

Según tu sistema, reinicia el servicio RKE2. Por ejemplo, systemctl restart rke2-server.service

4.2.3 Asegúrate de que el argumento --client-ca-file esté configurado adecuadamente (Automatizado)

Resultado: PASS

Auditoría:

/bin/cat /var/lib/rancher/rke2/agent/etc/kubelet.conf.d/00-rke2-defaults.conf

Resultado Esperado: '.authentication.x509.clientCAFile' está presente

Valor devuelto:
address: 0.0.0.0
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 2m0s
    enabled: true
  x509:
    clientCAFile: /var/lib/rancher/rke2/agent/client-ca.crt
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 5m0s
    cacheUnauthorizedTTL: 30s
cgroupDriver: systemd
clusterDNS:
- 10.43.0.10
clusterDomain: cluster.local
containerRuntimeEndpoint: unix:///run/k3s/containerd/containerd.sock
cpuManagerReconcilePeriod: 10s
crashLoopBackOff: {}
evictionHard:
  imagefs.available: 5%
  nodefs.available: 5%
evictionMinimumReclaim:
  imagefs.available: 10%
  nodefs.available: 10%
evictionPressureTransitionPeriod: 5m0s
failSwapOn: false
fileCheckFrequency: 20s
healthzBindAddress: 127.0.0.1
httpCheckFrequency: 20s
imageMaximumGCAge: 0s
imageMinimumGCAge: 2m0s
kind: KubeletConfiguration
logging:
  flushFrequency: 5s
  format: text
  options:
    json:
      infoBufferSize: "0"
    text:
      infoBufferSize: "0"
  verbosity: 0
memorySwap: {}
nodeStatusReportFrequency: 5m0s
nodeStatusUpdateFrequency: 10s
protectKernelDefaults: true
resolvConf: /run/systemd/resolve/resolv.conf
runtimeRequestTimeout: 2m0s
serializeImagePulls: false
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /var/lib/rancher/rke2/agent/pod-manifests
streamingConnectionIdleTimeout: 4h0m0s
syncFrequency: 1m0s
tlsCertFile: /var/lib/rancher/rke2/agent/serving-kubelet.crt
tlsPrivateKeyFile: /var/lib/rancher/rke2/agent/serving-kubelet.key
volumeStatsAggPeriod: 1m0s
Solución:

Por defecto, RKE2 proporciona automáticamente el certificado CA del cliente para el kubelet. Se genera y se encuentra en /var/lib/rancher/rke2/agent/client-ca.crt

Asegúrate de que, si está definido, el argumento --read-only-port esté configurado en 0 (Automatizado).

Resultado: PASS

Auditoría:

/bin/cat /var/lib/rancher/rke2/agent/etc/kubelet.conf.d/00-rke2-defaults.conf

Resultado Esperado: '--read-only-port' es igual a '0' O '--read-only-port' no está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       17649   17422  2 16:15 ?        00:00:08 kubelet --volume-plugin-dir=/var/lib/kubelet/volumeplugins --file-check-frequency=5s --sync-frequency=30s --cloud-provider=external --config-dir=/var/lib/rancher/rke2/agent/etc/kubelet.conf.d --containerd=/run/k3s/containerd/containerd.sock --hostname-override=server-0 --kubeconfig=/var/lib/rancher/rke2/agent/kubelet.kubeconfig --node-ip=10.10.10.100 --node-labels= --read-only-port=0
Solución:

Por defecto, RKE2 establece el --read-only-port en 0. Si has configurado esto a un valor diferente, deberías volver a establecerlo en 0. Edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml, elimina cualquier línea similar a la siguiente.

kubelet-arg:
  - "read-only-port=XXXX"

Según tu sistema, reinicia el servicio RKE2. Por ejemplo, systemctl restart rke2-server.service

4.2.5 Asegúrate de que el argumento --streaming-connection-idle-timeout no esté configurado en 0 (Manual)

Resultado: PASS

Auditoría:

/bin/cat /var/lib/rancher/rke2/agent/etc/kubelet.conf.d/00-rke2-defaults.conf

Resultado Esperado: '.streamingConnectionIdleTimeout' no es igual a '0' O '.streamingConnectionIdleTimeout' no está presente

Valor devuelto:
address: 0.0.0.0
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 2m0s
    enabled: true
  x509:
    clientCAFile: /var/lib/rancher/rke2/agent/client-ca.crt
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 5m0s
    cacheUnauthorizedTTL: 30s
cgroupDriver: systemd
clusterDNS:
- 10.43.0.10
clusterDomain: cluster.local
containerRuntimeEndpoint: unix:///run/k3s/containerd/containerd.sock
cpuManagerReconcilePeriod: 10s
crashLoopBackOff: {}
evictionHard:
  imagefs.available: 5%
  nodefs.available: 5%
evictionMinimumReclaim:
  imagefs.available: 10%
  nodefs.available: 10%
evictionPressureTransitionPeriod: 5m0s
failSwapOn: false
fileCheckFrequency: 20s
healthzBindAddress: 127.0.0.1
httpCheckFrequency: 20s
imageMaximumGCAge: 0s
imageMinimumGCAge: 2m0s
kind: KubeletConfiguration
logging:
  flushFrequency: 5s
  format: text
  options:
    json:
      infoBufferSize: "0"
    text:
      infoBufferSize: "0"
  verbosity: 0
memorySwap: {}
nodeStatusReportFrequency: 5m0s
nodeStatusUpdateFrequency: 10s
protectKernelDefaults: true
resolvConf: /run/systemd/resolve/resolv.conf
runtimeRequestTimeout: 2m0s
serializeImagePulls: false
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /var/lib/rancher/rke2/agent/pod-manifests
streamingConnectionIdleTimeout: 4h0m0s
syncFrequency: 1m0s
tlsCertFile: /var/lib/rancher/rke2/agent/serving-kubelet.crt
tlsPrivateKeyFile: /var/lib/rancher/rke2/agent/serving-kubelet.key
volumeStatsAggPeriod: 1m0s
Solución:

Edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml, establece el siguiente parámetro a un valor adecuado.

kubelet-arg:
  - "streaming-connection-idle-timeout=5m"

Según tu sistema, reinicia el servicio RKE2. Por ejemplo, systemctl restart rke2-server.service

4.2.6 Asegúrate de que el argumento --make-iptables-util-chains esté establecido en true (Automatizado)

Resultado: PASS

Auditoría:

/bin/cat /var/lib/rancher/rke2/agent/etc/kubelet.conf.d/00-rke2-defaults.conf

Resultado Esperado: '.makeIPTablesUtilChains' está presente O '.makeIPTablesUtilChains' no está presente

Valor devuelto:
address: 0.0.0.0
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 2m0s
    enabled: true
  x509:
    clientCAFile: /var/lib/rancher/rke2/agent/client-ca.crt
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 5m0s
    cacheUnauthorizedTTL: 30s
cgroupDriver: systemd
clusterDNS:
- 10.43.0.10
clusterDomain: cluster.local
containerRuntimeEndpoint: unix:///run/k3s/containerd/containerd.sock
cpuManagerReconcilePeriod: 10s
crashLoopBackOff: {}
evictionHard:
  imagefs.available: 5%
  nodefs.available: 5%
evictionMinimumReclaim:
  imagefs.available: 10%
  nodefs.available: 10%
evictionPressureTransitionPeriod: 5m0s
failSwapOn: false
fileCheckFrequency: 20s
healthzBindAddress: 127.0.0.1
httpCheckFrequency: 20s
imageMaximumGCAge: 0s
imageMinimumGCAge: 2m0s
kind: KubeletConfiguration
logging:
  flushFrequency: 5s
  format: text
  options:
    json:
      infoBufferSize: "0"
    text:
      infoBufferSize: "0"
  verbosity: 0
memorySwap: {}
nodeStatusReportFrequency: 5m0s
nodeStatusUpdateFrequency: 10s
protectKernelDefaults: true
resolvConf: /run/systemd/resolve/resolv.conf
runtimeRequestTimeout: 2m0s
serializeImagePulls: false
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /var/lib/rancher/rke2/agent/pod-manifests
streamingConnectionIdleTimeout: 4h0m0s
syncFrequency: 1m0s
tlsCertFile: /var/lib/rancher/rke2/agent/serving-kubelet.crt
tlsPrivateKeyFile: /var/lib/rancher/rke2/agent/serving-kubelet.key
volumeStatsAggPeriod: 1m0s
Solución:

Edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml, establece el siguiente parámetro.

kubelet-arg:
  - "make-iptables-util-chains=true"

O, elimina el argumento --make-iptables-util-chains para permitir que RKE2 use el valor predeterminado. Según tu sistema, reinicia el servicio RKE2. Por ejemplo, systemctl restart rke2-server.service

4.2.7 Asegúrate de que el argumento --hostname-override no esté establecido (Automatizado)

Resultado: No corresponde

Justificación:

Por defecto, RKE2 establece el argumento --hostname-override. Según las directrices del CIS, esto es para cumplir con los proveedores de la nube que requieren esta bandera para asegurar que el nombre de host coincida con los nombres de los nodos.

4.2.8 Asegúrate de que el argumento eventRecordQPS esté establecido a un nivel que asegure la captura adecuada de eventos (Manual)

Resultado: PASS

Auditoría:

/bin/cat /var/lib/rancher/rke2/agent/etc/kubelet.conf.d/00-rke2-defaults.conf

Resultado Esperado: '.eventRecordQPS' está presente O '.eventRecordQPS' no está presente

Valor devuelto:
address: 0.0.0.0
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 2m0s
    enabled: true
  x509:
    clientCAFile: /var/lib/rancher/rke2/agent/client-ca.crt
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 5m0s
    cacheUnauthorizedTTL: 30s
cgroupDriver: systemd
clusterDNS:
- 10.43.0.10
clusterDomain: cluster.local
containerRuntimeEndpoint: unix:///run/k3s/containerd/containerd.sock
cpuManagerReconcilePeriod: 10s
crashLoopBackOff: {}
evictionHard:
  imagefs.available: 5%
  nodefs.available: 5%
evictionMinimumReclaim:
  imagefs.available: 10%
  nodefs.available: 10%
evictionPressureTransitionPeriod: 5m0s
failSwapOn: false
fileCheckFrequency: 20s
healthzBindAddress: 127.0.0.1
httpCheckFrequency: 20s
imageMaximumGCAge: 0s
imageMinimumGCAge: 2m0s
kind: KubeletConfiguration
logging:
  flushFrequency: 5s
  format: text
  options:
    json:
      infoBufferSize: "0"
    text:
      infoBufferSize: "0"
  verbosity: 0
memorySwap: {}
nodeStatusReportFrequency: 5m0s
nodeStatusUpdateFrequency: 10s
protectKernelDefaults: true
resolvConf: /run/systemd/resolve/resolv.conf
runtimeRequestTimeout: 2m0s
serializeImagePulls: false
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /var/lib/rancher/rke2/agent/pod-manifests
streamingConnectionIdleTimeout: 4h0m0s
syncFrequency: 1m0s
tlsCertFile: /var/lib/rancher/rke2/agent/serving-kubelet.crt
tlsPrivateKeyFile: /var/lib/rancher/rke2/agent/serving-kubelet.key
volumeStatsAggPeriod: 1m0s
Solución:

Edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml, establece el siguiente parámetro a un valor adecuado.

kubelet-arg:
  - "event-qps=<value>"

Según tu sistema, reinicia el servicio RKE2. Por ejemplo, systemctl restart rke2-server.service

4.2.9 Asegúrate de que los argumentos --tls-cert-file y --tls-private-key-file estén establecidos como corresponde (Automatizado)

Resultado: PASS

Auditoría:

/bin/cat /var/lib/rancher/rke2/agent/etc/kubelet.conf.d/00-rke2-defaults.conf

Resultado Esperado: '.tlsCertFile' está presente Y '.tlsPrivateKeyFile' está presente

Valor devuelto:
address: 0.0.0.0
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 2m0s
    enabled: true
  x509:
    clientCAFile: /var/lib/rancher/rke2/agent/client-ca.crt
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 5m0s
    cacheUnauthorizedTTL: 30s
cgroupDriver: systemd
clusterDNS:
- 10.43.0.10
clusterDomain: cluster.local
containerRuntimeEndpoint: unix:///run/k3s/containerd/containerd.sock
cpuManagerReconcilePeriod: 10s
crashLoopBackOff: {}
evictionHard:
  imagefs.available: 5%
  nodefs.available: 5%
evictionMinimumReclaim:
  imagefs.available: 10%
  nodefs.available: 10%
evictionPressureTransitionPeriod: 5m0s
failSwapOn: false
fileCheckFrequency: 20s
healthzBindAddress: 127.0.0.1
httpCheckFrequency: 20s
imageMaximumGCAge: 0s
imageMinimumGCAge: 2m0s
kind: KubeletConfiguration
logging:
  flushFrequency: 5s
  format: text
  options:
    json:
      infoBufferSize: "0"
    text:
      infoBufferSize: "0"
  verbosity: 0
memorySwap: {}
nodeStatusReportFrequency: 5m0s
nodeStatusUpdateFrequency: 10s
protectKernelDefaults: true
resolvConf: /run/systemd/resolve/resolv.conf
runtimeRequestTimeout: 2m0s
serializeImagePulls: false
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /var/lib/rancher/rke2/agent/pod-manifests
streamingConnectionIdleTimeout: 4h0m0s
syncFrequency: 1m0s
tlsCertFile: /var/lib/rancher/rke2/agent/serving-kubelet.crt
tlsPrivateKeyFile: /var/lib/rancher/rke2/agent/serving-kubelet.key
volumeStatsAggPeriod: 1m0s
Solución:

Por defecto, RKE2 proporciona automáticamente el certificado TLS y la clave privada para el Kubelet. Se generan y se encuentran en /var/lib/rancher/rke2/agent/serving-kubelet.crt y /var/lib/rancher/rke2/agent/serving-kubelet.key. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml y elimina cualquier línea similar a la siguiente.

kubelet-arg:
  - "tls-cert-file=<path/to/tls-cert-file>"
  - "tls-private-key-file=<path/to/tls-private-key-file>"

4.2.10 Asegúrate de que el argumento --rotate-certificates no esté establecido en falso (Automatizado)

Resultado: PASS

Auditoría:

/bin/cat /var/lib/rancher/rke2/agent/etc/kubelet.conf.d/00-rke2-defaults.conf

Resultado Esperado: '.rotateCertificates' está presente O '.rotateCertificates' no está presente

Valor Devuelto:
address: 0.0.0.0
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 2m0s
    enabled: true
  x509:
    clientCAFile: /var/lib/rancher/rke2/agent/client-ca.crt
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 5m0s
    cacheUnauthorizedTTL: 30s
cgroupDriver: systemd
clusterDNS:
- 10.43.0.10
clusterDomain: cluster.local
containerRuntimeEndpoint: unix:///run/k3s/containerd/containerd.sock
cpuManagerReconcilePeriod: 10s
crashLoopBackOff: {}
evictionHard:
  imagefs.available: 5%
  nodefs.available: 5%
evictionMinimumReclaim:
  imagefs.available: 10%
  nodefs.available: 10%
evictionPressureTransitionPeriod: 5m0s
failSwapOn: false
fileCheckFrequency: 20s
healthzBindAddress: 127.0.0.1
httpCheckFrequency: 20s
imageMaximumGCAge: 0s
imageMinimumGCAge: 2m0s
kind: KubeletConfiguration
logging:
  flushFrequency: 5s
  format: text
  options:
    json:
      infoBufferSize: "0"
    text:
      infoBufferSize: "0"
  verbosity: 0
memorySwap: {}
nodeStatusReportFrequency: 5m0s
nodeStatusUpdateFrequency: 10s
protectKernelDefaults: true
resolvConf: /run/systemd/resolve/resolv.conf
runtimeRequestTimeout: 2m0s
serializeImagePulls: false
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /var/lib/rancher/rke2/agent/pod-manifests
streamingConnectionIdleTimeout: 4h0m0s
syncFrequency: 1m0s
tlsCertFile: /var/lib/rancher/rke2/agent/serving-kubelet.crt
tlsPrivateKeyFile: /var/lib/rancher/rke2/agent/serving-kubelet.key
volumeStatsAggPeriod: 1m0s
Solución:

Por defecto, RKE2 no establece el argumento --rotate-certificates. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml, y elimina cualquier parámetro rotate-certificates. Según tu sistema, reinicia el servicio RKE2. Por ejemplo, systemctl restart rke2-server.service

4.2.11 Verifica que el argumento RotateKubeletServerCertificate esté establecido en true (Automatizado)

Resultado: PASS

Auditoría:

/bin/cat /var/lib/rancher/rke2/agent/etc/kubelet.conf.d/00-rke2-defaults.conf

Resultado Esperado: '.featureGates.RotateKubeletServerCertificate' está presente O '.featureGates.RotateKubeletServerCertificate' no está presente

Valor Devuelto:
address: 0.0.0.0
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 2m0s
    enabled: true
  x509:
    clientCAFile: /var/lib/rancher/rke2/agent/client-ca.crt
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 5m0s
    cacheUnauthorizedTTL: 30s
cgroupDriver: systemd
clusterDNS:
- 10.43.0.10
clusterDomain: cluster.local
containerRuntimeEndpoint: unix:///run/k3s/containerd/containerd.sock
cpuManagerReconcilePeriod: 10s
crashLoopBackOff: {}
evictionHard:
  imagefs.available: 5%
  nodefs.available: 5%
evictionMinimumReclaim:
  imagefs.available: 10%
  nodefs.available: 10%
evictionPressureTransitionPeriod: 5m0s
failSwapOn: false
fileCheckFrequency: 20s
healthzBindAddress: 127.0.0.1
httpCheckFrequency: 20s
imageMaximumGCAge: 0s
imageMinimumGCAge: 2m0s
kind: KubeletConfiguration
logging:
  flushFrequency: 5s
  format: text
  options:
    json:
      infoBufferSize: "0"
    text:
      infoBufferSize: "0"
  verbosity: 0
memorySwap: {}
nodeStatusReportFrequency: 5m0s
nodeStatusUpdateFrequency: 10s
protectKernelDefaults: true
resolvConf: /run/systemd/resolve/resolv.conf
runtimeRequestTimeout: 2m0s
serializeImagePulls: false
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /var/lib/rancher/rke2/agent/pod-manifests
streamingConnectionIdleTimeout: 4h0m0s
syncFrequency: 1m0s
tlsCertFile: /var/lib/rancher/rke2/agent/serving-kubelet.crt
tlsPrivateKeyFile: /var/lib/rancher/rke2/agent/serving-kubelet.key
volumeStatsAggPeriod: 1m0s
Solución:

Por defecto, RKE2 no establece el feature gate RotateKubeletServerCertificate. Si esta verificación falla, edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml, y elimina cualquier parámetro RotateKubeletServerCertificate. Según tu sistema, reinicia el servicio RKE2. Por ejemplo, systemctl restart rke2-server.service

4.2.12 Asegúrate de que el Kubelet solo utilice Cifrados Criptográficos Fuertes (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml,

kubelet-arg:
  - "tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305"

o en un subconjunto de estos valores. Según tu sistema, reinicia el servicio RKE2. Por ejemplo, systemctl restart rke2-server.service

4.2.13 Asegúrate de que se establezca un límite en los PIDs de los pods (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Edita el archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml, establece el siguiente parámetro a un valor adecuado.

kubelet-arg:
  - "pod-max-pids=<value>"

Según tu sistema, reinicia el servicio RKE2. Por ejemplo, systemctl restart rke2-server.service

4.2.14 Asegúrate de que el parámetro --seccomp-default esté establecido en verdadero (Manual)

Resultado: WARN (ADVERTENCIA)

Remediación: Si está habilitado, el kubelet utilizará el perfil seccomp RuntimeDefault por defecto, que está definido por el entorno de ejecución de contenedor, en lugar de utilizar el modo Unconfined (seccomp deshabilitado) (por defecto). Si utilizas un archivo de configuración de RKE2 /etc/rancher/rke2/config.yaml, edita el archivo para establecer seccomp-default en kubelet-arg:

  • "seccomp-default=true"

4.3 kube-proxy

Asegúrate de que el servicio de métricas de kube-proxy esté vinculado al host local (Automatizado).

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /etc/kubernetes/addons/kube-proxy-daemonset.yaml; then cat /etc/kubernetes/addons/kube-proxy-daemonset.yaml; fi'

Resultado Esperado: '--metrics-bind-address' está presente O '--metrics-bind-address' no está presente

Valor Devuelto:
UID          PID    PPID  C STIME TTY          TIME CMD
root       19921   19868  0 16:17 ?        00:00:00 kube-proxy --cluster-cidr=10.42.0.0/16 --conntrack-max-per-core=0 --conntrack-tcp-timeout-close-wait=0s --conntrack-tcp-timeout-established=0s --healthz-bind-address=127.0.0.1 --hostname-override=server-0 --kubeconfig=/var/lib/rancher/rke2/agent/kubeproxy.kubeconfig --proxy-mode=iptables
Remediación:

Modifica o elimina cualquier valor que vincule el servicio de métricas a una dirección que no sea el host local. El valor por defecto es 127.0.0.1:10249.

5 Kubernetes Policies

5.1 RBAC y Cuentas de Servicio

5.1.1 Asegúrate de que el rol de cluster-admin solo se utilice donde sea necesario (Manual)

Resultado: PASS

Auditoría:

kubectl get clusterrolebindings -o=custom-columns=ROLE:.roleRef.name,NAME:.metadata.name,SUBJECT:.subjects[*].name --no-headers |  grep cluster-admin

Resultado Esperado: 'cluster-admin' coincide con la expresión regex 'cluster-admin

helm-kube-system-rke2-.*'

Valor devuelto:
cluster-admin                                                   cluster-admin                                                   system:masters
cluster-admin                                                   helm-kube-system-rke2-canal                                     helm-rke2-canal
cluster-admin                                                   helm-kube-system-rke2-coredns                                   helm-rke2-coredns
cluster-admin                                                   helm-kube-system-rke2-ingress-nginx                             helm-rke2-ingress-nginx
cluster-admin                                                   helm-kube-system-rke2-metrics-server                            helm-rke2-metrics-server
cluster-admin                                                   helm-kube-system-rke2-runtimeclasses                            helm-rke2-runtimeclasses
cluster-admin                                                   helm-kube-system-rke2-snapshot-controller                       helm-rke2-snapshot-controller
cluster-admin                                                   helm-kube-system-rke2-snapshot-controller-crd                   helm-rke2-snapshot-controller-crd
Remediación:

Identifica todos los clusterrolebindings al rol de cluster-admin. Verifica si se utilizan y si necesitan este rol o si podrían usar un rol con menos privilegios. RKE2 da excepciones a los clusterrolebindings helm-kube-system-rke2-* que gestionan la instalación de todos los componentes gestionados por rke2. Donde sea posible, primero vincula a los usuarios a un rol de menor privilegio y luego elimina el clusterrolebinding al rol de cluster-admin:

kubectl delete clusterrolebinding [name]

5.1.2 Minimiza el acceso a secretos (Manual)

Resultado: WARN (ADVERTENCIA)

Remediación: Donde sea posible, elimina el acceso para obtener, listar y vigilar los objetos Secret en el clúster.

5.1.3 Minimiza el uso de comodines en Roles y ClusterRoles (Manual)

Resultado: PASS

Auditoría:

# Check Roles
kubectl get roles --all-namespaces -o custom-columns=ROLE_NAMESPACE:.metadata.namespace,ROLE_NAME:.metadata.name --no-headers | while read -r role_namespace role_name
do
  role_rules=$(kubectl get role -n "${role_namespace}" "${role_name}" -o=json | jq -c '.rules')
  if echo "${role_rules}" | grep -q "\[\"\*\"\]"; then
    printf "**role_name: %-50s  role_namespace: %-25s role_rules: %s is_compliant: false\n" "${role_name}" "${role_namespace}" "${role_rules}"
  else
    printf "**role_name: %-50s role_namespace: %-25s is_compliant: true\n" "${role_name}" "${role_namespace}"
  fi;
done

cr_whitelist="cluster-admin rke2-cloud-controller-manager local-path-provisioner-role"
cr_whitelist="$cr_whitelist system:kube-controller-manager system:kubelet-api-admin system:controller:namespace-controller"
cr_whitelist="$cr_whitelist system:controller:disruption-controller system:controller:generic-garbage-collector"
cr_whitelist="$cr_whitelist system:controller:horizontal-pod-autoscaler system:controller:resourcequota-controller"
# Check ClusterRoles
kubectl get clusterroles -o custom-columns=CLUSTERROLE_NAME:.metadata.name --no-headers | while read -r clusterrole_name
do
  clusterrole_rules=$(kubectl get clusterrole "${clusterrole_name}" -o=json | jq -c '.rules')
  if echo "${cr_whitelist}" | grep -q "${clusterrole_name}"; then
    printf "**clusterrole_name: %-50s is_whitelist: true  is_compliant: true\n" "${clusterrole_name}"
  elif echo "${clusterrole_rules}" | grep -q "\[\"\*\"\]"; then
    echo "**clusterrole_name: ${clusterrole_name} clusterrole_rules: ${clusterrole_rules} is_compliant: false"
  else
    printf "**clusterrole_name: %-50s is_whitelist: false is_compliant: true\n" "${clusterrole_name}"
  fi;
done

Resultado Esperado: 'is_compliant' es igual a 'true'

Valor Devuelto:
**role_name: system:controller:bootstrap-signer                 role_namespace: kube-public               is_compliant: true
**role_name: extension-apiserver-authentication-reader          role_namespace: kube-system               is_compliant: true
**role_name: rke2-ingress-nginx                                 role_namespace: kube-system               is_compliant: true
**role_name: rke2-snapshot-controller                           role_namespace: kube-system               is_compliant: true
**role_name: system::leader-locking-kube-controller-manager     role_namespace: kube-system               is_compliant: true
**role_name: system::leader-locking-kube-scheduler              role_namespace: kube-system               is_compliant: true
**role_name: system:controller:bootstrap-signer                 role_namespace: kube-system               is_compliant: true
**role_name: system:controller:cloud-provider                   role_namespace: kube-system               is_compliant: true
**role_name: system:controller:token-cleaner                    role_namespace: kube-system               is_compliant: true
**clusterrole_name: admin                                              is_whitelist: true  is_compliant: true
**clusterrole_name: calico-node                                        is_whitelist: false is_compliant: true
**clusterrole_name: cluster-admin                                      is_whitelist: true  is_compliant: true
**clusterrole_name: edit                                               is_whitelist: false is_compliant: true
**clusterrole_name: flannel                                            is_whitelist: false is_compliant: true
**clusterrole_name: rke2-cloud-controller-manager                      is_whitelist: true  is_compliant: true
**clusterrole_name: rke2-coredns-rke2-coredns                          is_whitelist: false is_compliant: true
**clusterrole_name: rke2-coredns-rke2-coredns-autoscaler               is_whitelist: false is_compliant: true
**clusterrole_name: rke2-ingress-nginx                                 is_whitelist: false is_compliant: true
**clusterrole_name: rke2-snapshot-controller                           is_whitelist: false is_compliant: true
**clusterrole_name: system:aggregate-to-admin                          is_whitelist: false is_compliant: true
**clusterrole_name: system:aggregate-to-edit                           is_whitelist: false is_compliant: true
**clusterrole_name: system:aggregate-to-view                           is_whitelist: false is_compliant: true
**clusterrole_name: system:auth-delegator                              is_whitelist: false is_compliant: true
**clusterrole_name: system:basic-user                                  is_whitelist: false is_compliant: true
**clusterrole_name: system:certificates.k8s.io:certificatesigningrequests:nodeclient is_whitelist: false is_compliant: true
**clusterrole_name: system:certificates.k8s.io:certificatesigningrequests:selfnodeclient is_whitelist: false is_compliant: true
**clusterrole_name: system:certificates.k8s.io:kube-apiserver-client-approver is_whitelist: false is_compliant: true
**clusterrole_name: system:certificates.k8s.io:kube-apiserver-client-kubelet-approver is_whitelist: false is_compliant: true
**clusterrole_name: system:certificates.k8s.io:kubelet-serving-approver is_whitelist: false is_compliant: true
**clusterrole_name: system:certificates.k8s.io:legacy-unknown-approver is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:attachdetach-controller          is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:certificate-controller           is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:clusterrole-aggregation-controller is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:cronjob-controller               is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:daemon-set-controller            is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:deployment-controller            is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:disruption-controller            is_whitelist: true  is_compliant: true
**clusterrole_name: system:controller:endpoint-controller              is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:endpointslice-controller         is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:endpointslicemirroring-controller is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:ephemeral-volume-controller      is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:expand-controller                is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:generic-garbage-collector        is_whitelist: true  is_compliant: true
**clusterrole_name: system:controller:horizontal-pod-autoscaler        is_whitelist: true  is_compliant: true
**clusterrole_name: system:controller:job-controller                   is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:legacy-service-account-token-cleaner is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:namespace-controller             is_whitelist: true  is_compliant: true
**clusterrole_name: system:controller:node-controller                  is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:persistent-volume-binder         is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:pod-garbage-collector            is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:pv-protection-controller         is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:pvc-protection-controller        is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:replicaset-controller            is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:replication-controller           is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:resourcequota-controller         is_whitelist: true  is_compliant: true
**clusterrole_name: system:controller:root-ca-cert-publisher           is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:route-controller                 is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:service-account-controller       is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:service-controller               is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:statefulset-controller           is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:ttl-after-finished-controller    is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:ttl-controller                   is_whitelist: false is_compliant: true
**clusterrole_name: system:controller:validatingadmissionpolicy-status-controller is_whitelist: false is_compliant: true
**clusterrole_name: system:discovery                                   is_whitelist: false is_compliant: true
**clusterrole_name: system:heapster                                    is_whitelist: false is_compliant: true
**clusterrole_name: system:kube-aggregator                             is_whitelist: false is_compliant: true
**clusterrole_name: system:kube-controller-manager                     is_whitelist: true  is_compliant: true
**clusterrole_name: system:kube-dns                                    is_whitelist: false is_compliant: true
**clusterrole_name: system:kube-proxy                                  is_whitelist: false is_compliant: true
**clusterrole_name: system:kube-scheduler                              is_whitelist: false is_compliant: true
**clusterrole_name: system:kubelet-api-admin                           is_whitelist: true  is_compliant: true
**clusterrole_name: system:monitoring                                  is_whitelist: false is_compliant: true
**clusterrole_name: system:node                                        is_whitelist: false is_compliant: true
**clusterrole_name: system:node-bootstrapper                           is_whitelist: false is_compliant: true
**clusterrole_name: system:node-problem-detector                       is_whitelist: false is_compliant: true
**clusterrole_name: system:node-proxier                                is_whitelist: false is_compliant: true
**clusterrole_name: system:persistent-volume-provisioner               is_whitelist: false is_compliant: true
**clusterrole_name: system:public-info-viewer                          is_whitelist: false is_compliant: true
**clusterrole_name: system:rke2-controller                             is_whitelist: false is_compliant: true
**clusterrole_name: system:rke2-metrics-server                         is_whitelist: false is_compliant: true
**clusterrole_name: system:rke2-metrics-server-aggregated-reader       is_whitelist: false is_compliant: true
**clusterrole_name: system:service-account-issuer-discovery            is_whitelist: false is_compliant: true
**clusterrole_name: system:volume-scheduler                            is_whitelist: false is_compliant: true
**clusterrole_name: view                                               is_whitelist: false is_compliant: true
Remediación:

Donde sea posible, reemplaza cualquier uso de comodines en clusterroles y roles con objetos o acciones específicas. RKE2 da excepciones para los siguientes roles de clúster, que son necesarios para operaciones regulares:

  • rke2-cloud-controller-manager, local-path-provisioner-role, cluster-admin

  • system:kube-controller-manager, system:kubelet-api-admin, system:controller:namespace-controller,

  • system:controller:disruption-controller, system:controller:generic-garbage-collector,

  • system:controller:horizontal-pod-autoscaler, system:controller:resourcequota-controller

5.1.4 Minimizar el acceso para crear pods (Manual)

Resultado: PASS

Auditoría:

echo "canCreatePodsAsSystemAuthenticated: $(kubectl auth can-i create pods --all-namespaces --as=system:authenticated)"

Resultado Esperado: 'canCreatePodsAsSystemAuthenticated' es igual a 'no'

Valor Devuelto:
canCreatePodsAsSystemAuthenticated: no
Remediación:

Donde sea posible, elimina el acceso para crear objetos pod en el clúster.

5.1.5 Asegurarse de que las cuentas de servicio predeterminadas no se utilicen activamente. (Manual)

Resultado: PASS

Auditoría:

kubectl get serviceaccounts --all-namespaces --field-selector metadata.name=default \
-o custom-columns=N:.metadata.namespace,SA:.metadata.name,ASA:.automountServiceAccountToken --no-headers \
| while read -r namespace serviceaccount automountserviceaccounttoken
do
  if [ "${automountserviceaccounttoken}" = "<none>" ]; then
    automountserviceaccounttoken="notset"
  fi
  if [ "${namespace}" != "kube-system" ] && [ "${automountserviceaccounttoken}" != "false" ]; then
    printf "**namespace: %-20s service_account: %-10s automountServiceAccountToken: %-6s is_compliant: false\n" "${namespace}" "${serviceaccount}" "${automountserviceaccounttoken}"
  else
    printf "**namespace: %-20s service_account: %-10s automountServiceAccountToken: %-6s is_compliant: true\n" "${namespace}" "${serviceaccount}" "${automountserviceaccounttoken}"
  fi
done

Resultado Esperado: 'is_compliant' es igual a 'true'

Valor Devuelto:
**namespace: default              service_account: default    automountServiceAccountToken: false  is_compliant: true
**namespace: kube-node-lease      service_account: default    automountServiceAccountToken: false  is_compliant: true
**namespace: kube-public          service_account: default    automountServiceAccountToken: false  is_compliant: true
**namespace: kube-system          service_account: default    automountServiceAccountToken: false  is_compliant: true
Remediación:

Crea cuentas de servicio explícitas siempre que una carga de trabajo de Kubernetes requiera acceso específico al servidor API de Kubernetes. Modifica la configuración de cada cuenta de servicio predeterminada para incluir este valor
automountServiceAccountToken: false
O usando kubectl:

kubectl patch serviceaccount --namespace <NAMESPACE>lt;NAMESPACE<NAMESPACE>gt; default --patch '{"automountServiceAccountToken": false}'

5.1.6 Asegurarse de que los Tokens de Cuenta de Servicio solo se monten donde sea necesario (Manual)

Resultado: PASS

Auditoría:

kubectl get pods --all-namespaces -o custom-columns=POD_NAMESPACE:.metadata.namespace,POD_NAME:.metadata.name,POD_SERVICE_ACCOUNT:.spec.serviceAccount,POD_IS_AUTOMOUNTSERVICEACCOUNTTOKEN:.spec.automountServiceAccountToken --no-headers | while read -r pod_namespace pod_name pod_service_account pod_is_automountserviceaccounttoken
do
  # Skip pods with no service account
  if [ "${pod_service_account}" = "<none>" ]; then
    continue
  fi
  # Retrieve automountServiceAccountToken's value for ServiceAccount and Pod, set to notset if null or <none>.
  svacc_is_automountserviceaccounttoken=$(kubectl get serviceaccount -n "${pod_namespace}" "${pod_service_account}" -o json | jq -r '.automountServiceAccountToken' | sed -e 's/<none>/notset/g' -e 's/null/notset/g')
  pod_is_automountserviceaccounttoken=$(echo "${pod_is_automountserviceaccounttoken}" | sed -e 's/<none>/notset/g' -e 's/null/notset/g')
  if [ "${svacc_is_automountserviceaccounttoken}" = "false" ] && ( [ "${pod_is_automountserviceaccounttoken}" = "false" ] || [ "${pod_is_automountserviceaccounttoken}" = "notset" ] ); then
    is_compliant="true"
  elif [ "${svacc_is_automountserviceaccounttoken}" = "true" ] && [ "${pod_is_automountserviceaccounttoken}" = "false" ]; then
    is_compliant="true"
  else
    is_compliant="false"
  fi
  # Whitelist kube-system namespace as these pods are expected to contact the apiserver
  if [ "${pod_namespace}" = "kube-system" ]; then
    is_compliant="true"
  fi
  echo "**namespace: ${pod_namespace} pod_name: ${pod_name} service_account: ${pod_service_account} pod_is_automountserviceaccounttoken: ${pod_is_automountserviceaccounttoken} svacc_is_automountServiceAccountToken: ${svacc_is_automountserviceaccounttoken} is_compliant: ${is_compliant}"
done

Resultado Esperado: 'is_compliant' es igual a 'true'

Valor Devuelto:
**namespace: kube-system pod_name: helm-install-rke2-canal-789dp service_account: helm-rke2-canal pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: true is_compliant: true
**namespace: kube-system pod_name: helm-install-rke2-coredns-c8whl service_account: helm-rke2-coredns pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: true is_compliant: true
**namespace: kube-system pod_name: helm-install-rke2-ingress-nginx-gqtvn service_account: helm-rke2-ingress-nginx pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: true is_compliant: true
**namespace: kube-system pod_name: helm-install-rke2-metrics-server-7jckf service_account: helm-rke2-metrics-server pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: true is_compliant: true
**namespace: kube-system pod_name: helm-install-rke2-runtimeclasses-2zdbw service_account: helm-rke2-runtimeclasses pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: true is_compliant: true
**namespace: kube-system pod_name: helm-install-rke2-snapshot-controller-crd-9njtl service_account: helm-rke2-snapshot-controller-crd pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: true is_compliant: true
**namespace: kube-system pod_name: helm-install-rke2-snapshot-controller-rm764 service_account: helm-rke2-snapshot-controller pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: true is_compliant: true
**namespace: kube-system pod_name: rke2-canal-bqn2x service_account: canal pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: notset is_compliant: true
**namespace: kube-system pod_name: rke2-coredns-rke2-coredns-6464f98784-7mc2x service_account: coredns pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: notset is_compliant: true
**namespace: kube-system pod_name: rke2-coredns-rke2-coredns-autoscaler-67bb49dff-lks69 service_account: rke2-coredns-rke2-coredns-autoscaler pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: notset is_compliant: true
**namespace: kube-system pod_name: rke2-ingress-nginx-controller-2pjn6 service_account: rke2-ingress-nginx pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: true is_compliant: true
**namespace: kube-system pod_name: rke2-metrics-server-75d485c65b-djgst service_account: rke2-metrics-server pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: notset is_compliant: true
**namespace: kube-system pod_name: rke2-snapshot-controller-696989ffdd-ctddn service_account: rke2-snapshot-controller pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: notset is_compliant: true
Remediación:

Modifica la definición de ServiceAccounts y Pods que no necesitan montar tokens de cuenta de servicio para desactivarlo, con automountServiceAccountToken: false. RKE2 da excepciones a las ServiceAccounts en el espacio de nombres kube-system, ya que se espera que contacten con el apiserver. Cuando está en modo cis, RKE2 desactiva el automountServiceAccountToken para los espacios de nombres:

  • kube-public, default, kube-node-lease. Si tanto la ServiceAccount como el .spec del Pod especifican un valor para automountServiceAccountToken, el spec del Pod tiene prioridad. Condición: El Pod es_compliant a true cuando

    • La ServiceAccount tiene automountServiceAccountToken: false y el Pod tiene automountServiceAccountToken: false o no establecido

    • La ServiceAccount tiene automountServiceAccountToken: true/no establecido y el Pod tiene automountServiceAccountToken: false

5.1.7 Evita el uso del grupo system:masters (Manual)

Resultado: WARN (ADVERTENCIA)

Remediación: Elimina el grupo system:masters de todos los usuarios en el clúster.

5.1.8 Limita el uso de los permisos Bind, Impersonate y Escalate en el clúster de Kubernetes (Manual)

Resultado: WARN (ADVERTENCIA)

Remediación: Donde sea posible, elimina los derechos de impersonar, vincular y escalar de los sujetos.

5.1.9 Minimiza el acceso para crear volúmenes persistentes (Manual)

Resultado: WARN (ADVERTENCIA)

Remediación: Donde sea posible, elimina el acceso para crear objetos PersistentVolume en el clúster.

5.1.10 Minimiza el acceso al sub-recurso proxy de los nodos (Manual)

Resultado: WARN (ADVERTENCIA)

Remediación: Donde sea posible, elimina el acceso al sub-recurso proxy de los objetos nodo.

5.1.11 Minimiza el acceso al sub-recurso de aprobación de los objetos certificatesigningrequests (Manual)

Resultado: WARN (ADVERTENCIA)

Remediación: Donde sea posible, elimina el acceso al sub-recurso de aprobación de los objetos certificatesigningrequests.

5.1.12 Minimiza el acceso a los objetos de configuración de webhook (Manual)

Resultado: WARN (ADVERTENCIA)

Remediación: Donde sea posible, elimina el acceso a los objetos validatingwebhookconfigurations o mutatingwebhookconfigurations

5.1.13 Minimiza el acceso a la creación de tokens de cuenta de servicio (Manual)

Resultado: WARN (ADVERTENCIA)

Remediación: Donde sea posible, elimina el acceso al sub-recurso token de los objetos serviceaccount.

5.2 Normas de seguridad de Pods

5.2.1 Asegúrese de que el clúster tenga al menos un mecanismo de control de directivas activo (Manual)

Resultado: WARN (ADVERTENCIA)

Remediación: Asegúrese de que esté en funcionamiento, ya sea Pod Security Admission o un sistema de control de directivas externo para cada espacio de nombres que contenga cargas de trabajo de usuario.

5.2.2 Minimice la admisión de contenedores privilegiados (Manual)

Resultado: PASS

Auditoría:

whitelist="kube-flannel calico-node kube-proxy"
kubectl get pods --all-namespaces -o custom-columns=POD_NAME:.metadata.name,POD_NAMESPACE:.metadata.namespace --no-headers | while read -r pod_name pod_namespace
do
  # Retrieve container(s) for each Pod.
  kubectl get pod "${pod_name}" --namespace "${pod_namespace}" -o json | jq -c '.spec.containers[]' | while read -r container
  do
    # Retrieve container's name.
    container_name=$(echo ${container} | jq -r '.name')
    # Retrieve container's .securityContext.privileged value.
    container_privileged=$(echo ${container} | jq -r '.securityContext.privileged' | sed -e 's/null/notset/g')
    # Check if container name is in whitelist.
    if echo "${whitelist}" | grep -q "${container_name}"; then
      echo "***pod_name: ${pod_name} container_name: ${container_name} pod_namespace: ${pod_namespace} is_container_privileged: ${container_privileged} is_whitelist: true is_compliant: true"
    elif [ "${container_privileged}" = "false" ] || [ "${container_privileged}" = "notset" ] ; then
      echo "***pod_name: ${pod_name} container_name: ${container_name} pod_namespace: ${pod_namespace} is_container_privileged: ${container_privileged} is_compliant: true"
    else
      echo "***pod_name: ${pod_name} container_name: ${container_name} pod_namespace: ${pod_namespace} is_container_privileged: ${container_privileged} is_compliant: false"
    fi
  done
done

Resultado Esperado: 'is_compliant' es igual a 'true'

Valor Devuelto:
***pod_name: cloud-controller-manager-server-0 container_name: cloud-controller-manager pod_namespace: kube-system is_container_privileged: false is_compliant: true
***pod_name: etcd-server-0 container_name: etcd pod_namespace: kube-system is_container_privileged: false is_compliant: true
***pod_name: helm-install-rke2-canal-789dp container_name: helm pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: helm-install-rke2-coredns-c8whl container_name: helm pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: helm-install-rke2-ingress-nginx-gqtvn container_name: helm pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: helm-install-rke2-metrics-server-7jckf container_name: helm pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: helm-install-rke2-runtimeclasses-2zdbw container_name: helm pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: helm-install-rke2-snapshot-controller-crd-9njtl container_name: helm pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: helm-install-rke2-snapshot-controller-rm764 container_name: helm pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: kube-apiserver-server-0 container_name: kube-apiserver pod_namespace: kube-system is_container_privileged: false is_compliant: true
***pod_name: kube-controller-manager-server-0 container_name: kube-controller-manager pod_namespace: kube-system is_container_privileged: false is_compliant: true
***pod_name: kube-proxy-server-0 container_name: kube-proxy pod_namespace: kube-system is_container_privileged: true is_whitelist: true is_compliant: true
***pod_name: kube-scheduler-server-0 container_name: kube-scheduler pod_namespace: kube-system is_container_privileged: false is_compliant: true
***pod_name: rke2-canal-bqn2x container_name: calico-node pod_namespace: kube-system is_container_privileged: true is_whitelist: true is_compliant: true
***pod_name: rke2-canal-bqn2x container_name: kube-flannel pod_namespace: kube-system is_container_privileged: true is_whitelist: true is_compliant: true
***pod_name: rke2-coredns-rke2-coredns-6464f98784-7mc2x container_name: coredns pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: rke2-coredns-rke2-coredns-autoscaler-67bb49dff-lks69 container_name: autoscaler pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: rke2-ingress-nginx-controller-2pjn6 container_name: rke2-ingress-nginx-controller pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: rke2-metrics-server-75d485c65b-djgst container_name: metrics-server pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: rke2-snapshot-controller-696989ffdd-ctddn container_name: rke2-snapshot-controller pod_namespace: kube-system is_container_privileged: notset is_compliant: true
Remediación:

Agregue directivas a cada espacio de nombres en el clúster que tenga cargas de trabajo de usuario para restringir la admisión de contenedores privilegiados. RKE2 da excepciones a los siguientes pods, que son necesarios para las operaciones regulares:

  • kube-flannel, calico-node, kube-proxy Auditoría: la auditoría lista todos los contenedores de los pods para recuperar su valor .securityContext.privileged. Condición: is_compliant es falso si del contenedor .securityContext.privileged está configurado en true. Por defecto: por defecto, no hay restricciones en la creación de contenedores privilegiados.

5.2.3 Minimice la admisión de contenedores que deseen compartir el espacio de nombres de ID de proceso del host (Manual)

Resultado: PASS

Auditoría:

kubectl get pods --all-namespaces -o custom-columns=POD_NAME:.metadata.name,POD_NAMESPACE:.metadata.namespace --no-headers | while read -r pod_name pod_namespace
do
  # Retrieve spec.hostPID for each pod.
  pod_hostpid=$(kubectl get pod "${pod_name}" --namespace "${pod_namespace}" -o jsonpath='{.spec.hostPID}' 2>/dev/null)
  if [ -z "${pod_hostpid}" ]; then
    pod_hostpid="false"
    echo "***pod_name: ${pod_name} pod_namespace: ${pod_namespace} is_pod_hostpid: ${pod_hostpid} is_compliant: true"
  else
    echo "***pod_name: ${pod_name} pod_namespace: ${pod_namespace} is_pod_hostpid: ${pod_hostpid} is_compliant: false"
  fi
done

Resultado Esperado: 'is_compliant' es igual a 'true'

Valor Devuelto:
***pod_name: cloud-controller-manager-server-0 pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: etcd-server-0 pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: helm-install-rke2-canal-789dp pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: helm-install-rke2-coredns-c8whl pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: helm-install-rke2-ingress-nginx-gqtvn pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: helm-install-rke2-metrics-server-7jckf pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: helm-install-rke2-runtimeclasses-2zdbw pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: helm-install-rke2-snapshot-controller-crd-9njtl pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: helm-install-rke2-snapshot-controller-rm764 pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: kube-apiserver-server-0 pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: kube-controller-manager-server-0 pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: kube-proxy-server-0 pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: kube-scheduler-server-0 pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: rke2-canal-bqn2x pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: rke2-coredns-rke2-coredns-6464f98784-7mc2x pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: rke2-coredns-rke2-coredns-autoscaler-67bb49dff-lks69 pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: rke2-ingress-nginx-controller-2pjn6 pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: rke2-metrics-server-75d485c65b-djgst pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: rke2-snapshot-controller-696989ffdd-ctddn pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
Remediación:

Agregue directivas a cada espacio de nombres en el clúster que tenga cargas de trabajo de usuario para restringir la admisión de hostPID contenedores. Auditoría: la auditoría recupera el spec.hostPID de cada Pod. Condición: is_compliant es falso si el spec.hostPID del Pod está configurado en true. Por defecto: por defecto, no hay restricciones en la creación de contenedores hostPID.

5.2.4 Minimice la admisión de contenedores que deseen compartir el espacio de nombres IPC del host (Manual)

Resultado: PASS

Auditoría:

kubectl get pods --all-namespaces -o custom-columns=POD_NAME:.metadata.name,POD_NAMESPACE:.metadata.namespace --no-headers | while read -r pod_name pod_namespace
do
  # Retrieve spec.hostIPC for each pod.
  pod_hostipc=$(kubectl get pod "${pod_name}" --namespace "${pod_namespace}" -o jsonpath='{.spec.hostIPC}' 2>/dev/null)
  if [ -z "${pod_hostipc}" ]; then
    pod_hostipc="false"
    echo "***pod_name: ${pod_name} pod_namespace: ${pod_namespace} is_pod_hostipc: ${pod_hostipc} is_compliant: true"
  else
    echo "***pod_name: ${pod_name} pod_namespace: ${pod_namespace} is_pod_hostipc: ${pod_hostipc} is_compliant: false"
  fi
done

Resultado Esperado: 'is_compliant' es igual a 'true'

Valor Devuelto:
***pod_name: cloud-controller-manager-server-0 pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: etcd-server-0 pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: helm-install-rke2-canal-789dp pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: helm-install-rke2-coredns-c8whl pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: helm-install-rke2-ingress-nginx-gqtvn pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: helm-install-rke2-metrics-server-7jckf pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: helm-install-rke2-runtimeclasses-2zdbw pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: helm-install-rke2-snapshot-controller-crd-9njtl pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: helm-install-rke2-snapshot-controller-rm764 pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: kube-apiserver-server-0 pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: kube-controller-manager-server-0 pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: kube-proxy-server-0 pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: kube-scheduler-server-0 pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: rke2-canal-bqn2x pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: rke2-coredns-rke2-coredns-6464f98784-7mc2x pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: rke2-coredns-rke2-coredns-autoscaler-67bb49dff-lks69 pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: rke2-ingress-nginx-controller-2pjn6 pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: rke2-metrics-server-75d485c65b-djgst pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: rke2-snapshot-controller-696989ffdd-ctddn pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
Remediación:

Agregue directivas a cada espacio de nombres en el clúster que tenga cargas de trabajo de usuario para restringir la admisión de hostIPC contenedores. Auditoría: la auditoría recupera el spec.IPC de cada Pod. Condición: is_compliant es falso si el spec.hostIPC del Pod está configurado en true. Por defecto, no hay restricciones en la creación de contenedores hostIPC.

5.2.5 Minimice la admisión de contenedores que deseen compartir el espacio de nombres de red del host (Manual)

Resultado: PASS

Auditoría:

whitelist="cloud-controller-manager etcd rke2-canal rke2-coredns kube-apiserver kube-scheduler kube-proxy kube-controller-manager"
is_in_whitelist() {
  for entry in $whitelist; do
    case "${pod_name}" in
      *"${entry}"*)
        return 0
        ;;
    esac
  done
  return 1
}
kubectl get pods --all-namespaces -o custom-columns=POD_NAME:.metadata.name,POD_NAMESPACE:.metadata.namespace --no-headers | while read -r pod_name pod_namespace
do
  # Retrieve spec.hostNetwork for each pod.
  pod_hostnetwork=$(kubectl get pod "${pod_name}" --namespace "${pod_namespace}" -o jsonpath='{.spec.hostNetwork}' 2>/dev/null)
  echo "${whitelist}" | grep -q "${pod_name}"
  if [ "${pod_namespace}" = 'kube-system' ] && is_in_whitelist; then
    echo "***pod_name: ${pod_name} pod_namespace: ${pod_namespace} is_pod_hostnetwork: ${pod_hostnetwork} is_whitelist: true is_compliant: true"
  elif [ -z "${pod_hostnetwork}" ]; then
    pod_hostnetwork="false"
    echo "***pod_name: ${pod_name} pod_namespace: ${pod_namespace} is_pod_hostnetwork: ${pod_hostnetwork} is_compliant: true"
  else
    echo "***pod_name: ${pod_name} pod_namespace: ${pod_namespace} is_pod_hostnetwork: ${pod_hostnetwork} is_compliant: false"
  fi
done

Resultado Esperado: 'is_compliant' es igual a 'true'

Valor Devuelto:
***pod_name: cloud-controller-manager-server-0 pod_namespace: kube-system is_pod_hostnetwork: true is_whitelist: true is_compliant: true
***pod_name: etcd-server-0 pod_namespace: kube-system is_pod_hostnetwork: true is_whitelist: true is_compliant: true
***pod_name: helm-install-rke2-canal-789dp pod_namespace: kube-system is_pod_hostnetwork: true is_whitelist: true is_compliant: true
***pod_name: helm-install-rke2-coredns-c8whl pod_namespace: kube-system is_pod_hostnetwork: true is_whitelist: true is_compliant: true
***pod_name: helm-install-rke2-ingress-nginx-gqtvn pod_namespace: kube-system is_pod_hostnetwork: false is_compliant: true
***pod_name: helm-install-rke2-metrics-server-7jckf pod_namespace: kube-system is_pod_hostnetwork: false is_compliant: true
***pod_name: helm-install-rke2-runtimeclasses-2zdbw pod_namespace: kube-system is_pod_hostnetwork: false is_compliant: true
***pod_name: helm-install-rke2-snapshot-controller-crd-9njtl pod_namespace: kube-system is_pod_hostnetwork: false is_compliant: true
***pod_name: helm-install-rke2-snapshot-controller-rm764 pod_namespace: kube-system is_pod_hostnetwork: false is_compliant: true
***pod_name: kube-apiserver-server-0 pod_namespace: kube-system is_pod_hostnetwork: true is_whitelist: true is_compliant: true
***pod_name: kube-controller-manager-server-0 pod_namespace: kube-system is_pod_hostnetwork: true is_whitelist: true is_compliant: true
***pod_name: kube-proxy-server-0 pod_namespace: kube-system is_pod_hostnetwork: true is_whitelist: true is_compliant: true
***pod_name: kube-scheduler-server-0 pod_namespace: kube-system is_pod_hostnetwork: true is_whitelist: true is_compliant: true
***pod_name: rke2-canal-bqn2x pod_namespace: kube-system is_pod_hostnetwork: true is_whitelist: true is_compliant: true
***pod_name: rke2-coredns-rke2-coredns-6464f98784-7mc2x pod_namespace: kube-system is_pod_hostnetwork:  is_whitelist: true is_compliant: true
***pod_name: rke2-coredns-rke2-coredns-autoscaler-67bb49dff-lks69 pod_namespace: kube-system is_pod_hostnetwork:  is_whitelist: true is_compliant: true
***pod_name: rke2-ingress-nginx-controller-2pjn6 pod_namespace: kube-system is_pod_hostnetwork: false is_compliant: true
***pod_name: rke2-metrics-server-75d485c65b-djgst pod_namespace: kube-system is_pod_hostnetwork: false is_compliant: true
***pod_name: rke2-snapshot-controller-696989ffdd-ctddn pod_namespace: kube-system is_pod_hostnetwork: false is_compliant: true
Remediación:

Agregue directivas a cada espacio de nombres en el clúster que tenga cargas de trabajo de usuario para restringir la admisión de hostNetwork contenedores. RKE2 da excepciones a los siguientes pods en el espacio de nombres kube-system, que son necesarios para las operaciones regulares:

  • cloud-controller-manager, etcd, rke2-canal, rke2-coredns, kube-apiserver,

  • kube-scheduler, kube-proxy, kube-controller-manager Auditoría: la auditoría recupera el spec.hostNetwork de cada Pod. Condición: is_compliant es falso si el spec.hostNetwork del Pod está configurado en true. Por defecto, no hay restricciones en la creación de contenedores hostNetwork.

5.2.6 Minimice la admisión de contenedores con allowPrivilegeEscalation (Manual)

Resultado: PASS

Auditoría:

kubectl get pods --all-namespaces -o custom-columns=POD_NAME:.metadata.name,POD_NAMESPACE:.metadata.namespace --no-headers | while read -r pod_name pod_namespace
do
  # Retrieve container(s) for each Pod.
  kubectl get pod "${pod_name}" --namespace "${pod_namespace}" -o json | jq -c '.spec.containers[]' | while read -r container
  do
    # Retrieve container's name
    container_name=$(echo ${container} | jq -r '.name')
    # Retrieve container's .securityContext.allowPrivilegeEscalation
    container_allowprivesc=$(echo ${container} | jq -r '.securityContext.allowPrivilegeEscalation' | sed -e 's/null/notset/g')
    if [ "${container_allowprivesc}" = "false" ] || [ "${container_allowprivesc}" = "notset" ]; then
      echo "***pod_name: ${pod_name} container_name: ${container_name} pod_namespace: ${pod_namespace} is_container_allowprivesc: ${container_allowprivesc} is_compliant: true"
    else
      echo "***pod_name: ${pod_name} container_name: ${container_name} pod_namespace: ${pod_namespace} is_container_allowprivesc: ${container_allowprivesc} is_compliant: false"
    fi
  done
done

Resultado Esperado: 'is_compliant' es igual a 'true'

Valor Devuelto:
***pod_name: cloud-controller-manager-server-0 container_name: cloud-controller-manager pod_namespace: kube-system is_container_allowprivesc: notset is_compliant: true
***pod_name: etcd-server-0 container_name: etcd pod_namespace: kube-system is_container_allowprivesc: notset is_compliant: true
***pod_name: helm-install-rke2-canal-789dp container_name: helm pod_namespace: kube-system is_container_allowprivesc: false is_compliant: true
***pod_name: helm-install-rke2-coredns-c8whl container_name: helm pod_namespace: kube-system is_container_allowprivesc: false is_compliant: true
***pod_name: helm-install-rke2-ingress-nginx-gqtvn container_name: helm pod_namespace: kube-system is_container_allowprivesc: false is_compliant: true
***pod_name: helm-install-rke2-metrics-server-7jckf container_name: helm pod_namespace: kube-system is_container_allowprivesc: false is_compliant: true
***pod_name: helm-install-rke2-runtimeclasses-2zdbw container_name: helm pod_namespace: kube-system is_container_allowprivesc: false is_compliant: true
***pod_name: helm-install-rke2-snapshot-controller-crd-9njtl container_name: helm pod_namespace: kube-system is_container_allowprivesc: false is_compliant: true
***pod_name: helm-install-rke2-snapshot-controller-rm764 container_name: helm pod_namespace: kube-system is_container_allowprivesc: false is_compliant: true
***pod_name: kube-apiserver-server-0 container_name: kube-apiserver pod_namespace: kube-system is_container_allowprivesc: notset is_compliant: true
***pod_name: kube-controller-manager-server-0 container_name: kube-controller-manager pod_namespace: kube-system is_container_allowprivesc: notset is_compliant: true
***pod_name: kube-proxy-server-0 container_name: kube-proxy pod_namespace: kube-system is_container_allowprivesc: notset is_compliant: true
***pod_name: kube-scheduler-server-0 container_name: kube-scheduler pod_namespace: kube-system is_container_allowprivesc: notset is_compliant: true
***pod_name: rke2-canal-bqn2x container_name: calico-node pod_namespace: kube-system is_container_allowprivesc: notset is_compliant: true
***pod_name: rke2-canal-bqn2x container_name: kube-flannel pod_namespace: kube-system is_container_allowprivesc: notset is_compliant: true
***pod_name: rke2-coredns-rke2-coredns-6464f98784-7mc2x container_name: coredns pod_namespace: kube-system is_container_allowprivesc: false is_compliant: true
***pod_name: rke2-coredns-rke2-coredns-autoscaler-67bb49dff-lks69 container_name: autoscaler pod_namespace: kube-system is_container_allowprivesc: notset is_compliant: true
***pod_name: rke2-ingress-nginx-controller-2pjn6 container_name: rke2-ingress-nginx-controller pod_namespace: kube-system is_container_allowprivesc: false is_compliant: true
***pod_name: rke2-metrics-server-75d485c65b-djgst container_name: metrics-server pod_namespace: kube-system is_container_allowprivesc: false is_compliant: true
***pod_name: rke2-snapshot-controller-696989ffdd-ctddn container_name: rke2-snapshot-controller pod_namespace: kube-system is_container_allowprivesc: notset is_compliant: true
Remediación:

Agregue directivas a cada espacio de nombres en el clúster que tenga cargas de trabajo de usuario para restringir la admisión de contenedores con .securityContext.allowPrivilegeEscalation configurado en true. Auditoría: la auditoría recupera el/los contenedor(es) de cada Pod .securityContext.allowPrivilegeEscalation. Condición: is_compliant es falso si el .securityContext.allowPrivilegeEscalation del contenedor está configurado en true. Por defecto: Si no está configurado, se permite la escalación de privilegios (por defecto es verdadero). Sin embargo, si se utiliza PSP/PSA con un perfil de restricted, la escalación de privilegios está explícitamente prohibida a menos que se configure de otra manera.

5.2.7 Minimice la admisión de contenedores root (Manual)

Resultado: WARN (ADVERTENCIA)

Remediación: Cree una directiva para cada espacio de nombres en el clúster, asegurando que ya sea MustRunAsNonRoot o MustRunAs con el rango de UIDs que no incluya 0, esté configurado.

5.2.8 Minimizar la admisión de contenedores con la capacidad NET_RAW (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Añadir políticas a cada espacio de nombres en el clúster que tenga cargas de trabajo de usuario para restringir la admisión de contenedores con la capacidad NET_RAW.

5.2.9 Minimizar la admisión de contenedores con capacidades añadidas (Manual)

Resultado: PASS

Auditoría:

whitelist="rke2-ingress-nginx-controller coredns"
kubectl get pods --all-namespaces -o custom-columns=POD_NAME:.metadata.name,POD_NAMESPACE:.metadata.namespace --no-headers | while read -r pod_name pod_namespace
do
  # Retrieve container(s) for each Pod.
  kubectl get pod "${pod_name}" --namespace "${pod_namespace}" -o json | jq -c '.spec.containers[]' | while read -r container
  do
    # Retrieve container's name
    container_name=$(echo ${container} | jq -r '.name')
    # Retrieve container's added capabilities
    container_caps_add=$(echo ${container} | jq -r '.securityContext.capabilities.add' | sed -e 's/null/notset/g')
    # Set is_compliant to true by default.
    is_compliant=true
    is_whitelist=false
    caps_list=""
    if [ "${container_caps_add}" != "notset" ]; then
      # Loop through all caps and append caps_list, then set is_compliant to false.
      for cap in $(echo "${container_caps_add}" | jq -r '.[]'); do
        caps_list="${caps_list}${cap},"
        is_compliant=false
      done
      # Remove trailing comma for the last list member.
      caps_list=${caps_list%,}
    fi
    # Remove newline from container_caps_add for final output.
    container_caps_add=$(echo "${container_caps_add}" | tr -d '\n')
    if [ "${pod_namespace}" = "kube-system" ] && echo "${whitelist}" | grep -q "${container_name}"; then
      echo "***pod_name: ${pod_name} container_name: ${container_name} pod_namespace: ${pod_namespace} container_caps_add: ${container_caps_add} is_whitelist: true is_compliant: true"
    elif [ "${is_compliant}" = true ]; then
      echo "***pod_name: ${pod_name} container_name: ${container_name} pod_namespace: ${pod_namespace} container_caps_add: ${container_caps_add} is_compliant: true"
    else
      echo "***pod_name: ${pod_name} container_name: ${container_name} pod_namespace: ${pod_namespace} container_caps_add: ${caps_list} is_compliant: false"
    fi
  done
done

Resultado Esperado: 'is_compliant' es igual a 'true'

Valor Devuelto:
***pod_name: cloud-controller-manager-server-0 container_name: cloud-controller-manager pod_namespace: kube-system container_caps_add: notset is_compliant: true
***pod_name: etcd-server-0 container_name: etcd pod_namespace: kube-system container_caps_add: notset is_compliant: true
***pod_name: helm-install-rke2-canal-789dp container_name: helm pod_namespace: kube-system container_caps_add: notset is_compliant: true
***pod_name: helm-install-rke2-coredns-c8whl container_name: helm pod_namespace: kube-system container_caps_add: notset is_compliant: true
***pod_name: helm-install-rke2-ingress-nginx-gqtvn container_name: helm pod_namespace: kube-system container_caps_add: notset is_compliant: true
***pod_name: helm-install-rke2-metrics-server-7jckf container_name: helm pod_namespace: kube-system container_caps_add: notset is_compliant: true
***pod_name: helm-install-rke2-runtimeclasses-2zdbw container_name: helm pod_namespace: kube-system container_caps_add: notset is_compliant: true
***pod_name: helm-install-rke2-snapshot-controller-crd-9njtl container_name: helm pod_namespace: kube-system container_caps_add: notset is_compliant: true
***pod_name: helm-install-rke2-snapshot-controller-rm764 container_name: helm pod_namespace: kube-system container_caps_add: notset is_compliant: true
***pod_name: kube-apiserver-server-0 container_name: kube-apiserver pod_namespace: kube-system container_caps_add: notset is_compliant: true
***pod_name: kube-controller-manager-server-0 container_name: kube-controller-manager pod_namespace: kube-system container_caps_add: notset is_compliant: true
***pod_name: kube-proxy-server-0 container_name: kube-proxy pod_namespace: kube-system container_caps_add: notset is_compliant: true
***pod_name: kube-scheduler-server-0 container_name: kube-scheduler pod_namespace: kube-system container_caps_add: notset is_compliant: true
***pod_name: rke2-canal-bqn2x container_name: calico-node pod_namespace: kube-system container_caps_add: notset is_compliant: true
***pod_name: rke2-canal-bqn2x container_name: kube-flannel pod_namespace: kube-system container_caps_add: notset is_compliant: true
***pod_name: rke2-coredns-rke2-coredns-6464f98784-7mc2x container_name: coredns pod_namespace: kube-system container_caps_add: [  "NET_BIND_SERVICE"] is_whitelist: true is_compliant: true
***pod_name: rke2-coredns-rke2-coredns-autoscaler-67bb49dff-lks69 container_name: autoscaler pod_namespace: kube-system container_caps_add: notset is_compliant: true
***pod_name: rke2-ingress-nginx-controller-2pjn6 container_name: rke2-ingress-nginx-controller pod_namespace: kube-system container_caps_add: [  "NET_BIND_SERVICE"] is_whitelist: true is_compliant: true
***pod_name: rke2-metrics-server-75d485c65b-djgst container_name: metrics-server pod_namespace: kube-system container_caps_add: notset is_compliant: true
***pod_name: rke2-snapshot-controller-696989ffdd-ctddn container_name: rke2-snapshot-controller pod_namespace: kube-system container_caps_add: notset is_compliant: true
Solución:

Asegúrate de que allowedCapabilities no esté presente en las políticas del clúster a menos que esté configurado como un array vacío. RKE2 da excepciones a los siguientes pods en el espacio de nombres kube-system, que son necesarios para las operaciones regulares:

  • rke2-ingress-ngninx-controller, coredns Auditoría: la auditoría recupera las capacidades añadidas de los contenedores de cada Pod. Condición: is_compliant es falso si se añaden capacidades para un contenedor dado. Por defecto: Los contenedores se ejecutan con un conjunto de capacidades predeterminado asignado por el entorno de ejecución de contenedor.

5.2.10 Minimizar la admisión de contenedores con capacidades asignadas (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Revisad el uso de capacidades en las aplicaciones que se ejecutan en vuestro clúster. Donde un espacio de nombres contiene aplicaciones que no requieren ninguna capacidad de Linux para operar, considera añadir un PSP que prohíba la admisión de contenedores que no eliminen todas las capacidades.

5.2.11 Minimizar la admisión de contenedores Windows HostProcess (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Añadir políticas a cada espacio de nombres en el clúster que tenga cargas de trabajo de usuario para restringir la admisión de contenedores que tengan .securityContext.windowsOptions.hostProcess configurado como true.

5.2.12 Minimizar la admisión de volúmenes HostPath (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Añadir políticas a cada espacio de nombres en el clúster que tenga cargas de trabajo de usuario para restringir la admisión de contenedores con volúmenes hostPath.

5.2.13 Minimizar la admisión de contenedores que utilizan HostPorts (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Añadir políticas a cada espacio de nombres en el clúster que tenga cargas de trabajo de usuario para restringir la admisión de contenedores que utilizan hostPort secciones.

5.3 Políticas de Red y CNI

5.3.1 Asegurarse de que el CNI en uso soporte NetworkPolicies (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Si el complemento CNI en uso no soporta políticas de red, se debe considerar el uso de un complemento diferente o encontrar un mecanismo alternativo para restringir el tráfico en el clúster de Kubernetes.

5.3.2 Asegurarse de que todos los Espacios de Nombres tengan definidas NetworkPolicies (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Seguid la documentación y cread objetos NetworkPolicy según lo necesitéis.

5.4 Gestión de Secretos

5.4.1 Preferir el uso de Secretos como archivos en lugar de Secretos como variables de entorno (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Si es posible, reescribir el código de la aplicación para leer Secretos de archivos secretos montados, en lugar de variables de entorno.

5.4.2 Considerar el almacenamiento externo de secretos (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Consultar las opciones de gestión de secretos ofrecidas por vuestro proveedor de nube o una solución de gestión de secretos de terceros.

5.5 Control de Admisión Extensible

5.5.1 Configurar la Procedencia de Imágenes utilizando el controlador de admisión ImagePolicyWebhook (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Sigue la documentación de Kubernetes y configura la procedencia de las imágenes.

5.6 Políticas Generales

5.6.1 Crea límites administrativos entre recursos utilizando espacios de nombres (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Sigue la documentación y crea espacios de nombres para los objetos en tu despliegue según los necesites.

5.6.2 Asegúrate de que el perfil seccomp esté configurado como docker/default en las definiciones de tu Pod (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Utilizad securityContext para habilitar el perfil seccomp docker/default en las definiciones de vuestros pods. Un ejemplo es el siguiente: contextoDeSeguridad: perfilSeccomp: tipo: RuntimeDefault

5.6.3 Aplica SecurityContext a tus Pods y Contenedores (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Seguid la documentación de Kubernetes y aplicad ContextosDeSeguridad a vuestros Pods. Para una lista sugerida de SecurityContexts, puedes consultar el CIS Security Benchmark para Contenedores Docker.

5.6.4 No se debe utilizar el espacio de nombres por defecto (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Aseguraos de que se creen espacios de nombres para permitir una segregación adecuada de los recursos de Kubernetes y que todos los nuevos recursos se creen en un espacio de nombres específico.