Este documento ha sido traducido utilizando tecnología de traducción automática. Si bien nos esforzamos por proporcionar traducciones precisas, no ofrecemos garantías sobre la integridad, precisión o confiabilidad del contenido traducido. En caso de discrepancia, la versión original en inglés prevalecerá y constituirá el texto autorizado.

Guía de autoevaluación CIS 1.11

Descripción general

Este documento es un complemento a la guía de protección de K3s. La guía de protección proporciona orientación prescriptiva para proteger una instalación de producción de K3s, 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 K3s, equipos de seguridad, auditores y tomadores de decisiones.

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

Para más información sobre cada control, incluyendo descripciones detalladas y remediaciones para pruebas fallidas, puedes consultar la sección correspondiente del Benchmark de Kubernetes CIS v1.9. 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 K3s que fue configurado de acuerdo con la guía de protección adjunta.

Donde las auditorías de control difieren del benchmark original de CIS, se proporcionan los comandos de auditoría específicos para K3s para las pruebas.

Estos son los posibles resultados para cada control:

  • Aprobado - El clúster de K3s bajo prueba aprobó la auditoría descrita en el benchmark.

  • No Aplicable - El control no es aplicable a K3s debido a cómo está diseñado para operar. La sección de remediación explicará por qué es así.

  • Advertencia - El control es manual en el benchmark de CIS y depende del caso de uso del clúster o de algún otro factor que debe ser determinado por el operador del clúster. Estos controles han sido evaluados para asegurar que K3s no impida su implementación, pero no se ha realizado ninguna configuración o auditoría adicional del clúster bajo prueba.

Esta guía asume que K3s se está ejecutando como una unidad de Systemd. Tu instalación puede variar y requerirá que ajustes los comandos de "auditoría" para adaptarlos a tu escenario.

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: No corresponde

Razonamiento:

Por defecto, K3s incrusta el servidor API dentro del proceso de k3s. No hay archivo de especificación del pod del servidor API.

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: No corresponde

Razonamiento:

Por defecto, K3s incrusta el servidor API dentro del proceso de k3s. No hay archivo de especificación del pod del servidor API.

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: No corresponde

Razonamiento:

Por defecto, K3s incrusta el administrador de control dentro del proceso de k3s. No hay archivo de especificación del pod del administrador de control.

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: No corresponde

Razonamiento:

Por defecto, K3s incrusta el administrador de control dentro del proceso de k3s. No hay archivo de especificación del pod del administrador de control.

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: No corresponde

Razonamiento:

Por defecto, K3s incrusta el programador dentro del proceso de k3s. No hay archivo de especificación del pod del programador.

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: No corresponde

Razonamiento:

Por defecto, K3s incrusta el programador dentro del proceso de k3s. No hay archivo de especificación del pod del programador.

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 (Automatizado)

Resultado: No corresponde

Razonamiento:

Por defecto, K3s incrusta etcd dentro del proceso de k3s. No hay archivo de especificación del pod de etcd.

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

Resultado: No corresponde

Razonamiento:

Por defecto, K3s incrusta etcd dentro del proceso de k3s. No hay archivo de especificación del pod de etcd.

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

Resultado: PASS

Auditoría:

find /var/lib/cni/networks -type f ! -name lock 2> /dev/null | xargs --no-run-if-empty stat -c permissions=%a

Resultado esperado: los permisos son 600, se esperaba 600 o más restrictivos

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

Por defecto, K3s establece los permisos del archivo CNI en 600. Ten en cuenta que para muchos CNIs, se crea un archivo de bloqueo con permisos 750. Esto es esperado y se puede ignorar. Si modificas tu configuración de CNI, asegúrate de que los permisos estén establecidos en 600. Por ejemplo, chmod 600 /var/lib/cni/networks/<filename>

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

Resultado: PASS

Auditoría:

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
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/cni/networks/<filename>

1.1.11 Asegúrate 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/k3s/server/db/etcd

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

Valor devuelto:
permissions=700
Remediación:

No es aplicable para el clúster sin etcd. 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/k3s/server/db/etcd

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

Resultado: No corresponde

Razonamiento:

Para K3s, etcd está integrado dentro del proceso k3s. No hay un proceso etcd separado. Por lo tanto, la propiedad del directorio de datos de etcd es gestionada por el proceso k3s y debe ser root:root.

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

Resultado: PASS

Auditoría:

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

Resultado esperado: los permisos son 600, se esperaba 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/k3s/server/cred/admin.kubeconfig

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

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /var/lib/rancher/k3s/server/cred/admin.kubeconfig; then stat -c %U:%G /var/lib/rancher/k3s/server/cred/admin.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 el nodo del plano de control. Por ejemplo, chown root:root /var/lib/rancher/k3s/server/cred/admin.kubeconfig

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

Resultado: PASS

Auditoría:

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

Resultado esperado: los permisos son 600, se esperaba 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/k3s/server/cred/scheduler.kubeconfig

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

Resultado: PASS

Auditoría:

/bin/sh -c 'if test -e /var/lib/rancher/k3s/server/cred/scheduler.kubeconfig; then stat -c %U:%G /var/lib/rancher/k3s/server/cred/scheduler.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 el nodo del plano de control. Por ejemplo, chown root:root /var/lib/rancher/k3s/server/cred/scheduler.kubeconfig

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

Resultado: PASS

Auditoría:

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

Resultado esperado: los permisos son 600, se esperaba 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/k3s/server/cred/controller.kubeconfig

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

Resultado: PASS

Auditoría:

stat -c %U:%G /var/lib/rancher/k3s/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 del plano de control. Por ejemplo, chown root:root /var/lib/rancher/k3s/server/cred/controller.kubeconfig

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

Resultado: PASS

Auditoría:

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

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 -R root:root /var/lib/rancher/k3s/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:

/bin/sh -c 'stat -c permissions=%a /var/lib/rancher/k3s/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 maestro. Por ejemplo, chmod -R 644 /var/lib/rancher/k3s/server/tls/*.crt Por defecto, k3s 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 en 600 (Automatizado)

Resultado: PASS

Auditoría:

/bin/sh -c 'stat -c permissions=%a /var/lib/rancher/k3s/server/tls/*.key'

Resultado esperado: los permisos son 600, se esperaba 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 maestro. Por ejemplo, chmod -R 600 /var/lib/rancher/k3s/server/tls/*.key

1.2 Servidor API

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

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'anonymous-auth'

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

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

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

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

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Sigue la documentación y configura mecanismos alternativos para la autenticación. Si esta comprobación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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)

Remediación: Por defecto, K3s no configura DenyServiceExternalIPs. Para habilitar esta opción, edita el archivo de configuración de K3s /etc/rancher/k3s/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:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Por defecto, K3s proporciona automáticamente el certificado y la clave del cliente kubelet. Se generan y se encuentran en /var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt y /var/lib/rancher/k3s/server/tls/client-kube-apiserver.key. Si por alguna razón necesitas proporcionar tu propio certificado y clave, puedes configurar los parámetros a continuación en el archivo de configuración de K3s /etc/rancher/k3s/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:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'kubelet-certificate-authority'

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Por defecto, K3s proporciona automáticamente el archivo de certificado CA del kubelet, en /var/lib/rancher/k3s/server/tls/server-ca.crt. Si por alguna razón necesitas proporcionar tu propio certificado CA, considera usar la herramienta shell de certificados de k3s. Si esta comprobación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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 en AlwaysAllow (Automatizado)

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'authorization-mode'

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Por defecto, K3s no configura el --authorization-mode en AlwaysAllow. Si esta comprobación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'authorization-mode'

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

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

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

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'authorization-mode'

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Por defecto, K3s establece el --authorization-mode en Node y RBAC. Si esta verificación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/config.yaml. Asegúrate de que no estás sobrescribiendo 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 K3s /etc/rancher/k3s/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:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'enable-admission-plugins'

Resultado Esperado: '--enable-admission-plugins' no tiene 'AlwaysAdmit' O '--enable-admission-plugins' no está presente

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Por defecto, K3s no establece el --enable-admission-plugins en AlwaysAdmit. Si esta comprobación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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 pre-cargadas 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 K3s /etc/rancher/k3s/config.yaml y establece el parámetro a continuación.

kube-apiserver-arg:
  - "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:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1

Resultado Esperado: '--disable-admission-plugins' está presente o '--disable-admission-plugins' no está presente

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Por defecto, K3s no establece el --disable-admission-plugins en nada. Sigue la documentación y crea objetos ServiceAccount según tu entorno. Si esta comprobación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1

Resultado Esperado: '--disable-admission-plugins' está presente o '--disable-admission-plugins' no está presente

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Por defecto, K3s no establece el --disable-admission-plugins en nada. Si esta comprobación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'enable-admission-plugins'

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Por defecto, K3s establece el --enable-admission-plugins en NodeRestriction. Si utilizas el archivo de configuración de K3s /etc/rancher/k3s/config.yaml, verifica 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é configurado en false (Automatizado)

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'profiling'

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Por defecto, K3s establece el argumento --profiling en false. Si esta comprobación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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é configurado (Manual)

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Edita el archivo de configuración de K3s /etc/rancher/k3s/config.yaml y establece el parámetro audit-log-path en una vía y archivo adecuados donde te gustaría que se escribieran los registros de auditoría, por ejemplo,

kube-apiserver-arg:
  - "audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log"

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

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Edita el archivo de configuración de K3s /etc/rancher/k3s/config.yaml en el nodo del plano de control y establece el parámetro audit-log-maxage en 30 o en un número de días adecuado, por ejemplo,

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

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

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Edita el archivo de configuración de K3s /etc/rancher/k3s/config.yaml en el nodo del plano de control y establece el parámetro audit-log-maxbackup en 10 o en un valor adecuado. Por ejemplo,

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

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

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Edita el archivo de configuración de K3s /etc/rancher/k3s/config.yaml en el nodo del plano de control y establece el parámetro audit-log-maxsize a un tamaño apropiado en MB. Por ejemplo,

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

1.2.20 Asegúrate de que el argumento --request-timeout esté configurado de manera apropiada (Manual)

Resultado: WARN (ADVERTENCIA)

Remediación: Permisivo, según las directrices de CIS, "se recomienda establecer este límite de manera apropiada y cambiar el límite predeterminado de 60 segundos solo si es necesario". Edita el archivo de configuración de K3s /etc/rancher/k3s/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é configurado en verdadero (Automatizado)

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Por defecto, K3s no establece el argumento --service-account-lookup. Edita el archivo de configuración de K3s /etc/rancher/k3s/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 de modo que se aplique el valor predeterminado.

1.2.22 Asegúrate de que el argumento --service-account-key-file esté configurado de manera apropiada (Automatizado)

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

K3s genera y establece automáticamente el archivo de clave de la cuenta de servicio. Se encuentra en /var/lib/rancher/k3s/server/tls/service.key. Si esta comprobación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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 configurados de manera apropiada (Automatizado)

Resultado: PASS

Auditoría:

if [ "$(journalctl -m -u k3s | grep -m1 'Managed etcd cluster' | wc -l)" -gt 0 ]; then
  journalctl -m -u k3s | grep  -m1 'Running kube-apiserver' | tail -n1
else
  echo "--etcd-certfile AND --etcd-keyfile"
fi

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

K3s genera y establece automáticamente los archivos de certificado y clave de etcd. Se encuentran en /var/lib/rancher/k3s/server/tls/etcd/client.crt y /var/lib/rancher/k3s/server/tls/etcd/client.key. Si esta comprobación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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 configurados de manera apropiada (Automatizado)

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep -A1 'Running kube-apiserver' | tail -n2

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-scheduler --authentication-kubeconfig=/var/lib/rancher/k3s/server/cred/scheduler.kubeconfig --authorization-kubeconfig=/var/lib/rancher/k3s/server/cred/scheduler.kubeconfig --bind-address=127.0.0.1 --kubeconfig=/var/lib/rancher/k3s/server/cred/scheduler.kubeconfig --profiling=false --secure-port=10259 --tls-cert-file=/var/lib/rancher/k3s/server/tls/kube-scheduler/kube-scheduler.crt --tls-private-key-file=/var/lib/rancher/k3s/server/tls/kube-scheduler/kube-scheduler.key"
Remediación:

Por defecto, K3s genera y proporciona automáticamente el certificado TLS y la clave privada para el apiserver. Se generan y se encuentran en /var/lib/rancher/k3s/server/tls/serving-kube-apiserver.crt y /var/lib/rancher/k3s/server/tls/serving-kube-apiserver.key
Si esta comprobación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'client-ca-file'

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Por defecto, K3s proporciona automáticamente el archivo de autoridad del certificado del cliente. Se genera y se encuentra en /var/lib/rancher/k3s/server/tls/client-ca.crt. Si por alguna razón necesitas proporcionar tu propio certificado CA, considera usar las herramientas shell de k3s. Si esta comprobación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'etcd-cafile'

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Por defecto, K3s proporciona automáticamente el archivo de autoridad del certificado etcd. Se genera y se encuentra en /var/lib/rancher/k3s/server/tls/client-ca.crt. Si por alguna razón necesitas proporcionar tu propio certificado CA, considera usar la herramienta shell de certificados de k3s. Si esta comprobación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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é configurado adecuadamente (Manual)

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'encryption-provider-config'

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

K3s se puede configurar para utilizar proveedores de cifrado para cifrar secretos en reposo. Edita el archivo de configuración de K3s /etc/rancher/k3s/config.yaml en el nodo del plano de control y establece el siguiente parámetro. secrets-encryption: true. El cifrado de secretos se puede gestionar luego con la herramienta shell k3s secrets-encrypt. Si es necesario, puedes encontrar la configuración de cifrado generada en /var/lib/rancher/k3s/server/cred/encryption-config.json.

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

Resultado: PASS

Auditoría:

ENCRYPTION_PROVIDER_CONFIG=$(journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | 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
Remediación:

K3s se puede configurar para utilizar proveedores de cifrado para cifrar secretos en reposo. K3s utilizará el proveedor aescbc. Edita el archivo de configuración de K3s /etc/rancher/k3s/config.yaml en el nodo del plano de control y establece el siguiente parámetro. secrets-encryption: true. El cifrado de secretos se puede gestionar luego con la herramienta shell k3s secrets-encrypt. Si es necesario, puedes encontrar la configuración de cifrado generada en /var/lib/rancher/k3s/server/cred/encryption-config.json.

1.2.29 Asegúrate de que el API Server solo utilice cifrados criptográficos fuertes (Automatizado)

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'tls-cipher-suites'

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:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Por defecto, el kube-apiserver de K3s 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 de TLS antes de aplicarla en despliegues de producción. Si se requiere una configuración de 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 alrededor de tls-cipher-suites o actualiza el archivo /etc/rancher/k3s/config.yaml para que coincida con la configuración 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:

journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'service-account-extend-token-expiration'

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Edita el archivo de configuración de K3s /etc/rancher/k3s/config.yaml y establece el parámetro --service-account-extend-token-expiration en false antes de recargar k3s, como se muestra a continuación: kube-apiserver-arg: - "service-account-extend-token-expiration=false" Por defecto, este parámetro está configurado en true.

1.3 Administrador de Controladores

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

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-controller-manager' | tail -n1 | grep 'terminated-pod-gc-threshold'

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-controller-manager --allocate-node-cidrs=true --authentication-kubeconfig=/var/lib/rancher/k3s/server/cred/controller.kubeconfig --authorization-kubeconfig=/var/lib/rancher/k3s/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/k3s/server/tls/client-ca.nochain.crt --cluster-signing-kube-apiserver-client-key-file=/var/lib/rancher/k3s/server/tls/client-ca.key --cluster-signing-kubelet-client-cert-file=/var/lib/rancher/k3s/server/tls/client-ca.nochain.crt --cluster-signing-kubelet-client-key-file=/var/lib/rancher/k3s/server/tls/client-ca.key --cluster-signing-kubelet-serving-cert-file=/var/lib/rancher/k3s/server/tls/server-ca.nochain.crt --cluster-signing-kubelet-serving-key-file=/var/lib/rancher/k3s/server/tls/server-ca.key --cluster-signing-legacy-unknown-cert-file=/var/lib/rancher/k3s/server/tls/server-ca.nochain.crt --cluster-signing-legacy-unknown-key-file=/var/lib/rancher/k3s/server/tls/server-ca.key --configure-cloud-routes=false --controllers=*,tokencleaner,-service,-route,-cloud-node-lifecycle --kubeconfig=/var/lib/rancher/k3s/server/cred/controller.kubeconfig --profiling=false --root-ca-file=/var/lib/rancher/k3s/server/tls/server-ca.crt --secure-port=10257 --service-account-private-key-file=/var/lib/rancher/k3s/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --terminated-pod-gc-threshold=10 --tls-cert-file=/var/lib/rancher/k3s/server/tls/kube-controller-manager/kube-controller-manager.crt --tls-private-key-file=/var/lib/rancher/k3s/server/tls/kube-controller-manager/kube-controller-manager.key --use-service-account-credentials=true"
Remediación:

Edita el archivo de configuración de K3s /etc/rancher/k3s/config.yaml en el nodo del plano de control y establece el --terminated-pod-gc-threshold en un umbral apropiado,

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

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

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-controller-manager' | tail -n1 | grep 'profiling'

Auditoría:
Resultado Esperado: '--profiling' es igual a 'false'

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-controller-manager --allocate-node-cidrs=true --authentication-kubeconfig=/var/lib/rancher/k3s/server/cred/controller.kubeconfig --authorization-kubeconfig=/var/lib/rancher/k3s/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/k3s/server/tls/client-ca.nochain.crt --cluster-signing-kube-apiserver-client-key-file=/var/lib/rancher/k3s/server/tls/client-ca.key --cluster-signing-kubelet-client-cert-file=/var/lib/rancher/k3s/server/tls/client-ca.nochain.crt --cluster-signing-kubelet-client-key-file=/var/lib/rancher/k3s/server/tls/client-ca.key --cluster-signing-kubelet-serving-cert-file=/var/lib/rancher/k3s/server/tls/server-ca.nochain.crt --cluster-signing-kubelet-serving-key-file=/var/lib/rancher/k3s/server/tls/server-ca.key --cluster-signing-legacy-unknown-cert-file=/var/lib/rancher/k3s/server/tls/server-ca.nochain.crt --cluster-signing-legacy-unknown-key-file=/var/lib/rancher/k3s/server/tls/server-ca.key --configure-cloud-routes=false --controllers=*,tokencleaner,-service,-route,-cloud-node-lifecycle --kubeconfig=/var/lib/rancher/k3s/server/cred/controller.kubeconfig --profiling=false --root-ca-file=/var/lib/rancher/k3s/server/tls/server-ca.crt --secure-port=10257 --service-account-private-key-file=/var/lib/rancher/k3s/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --terminated-pod-gc-threshold=10 --tls-cert-file=/var/lib/rancher/k3s/server/tls/kube-controller-manager/kube-controller-manager.crt --tls-private-key-file=/var/lib/rancher/k3s/server/tls/kube-controller-manager/kube-controller-manager.key --use-service-account-credentials=true"
Remediación:

Por defecto, K3s establece el argumento --profiling en false. Si esta comprobación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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 true (Automatizado)

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-controller-manager' | tail -n1 | grep 'use-service-account-credentials'

Auditoría:
Resultado Esperado: '--use-service-account-credentials' no es igual a 'false'

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-controller-manager --allocate-node-cidrs=true --authentication-kubeconfig=/var/lib/rancher/k3s/server/cred/controller.kubeconfig --authorization-kubeconfig=/var/lib/rancher/k3s/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/k3s/server/tls/client-ca.nochain.crt --cluster-signing-kube-apiserver-client-key-file=/var/lib/rancher/k3s/server/tls/client-ca.key --cluster-signing-kubelet-client-cert-file=/var/lib/rancher/k3s/server/tls/client-ca.nochain.crt --cluster-signing-kubelet-client-key-file=/var/lib/rancher/k3s/server/tls/client-ca.key --cluster-signing-kubelet-serving-cert-file=/var/lib/rancher/k3s/server/tls/server-ca.nochain.crt --cluster-signing-kubelet-serving-key-file=/var/lib/rancher/k3s/server/tls/server-ca.key --cluster-signing-legacy-unknown-cert-file=/var/lib/rancher/k3s/server/tls/server-ca.nochain.crt --cluster-signing-legacy-unknown-key-file=/var/lib/rancher/k3s/server/tls/server-ca.key --configure-cloud-routes=false --controllers=*,tokencleaner,-service,-route,-cloud-node-lifecycle --kubeconfig=/var/lib/rancher/k3s/server/cred/controller.kubeconfig --profiling=false --root-ca-file=/var/lib/rancher/k3s/server/tls/server-ca.crt --secure-port=10257 --service-account-private-key-file=/var/lib/rancher/k3s/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --terminated-pod-gc-threshold=10 --tls-cert-file=/var/lib/rancher/k3s/server/tls/kube-controller-manager/kube-controller-manager.crt --tls-private-key-file=/var/lib/rancher/k3s/server/tls/kube-controller-manager/kube-controller-manager.key --use-service-account-credentials=true"
Remediación:

Por defecto, K3s establece el argumento --use-service-account-credentials en true. Si esta comprobación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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 de manera apropiada (Automatizado)

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-controller-manager' | tail -n1 | grep 'service-account-private-key-file'

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-controller-manager --allocate-node-cidrs=true --authentication-kubeconfig=/var/lib/rancher/k3s/server/cred/controller.kubeconfig --authorization-kubeconfig=/var/lib/rancher/k3s/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/k3s/server/tls/client-ca.nochain.crt --cluster-signing-kube-apiserver-client-key-file=/var/lib/rancher/k3s/server/tls/client-ca.key --cluster-signing-kubelet-client-cert-file=/var/lib/rancher/k3s/server/tls/client-ca.nochain.crt --cluster-signing-kubelet-client-key-file=/var/lib/rancher/k3s/server/tls/client-ca.key --cluster-signing-kubelet-serving-cert-file=/var/lib/rancher/k3s/server/tls/server-ca.nochain.crt --cluster-signing-kubelet-serving-key-file=/var/lib/rancher/k3s/server/tls/server-ca.key --cluster-signing-legacy-unknown-cert-file=/var/lib/rancher/k3s/server/tls/server-ca.nochain.crt --cluster-signing-legacy-unknown-key-file=/var/lib/rancher/k3s/server/tls/server-ca.key --configure-cloud-routes=false --controllers=*,tokencleaner,-service,-route,-cloud-node-lifecycle --kubeconfig=/var/lib/rancher/k3s/server/cred/controller.kubeconfig --profiling=false --root-ca-file=/var/lib/rancher/k3s/server/tls/server-ca.crt --secure-port=10257 --service-account-private-key-file=/var/lib/rancher/k3s/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --terminated-pod-gc-threshold=10 --tls-cert-file=/var/lib/rancher/k3s/server/tls/kube-controller-manager/kube-controller-manager.crt --tls-private-key-file=/var/lib/rancher/k3s/server/tls/kube-controller-manager/kube-controller-manager.key --use-service-account-credentials=true"
Remediación:

Por defecto, K3s proporciona automáticamente el archivo de clave privada de la cuenta de servicio. Se genera y se encuentra en /var/lib/rancher/k3s/server/tls/service.current.key. Si esta verificación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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:

journalctl -m -u k3s | grep 'Running kube-controller-manager' | tail -n1 | grep 'root-ca-file'

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

Valor Devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-controller-manager --allocate-node-cidrs=true --authentication-kubeconfig=/var/lib/rancher/k3s/server/cred/controller.kubeconfig --authorization-kubeconfig=/var/lib/rancher/k3s/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/k3s/server/tls/client-ca.nochain.crt --cluster-signing-kube-apiserver-client-key-file=/var/lib/rancher/k3s/server/tls/client-ca.key --cluster-signing-kubelet-client-cert-file=/var/lib/rancher/k3s/server/tls/client-ca.nochain.crt --cluster-signing-kubelet-client-key-file=/var/lib/rancher/k3s/server/tls/client-ca.key --cluster-signing-kubelet-serving-cert-file=/var/lib/rancher/k3s/server/tls/server-ca.nochain.crt --cluster-signing-kubelet-serving-key-file=/var/lib/rancher/k3s/server/tls/server-ca.key --cluster-signing-legacy-unknown-cert-file=/var/lib/rancher/k3s/server/tls/server-ca.nochain.crt --cluster-signing-legacy-unknown-key-file=/var/lib/rancher/k3s/server/tls/server-ca.key --configure-cloud-routes=false --controllers=*,tokencleaner,-service,-route,-cloud-node-lifecycle --kubeconfig=/var/lib/rancher/k3s/server/cred/controller.kubeconfig --profiling=false --root-ca-file=/var/lib/rancher/k3s/server/tls/server-ca.crt --secure-port=10257 --service-account-private-key-file=/var/lib/rancher/k3s/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --terminated-pod-gc-threshold=10 --tls-cert-file=/var/lib/rancher/k3s/server/tls/kube-controller-manager/kube-controller-manager.crt --tls-private-key-file=/var/lib/rancher/k3s/server/tls/kube-controller-manager/kube-controller-manager.key --use-service-account-credentials=true"
Remediación:

Por defecto, K3s proporciona automáticamente el archivo CA raíz. Se genera y se encuentra en /var/lib/rancher/k3s/server/tls/server-ca.crt. Si por alguna razón necesitas proporcionar tu propio certificado CA, considera usar la herramienta de línea de comandos de certificados de k3s. Si esta verificación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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 true (Automatizado)

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-controller-manager' | tail -n1

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

Valor Devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-controller-manager --allocate-node-cidrs=true --authentication-kubeconfig=/var/lib/rancher/k3s/server/cred/controller.kubeconfig --authorization-kubeconfig=/var/lib/rancher/k3s/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/k3s/server/tls/client-ca.nochain.crt --cluster-signing-kube-apiserver-client-key-file=/var/lib/rancher/k3s/server/tls/client-ca.key --cluster-signing-kubelet-client-cert-file=/var/lib/rancher/k3s/server/tls/client-ca.nochain.crt --cluster-signing-kubelet-client-key-file=/var/lib/rancher/k3s/server/tls/client-ca.key --cluster-signing-kubelet-serving-cert-file=/var/lib/rancher/k3s/server/tls/server-ca.nochain.crt --cluster-signing-kubelet-serving-key-file=/var/lib/rancher/k3s/server/tls/server-ca.key --cluster-signing-legacy-unknown-cert-file=/var/lib/rancher/k3s/server/tls/server-ca.nochain.crt --cluster-signing-legacy-unknown-key-file=/var/lib/rancher/k3s/server/tls/server-ca.key --configure-cloud-routes=false --controllers=*,tokencleaner,-service,-route,-cloud-node-lifecycle --kubeconfig=/var/lib/rancher/k3s/server/cred/controller.kubeconfig --profiling=false --root-ca-file=/var/lib/rancher/k3s/server/tls/server-ca.crt --secure-port=10257 --service-account-private-key-file=/var/lib/rancher/k3s/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --terminated-pod-gc-threshold=10 --tls-cert-file=/var/lib/rancher/k3s/server/tls/kube-controller-manager/kube-controller-manager.crt --tls-private-key-file=/var/lib/rancher/k3s/server/tls/kube-controller-manager/kube-controller-manager.key --use-service-account-credentials=true"
Remediación:

Por defecto, K3s no establece la puerta de características RotateKubeletServerCertificate. Si has habilitado esta puerta de características, deberías eliminarla. Si esta verificación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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:

journalctl -m -u k3s | grep 'Running kube-controller-manager' | tail -n1

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

Valor Devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-controller-manager --allocate-node-cidrs=true --authentication-kubeconfig=/var/lib/rancher/k3s/server/cred/controller.kubeconfig --authorization-kubeconfig=/var/lib/rancher/k3s/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/k3s/server/tls/client-ca.nochain.crt --cluster-signing-kube-apiserver-client-key-file=/var/lib/rancher/k3s/server/tls/client-ca.key --cluster-signing-kubelet-client-cert-file=/var/lib/rancher/k3s/server/tls/client-ca.nochain.crt --cluster-signing-kubelet-client-key-file=/var/lib/rancher/k3s/server/tls/client-ca.key --cluster-signing-kubelet-serving-cert-file=/var/lib/rancher/k3s/server/tls/server-ca.nochain.crt --cluster-signing-kubelet-serving-key-file=/var/lib/rancher/k3s/server/tls/server-ca.key --cluster-signing-legacy-unknown-cert-file=/var/lib/rancher/k3s/server/tls/server-ca.nochain.crt --cluster-signing-legacy-unknown-key-file=/var/lib/rancher/k3s/server/tls/server-ca.key --configure-cloud-routes=false --controllers=*,tokencleaner,-service,-route,-cloud-node-lifecycle --kubeconfig=/var/lib/rancher/k3s/server/cred/controller.kubeconfig --profiling=false --root-ca-file=/var/lib/rancher/k3s/server/tls/server-ca.crt --secure-port=10257 --service-account-private-key-file=/var/lib/rancher/k3s/server/tls/service.current.key --service-cluster-ip-range=10.43.0.0/16 --terminated-pod-gc-threshold=10 --tls-cert-file=/var/lib/rancher/k3s/server/tls/kube-controller-manager/kube-controller-manager.crt --tls-private-key-file=/var/lib/rancher/k3s/server/tls/kube-controller-manager/kube-controller-manager.key --use-service-account-credentials=true"
Remediación:

Por defecto, K3s establece el argumento --bind-address en 127.0.0.1. Si esta verificación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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 false (Automatizado)

Resultado: PASS

Auditoría:

journalctl -m -u k3s | grep 'Running kube-scheduler' | tail -n1 | grep 'profiling'

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

Valor Devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-scheduler --authentication-kubeconfig=/var/lib/rancher/k3s/server/cred/scheduler.kubeconfig --authorization-kubeconfig=/var/lib/rancher/k3s/server/cred/scheduler.kubeconfig --bind-address=127.0.0.1 --kubeconfig=/var/lib/rancher/k3s/server/cred/scheduler.kubeconfig --profiling=false --secure-port=10259 --tls-cert-file=/var/lib/rancher/k3s/server/tls/kube-scheduler/kube-scheduler.crt --tls-private-key-file=/var/lib/rancher/k3s/server/tls/kube-scheduler/kube-scheduler.key"
Remediación:

Por defecto, K3s establece el argumento --profiling en false. Si esta verificación falla, edita el archivo de configuración de K3s /etc/rancher/k3s/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:

journalctl -m -u k3s | grep 'Running kube-scheduler' | tail -n1 | grep 'bind-address'

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

Valor Devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-scheduler --authentication-kubeconfig=/var/lib/rancher/k3s/server/cred/scheduler.kubeconfig --authorization-kubeconfig=/var/lib/rancher/k3s/server/cred/scheduler.kubeconfig --bind-address=127.0.0.1 --kubeconfig=/var/lib/rancher/k3s/server/cred/scheduler.kubeconfig --profiling=false --secure-port=10259 --tls-cert-file=/var/lib/rancher/k3s/server/tls/kube-scheduler/kube-scheduler.crt --tls-private-key-file=/var/lib/rancher/k3s/server/tls/kube-scheduler/kube-scheduler.key"
Remediación:

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

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

2 Configuración del nodo Etcd

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

Resultado: PASS

Auditoría:

Resultado Esperado: '.client-transport-security.cert-file' es igual a '/var/lib/rancher/k3s/server/tls/etcd/server-client.crt' Y '.client-transport-security.key-file' es igual a '/var/lib/rancher/k3s/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/k3s/server/tls/etcd/server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/k3s/server/tls/etcd/server-client.key
  trusted-ca-file: /var/lib/rancher/k3s/server/tls/etcd/server-ca.crt
data-dir: /var/lib/rancher/k3s/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-82b8dedf=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-82b8dedf
peer-transport-security:
  cert-file: /var/lib/rancher/k3s/server/tls/etcd/peer-server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/k3s/server/tls/etcd/peer-server-client.key
  trusted-ca-file: /var/lib/rancher/k3s/server/tls/etcd/peer-ca.crt
snapshot-count: 10000
socket-options:
  reuse-address: true
  reuse-port: true
Remediación:

Si se ejecuta con sqlite o una base de datos externa, las comprobaciones de etcd no son aplicables. Al ejecutarse con embedded-etcd, K3s genera archivos de certificado y clave para etcd. Estos se encuentran en /var/lib/rancher/k3s/server/tls/etcd/. Si esta comprobación falla, asegúrate de que el archivo de configuración /var/lib/rancher/k3s/server/db/etcd/config no haya 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 (Manual)

Resultado: PASS

Auditoría:

Resultado Esperado: '.client-transport-security.client-cert-auth' es igual a 'true'

Valor Devuelto:
advertise-client-urls: https://10.10.10.100:2379
client-transport-security:
  cert-file: /var/lib/rancher/k3s/server/tls/etcd/server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/k3s/server/tls/etcd/server-client.key
  trusted-ca-file: /var/lib/rancher/k3s/server/tls/etcd/server-ca.crt
data-dir: /var/lib/rancher/k3s/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-82b8dedf=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-82b8dedf
peer-transport-security:
  cert-file: /var/lib/rancher/k3s/server/tls/etcd/peer-server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/k3s/server/tls/etcd/peer-server-client.key
  trusted-ca-file: /var/lib/rancher/k3s/server/tls/etcd/peer-ca.crt
snapshot-count: 10000
socket-options:
  reuse-address: true
  reuse-port: true
Remediación:

Si se ejecuta con sqlite o una base de datos externa, las comprobaciones de etcd no son aplicables. Al ejecutarse con embedded-etcd, K3s establece el parámetro --client-cert-auth en true. Si esta comprobación falla, asegúrate de que el archivo de configuración /var/lib/rancher/k3s/server/db/etcd/config no haya 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 (Manual)

Resultado: PASS

Auditoría:

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

Valor Devuelto:
advertise-client-urls: https://10.10.10.100:2379
client-transport-security:
  cert-file: /var/lib/rancher/k3s/server/tls/etcd/server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/k3s/server/tls/etcd/server-client.key
  trusted-ca-file: /var/lib/rancher/k3s/server/tls/etcd/server-ca.crt
data-dir: /var/lib/rancher/k3s/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-82b8dedf=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-82b8dedf
peer-transport-security:
  cert-file: /var/lib/rancher/k3s/server/tls/etcd/peer-server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/k3s/server/tls/etcd/peer-server-client.key
  trusted-ca-file: /var/lib/rancher/k3s/server/tls/etcd/peer-ca.crt
snapshot-count: 10000
socket-options:
  reuse-address: true
  reuse-port: true
Remediación:

Si se ejecuta con sqlite o una base de datos externa, las comprobaciones de etcd no son aplicables. Al ejecutarse con embedded-etcd, K3s no establece el parámetro --auto-tls. Si esta comprobación falla, edita el archivo de especificación del pod etcd /var/lib/rancher/k3s/server/db/etcd/config en el nodo maestro y elimina el parámetro --auto-tls o configúralo en false. client-transport-security: auto-tls: false

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

Resultado: PASS

Auditoría:

Resultado Esperado: '.peer-transport-security.cert-file' es igual a '/var/lib/rancher/k3s/server/tls/etcd/peer-server-client.crt' Y '.peer-transport-security.key-file' es igual a '/var/lib/rancher/k3s/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/k3s/server/tls/etcd/server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/k3s/server/tls/etcd/server-client.key
  trusted-ca-file: /var/lib/rancher/k3s/server/tls/etcd/server-ca.crt
data-dir: /var/lib/rancher/k3s/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-82b8dedf=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-82b8dedf
peer-transport-security:
  cert-file: /var/lib/rancher/k3s/server/tls/etcd/peer-server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/k3s/server/tls/etcd/peer-server-client.key
  trusted-ca-file: /var/lib/rancher/k3s/server/tls/etcd/peer-ca.crt
snapshot-count: 10000
socket-options:
  reuse-address: true
  reuse-port: true
Remediación:

Si se ejecuta con sqlite o una base de datos externa, las comprobaciones de etcd no son aplicables. Al ejecutarse con embedded-etcd, K3s genera archivos de certificado y de clave para pares en etcd. Estos se encuentran en /var/lib/rancher/k3s/server/tls/etcd/. Si esta verificación falla, asegúrate de que el archivo de configuración /var/lib/rancher/k3s/server/db/etcd/config no haya sido modificado para usar archivos de certificado y clave de pares personalizados.

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

Resultado: PASS

Auditoría:

Resultado Esperado: '.peer-transport-security.client-cert-auth' es igual a 'true'

Valor Devuelto:
advertise-client-urls: https://10.10.10.100:2379
client-transport-security:
  cert-file: /var/lib/rancher/k3s/server/tls/etcd/server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/k3s/server/tls/etcd/server-client.key
  trusted-ca-file: /var/lib/rancher/k3s/server/tls/etcd/server-ca.crt
data-dir: /var/lib/rancher/k3s/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-82b8dedf=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-82b8dedf
peer-transport-security:
  cert-file: /var/lib/rancher/k3s/server/tls/etcd/peer-server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/k3s/server/tls/etcd/peer-server-client.key
  trusted-ca-file: /var/lib/rancher/k3s/server/tls/etcd/peer-ca.crt
snapshot-count: 10000
socket-options:
  reuse-address: true
  reuse-port: true
Remediación:

Si se ejecuta con sqlite o una base de datos externa, las comprobaciones de etcd no son aplicables. Al ejecutarse con embedded-etcd, K3s establece el parámetro --peer-cert-auth en true. Si esta verificación falla, asegúrate de que el archivo de configuración /var/lib/rancher/k3s/server/db/etcd/config no haya sido modificado para deshabilitar la autenticación del certificado del cliente de pares.

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

Resultado: PASS

Auditoría:

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

Valor Devuelto:
advertise-client-urls: https://10.10.10.100:2379
client-transport-security:
  cert-file: /var/lib/rancher/k3s/server/tls/etcd/server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/k3s/server/tls/etcd/server-client.key
  trusted-ca-file: /var/lib/rancher/k3s/server/tls/etcd/server-ca.crt
data-dir: /var/lib/rancher/k3s/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-82b8dedf=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-82b8dedf
peer-transport-security:
  cert-file: /var/lib/rancher/k3s/server/tls/etcd/peer-server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/k3s/server/tls/etcd/peer-server-client.key
  trusted-ca-file: /var/lib/rancher/k3s/server/tls/etcd/peer-ca.crt
snapshot-count: 10000
socket-options:
  reuse-address: true
  reuse-port: true
Remediación:

Si se ejecuta con sqlite o una base de datos externa, las comprobaciones de etcd no son aplicables. Al ejecutarse con embedded-etcd, K3s no establece el parámetro --peer-auto-tls. Si esta verificación falla, edita el archivo de especificación del pod etcd /var/lib/rancher/k3s/server/db/etcd/config en el nodo maestro y elimina el parámetro --peer-auto-tls o configúralo en false. peer-transport-security: auto-tls: false

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

Resultado: PASS

Auditoría:

Resultado Esperado: '.peer-transport-security.trusted-ca-file' es igual a '/var/lib/rancher/k3s/server/tls/etcd/peer-ca.crt'

Valor Devuelto:
advertise-client-urls: https://10.10.10.100:2379
client-transport-security:
  cert-file: /var/lib/rancher/k3s/server/tls/etcd/server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/k3s/server/tls/etcd/server-client.key
  trusted-ca-file: /var/lib/rancher/k3s/server/tls/etcd/server-ca.crt
data-dir: /var/lib/rancher/k3s/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-82b8dedf=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-82b8dedf
peer-transport-security:
  cert-file: /var/lib/rancher/k3s/server/tls/etcd/peer-server-client.crt
  client-cert-auth: true
  key-file: /var/lib/rancher/k3s/server/tls/etcd/peer-server-client.key
  trusted-ca-file: /var/lib/rancher/k3s/server/tls/etcd/peer-ca.crt
snapshot-count: 10000
socket-options:
  reuse-address: true
  reuse-port: true
Remediación:

Si se ejecuta con sqlite o una base de datos externa, las comprobaciones de etcd no son aplicables. Al ejecutar con etcd embebido, K3s genera una autoridad de certificación única para etcd. Esto se encuentra en /var/lib/rancher/k3s/server/tls/etcd/peer-ca.crt. Si esta verificación falla, asegúrate de que el archivo de configuración /var/lib/rancher/k3s/server/db/etcd/config no haya sido modificado para usar una autoridad de certificación compartida.

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

Razonamiento:

El kubelet está embebido en el proceso de k3s. 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 en root:root (Automatizado)

Resultado: No corresponde

Razonamiento:

El kubelet está embebido en el proceso de k3s. No hay un archivo de servicio kubelet, toda la configuración se pasa como argumentos en tiempo de ejecución.

All configuration is passed in as arguments at container run time.

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/k3s/agent/kubeproxy.kubeconfig; then stat -c permissions=%a /var/lib/rancher/k3s/agent/kubeproxy.kubeconfig; fi'

Resultado Esperado: los permisos tienen permisos 600, se esperaba 600 o más restrictivos

Valor Devuelto:
permissions=600
Remediación:

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

4.1.4 Si existe el archivo kubeconfig del 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/k3s/agent/kubeproxy.kubeconfig; then stat -c %U:%G /var/lib/rancher/k3s/agent/kubeproxy.kubeconfig; fi'

Resultado Esperado: 'root:root' está presente

Valor Devuelto:
root:root
Remediación:

Ejecute el siguiente comando (basado en la ubicación del archivo en su sistema) en cada nodo trabajador. Por ejemplo, chown root:root /var/lib/rancher/k3s/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/k3s/agent/kubelet.kubeconfig; then stat -c permissions=%a /var/lib/rancher/k3s/agent/kubelet.kubeconfig; fi'

Resultado Esperado: los permisos tienen permisos 600, se esperaba 600 o más restrictivos

Valor Devuelto:
permissions=600
Remediación:

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

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

Resultado: PASS

Auditoría:

stat -c %U:%G /var/lib/rancher/k3s/agent/kubelet.kubeconfig

Resultado esperado: 'root:root' está presente

Valor Devuelto:
root:root
Remediación:

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

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:

stat -c permissions=%a /var/lib/rancher/k3s/agent/client-ca.crt

Resultado Esperado: los permisos tienen permisos 600, se esperaba 600 o más restrictivos

Valor Devuelto:
permissions=600
Remediación:

Ejecute el siguiente comando para modificar los permisos del archivo del --client-ca-file chmod 600 /var/lib/rancher/k3s/agent/client-ca.crt

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:

stat -c %U:%G /var/lib/rancher/k3s/agent/client-ca.crt

Resultado esperado: 'root:root' es igual a 'root:root'

Valor devuelto:
root:root
Remediación:

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

Asegúrate de que el archivo de configuración --config del kubelet tenga permisos configurados en 600 o más restrictivos (Automatizado).

Resultado: No corresponde

Razonamiento:

El kubelet está embebido en el proceso de k3s. No hay archivo de configuración del kubelet, toda la configuración se pasa como argumentos en tiempo de ejecución.

Asegúrate de que la propiedad del archivo de configuración --config del kubelet esté configurada en root:root (Automatizado).

Resultado: No corresponde

Razonamiento:

El kubelet está embebido en el proceso de k3s. No hay archivo de configuración del kubelet, toda la configuración se pasa como argumentos en tiempo de ejecución.

4.2 Kubelet

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

Resultado: PASS

Auditoría:

/bin/sh -c 'if test $(journalctl -m -u k3s | grep  "Running kube-apiserver" | wc -l) -gt 0; then journalctl -m -u k3s | grep  "Running kube-apiserver" | tail -n1 | grep "anonymous-auth" | grep -v grep; else echo "--anonymous-auth=false"; fi'

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

Valor devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Por defecto, K3s establece el --anonymous-auth en false. Si has establecido esto a un valor diferente, debes volver a configurarlo en false. Si utilizas el archivo de configuración de K3s /etc/rancher/k3s/config.yaml, elimina cualquier línea similar a la siguiente.

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

Si utilizas la línea de comandos, edita el archivo de servicio de K3s y elimina el argumento siguiente.
--kubelet-arg="anonymous-auth=true"
Según tu sistema, reinicia el servicio k3s. Por ejemplo,
systemctl daemon-reload
systemctl restart k3s.service

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

Resultado: PASS

Auditoría:

/bin/sh -c 'if test $(journalctl -m -u k3s | grep  "Running kube-apiserver" | wc -l) -gt 0; then journalctl -m -u k3s | grep  "Running kube-apiserver" | tail -n1 | grep "authorization-mode"; else echo "--authorization-mode=Webhook"; fi'

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

Valor Devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Por defecto, K3s no establece el --authorization-mode en AlwaysAllow. Si utilizas el archivo de configuración de K3s /etc/rancher/k3s/config.yaml, elimina cualquier línea similar a la siguiente.

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

Si utilizas la línea de comandos, edita el archivo de servicio de K3s y elimina el argumento siguiente.
--kubelet-arg="authorization-mode=AlwaysAllow"
Según tu sistema, reinicia el servicio k3s. Por ejemplo,
systemctl daemon-reload
systemctl restart k3s.service

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

Resultado: PASS

Auditoría:

/bin/sh -c 'if test $(journalctl -m -u k3s | grep  "Running kube-apiserver" | wc -l) -gt 0; then journalctl -m -u k3s | grep  "Running kube-apiserver" | tail -n1 | grep "client-ca-file"; else echo "--client-ca-file=/var/lib/rancher/k3s/server/tls/request-header-ca.crt"; fi'

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

Valor Devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kube-apiserver --admission-control-config-file=/var/lib/rancher/k3s/server/psa.yaml --advertise-address=10.10.10.100 --advertise-port=6443 --allow-privileged=true --anonymous-auth=false --api-audiences=https://kubernetes.default.svc.cluster.local,k3s --audit-log-maxage=30 --audit-log-maxbackup=10 --audit-log-maxsize=100 --audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log --audit-policy-file=/var/lib/rancher/k3s/server/audit.yaml --authorization-mode=Node,RBAC --bind-address=127.0.0.1 --cert-dir=/var/lib/rancher/k3s/server/tls/temporary-certs --client-ca-file=/var/lib/rancher/k3s/server/tls/client-ca.crt --egress-selector-config-file=/var/lib/rancher/k3s/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/k3s/server/cred/encryption-config.json --encryption-provider-config-automatic-reload=true --etcd-cafile=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --etcd-certfile=/var/lib/rancher/k3s/server/tls/etcd/client.crt --etcd-keyfile=/var/lib/rancher/k3s/server/tls/etcd/client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-certificate-authority=/var/lib/rancher/k3s/server/tls/server-ca.crt --kubelet-client-certificate=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt --kubelet-client-key=/var/lib/rancher/k3s/server/tls/client-kube-apiserver.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --profiling=false --proxy-client-cert-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt --proxy-client-key-file=/var/lib/rancher/k3s/server/tls/client-auth-proxy.key --requestheader-allowed-names=system:auth-proxy --requestheader-client-ca-file=/var/lib/rancher/k3s/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=6444 --service-account-extend-token-expiration=false --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/var/lib/rancher/k3s/server/tls/service.key --service-account-signing-key-file=/var/lib/rancher/k3s/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/k3s/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/k3s/server/tls/serving-kube-apiserver.key"
Remediación:

Por defecto, K3s proporciona automáticamente el certificado CA del cliente para el Kubelet. Se genera y se encuentra en /var/lib/rancher/k3s/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:

journalctl -m -u k3s -u k3s-agent | grep 'Running kubelet' | tail -n1

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

Valor Devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kubelet --address=0.0.0.0 --allowed-unsafe-sysctls=net.ipv4.ip_forward,net.ipv6.conf.all.forwarding --anonymous-auth=false --authentication-token-webhook=true --authorization-mode=Webhook --cgroup-driver=systemd --client-ca-file=/var/lib/rancher/k3s/agent/client-ca.crt --cloud-provider=external --cluster-dns=10.43.0.10 --cluster-domain=cluster.local --container-runtime-endpoint=unix:///run/k3s/containerd/containerd.sock --containerd=/run/k3s/containerd/containerd.sock --event-qps=0 --eviction-hard=imagefs.available<5%,nodefs.available<5% --eviction-minimum-reclaim=imagefs.available=10%,nodefs.available=10% --fail-swap-on=false --healthz-bind-address=127.0.0.1 --hostname-override=server-0 --kubeconfig=/var/lib/rancher/k3s/agent/kubelet.kubeconfig --make-iptables-util-chains=true --node-ip=10.10.10.100 --node-labels= --pod-manifest-path=/var/lib/rancher/k3s/agent/pod-manifests --protect-kernel-defaults=true --read-only-port=0 --resolv-conf=/run/systemd/resolve/resolv.conf --serialize-image-pulls=false --streaming-connection-idle-timeout=5m --tls-cert-file=/var/lib/rancher/k3s/agent/serving-kubelet.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/k3s/agent/serving-kubelet.key"
Remediación:

Por defecto, K3s establece el --read-only-port en 0. Si has establecido esto a un valor diferente, debes volver a configurarlo en 0. Si utilizas el archivo de configuración de K3s /etc/rancher/k3s/config.yaml, elimina cualquier línea similar a la siguiente.

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

Si utilizas la línea de comandos, edita el archivo de servicio de K3s y elimina el argumento siguiente.
--kubelet-arg="read-only-port=XXXX"
Según tu sistema, reinicia el servicio k3s. Por ejemplo,
systemctl daemon-reload
systemctl restart k3s.service

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

Resultado: PASS

Auditoría:

journalctl -m -u k3s -u k3s-agent | grep 'Running kubelet' | tail -n1

Resultado Esperado: '--streaming-connection-idle-timeout' no es igual a '0' O '--streaming-connection-idle-timeout' no está presente

Valor Devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kubelet --address=0.0.0.0 --allowed-unsafe-sysctls=net.ipv4.ip_forward,net.ipv6.conf.all.forwarding --anonymous-auth=false --authentication-token-webhook=true --authorization-mode=Webhook --cgroup-driver=systemd --client-ca-file=/var/lib/rancher/k3s/agent/client-ca.crt --cloud-provider=external --cluster-dns=10.43.0.10 --cluster-domain=cluster.local --container-runtime-endpoint=unix:///run/k3s/containerd/containerd.sock --containerd=/run/k3s/containerd/containerd.sock --event-qps=0 --eviction-hard=imagefs.available<5%,nodefs.available<5% --eviction-minimum-reclaim=imagefs.available=10%,nodefs.available=10% --fail-swap-on=false --healthz-bind-address=127.0.0.1 --hostname-override=server-0 --kubeconfig=/var/lib/rancher/k3s/agent/kubelet.kubeconfig --make-iptables-util-chains=true --node-ip=10.10.10.100 --node-labels= --pod-manifest-path=/var/lib/rancher/k3s/agent/pod-manifests --protect-kernel-defaults=true --read-only-port=0 --resolv-conf=/run/systemd/resolve/resolv.conf --serialize-image-pulls=false --streaming-connection-idle-timeout=5m --tls-cert-file=/var/lib/rancher/k3s/agent/serving-kubelet.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/k3s/agent/serving-kubelet.key"
Remediación:

Si utilizas el archivo de configuración de K3s /etc/rancher/k3s/config.yaml, establece el siguiente parámetro a un valor apropiado.

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

Si utilizas la línea de comandos, ejecuta K3s con --kubelet-arg="streaming-connection-idle-timeout=5m". Según tu sistema, reinicia el servicio k3s. Por ejemplo, systemctl restart k3s.service

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

Resultado: PASS

Auditoría:

journalctl -m -u k3s -u k3s-agent | grep 'Running kubelet' | tail -n1

Resultado Esperado: '--make-iptables-util-chains' es igual a 'verdadero' o '--make-iptables-util-chains' no está presente

Valor Devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kubelet --address=0.0.0.0 --allowed-unsafe-sysctls=net.ipv4.ip_forward,net.ipv6.conf.all.forwarding --anonymous-auth=false --authentication-token-webhook=true --authorization-mode=Webhook --cgroup-driver=systemd --client-ca-file=/var/lib/rancher/k3s/agent/client-ca.crt --cloud-provider=external --cluster-dns=10.43.0.10 --cluster-domain=cluster.local --container-runtime-endpoint=unix:///run/k3s/containerd/containerd.sock --containerd=/run/k3s/containerd/containerd.sock --event-qps=0 --eviction-hard=imagefs.available<5%,nodefs.available<5% --eviction-minimum-reclaim=imagefs.available=10%,nodefs.available=10% --fail-swap-on=false --healthz-bind-address=127.0.0.1 --hostname-override=server-0 --kubeconfig=/var/lib/rancher/k3s/agent/kubelet.kubeconfig --make-iptables-util-chains=true --node-ip=10.10.10.100 --node-labels= --pod-manifest-path=/var/lib/rancher/k3s/agent/pod-manifests --protect-kernel-defaults=true --read-only-port=0 --resolv-conf=/run/systemd/resolve/resolv.conf --serialize-image-pulls=false --streaming-connection-idle-timeout=5m --tls-cert-file=/var/lib/rancher/k3s/agent/serving-kubelet.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/k3s/agent/serving-kubelet.key"
Remediación:

Si utilizas el archivo de configuración de K3s /etc/rancher/k3s/config.yaml, establece el siguiente parámetro.

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

Si utilizas la línea de comandos, ejecuta K3s con --kubelet-arg="make-iptables-util-chains=true". Según tu sistema, reinicia el servicio k3s. Por ejemplo, systemctl restart k3s.service

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

Resultado: No corresponde

Razonamiento:

Por defecto, K3s 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 una captura de eventos apropiada (Manual)

Resultado: PASS

Auditoría:

journalctl -m -u k3s -u k3s-agent | grep 'Running kubelet' | tail -n1

Resultado Esperado: '--event-qps' es mayor o igual a 0 o '--event-qps' no está presente

Valor Devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kubelet --address=0.0.0.0 --allowed-unsafe-sysctls=net.ipv4.ip_forward,net.ipv6.conf.all.forwarding --anonymous-auth=false --authentication-token-webhook=true --authorization-mode=Webhook --cgroup-driver=systemd --client-ca-file=/var/lib/rancher/k3s/agent/client-ca.crt --cloud-provider=external --cluster-dns=10.43.0.10 --cluster-domain=cluster.local --container-runtime-endpoint=unix:///run/k3s/containerd/containerd.sock --containerd=/run/k3s/containerd/containerd.sock --event-qps=0 --eviction-hard=imagefs.available<5%,nodefs.available<5% --eviction-minimum-reclaim=imagefs.available=10%,nodefs.available=10% --fail-swap-on=false --healthz-bind-address=127.0.0.1 --hostname-override=server-0 --kubeconfig=/var/lib/rancher/k3s/agent/kubelet.kubeconfig --make-iptables-util-chains=true --node-ip=10.10.10.100 --node-labels= --pod-manifest-path=/var/lib/rancher/k3s/agent/pod-manifests --protect-kernel-defaults=true --read-only-port=0 --resolv-conf=/run/systemd/resolve/resolv.conf --serialize-image-pulls=false --streaming-connection-idle-timeout=5m --tls-cert-file=/var/lib/rancher/k3s/agent/serving-kubelet.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/k3s/agent/serving-kubelet.key"
Remediación:

Por defecto, K3s establece event-qps en 0. Si deseas cambiar esto, Si utilizas el archivo de configuración de K3s /etc/rancher/k3s/config.yaml, establece el siguiente parámetro a un valor apropiado.

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

Si utilizas la línea de comandos, ejecuta K3s con --kubelet-arg="event-qps=<value>". Según tu sistema, reinicia el servicio k3s. Por ejemplo, systemctl restart k3s.service

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

Resultado: PASS

Auditoría:

journalctl -m -u k3s -u k3s-agent | grep 'Running kubelet' | tail -n1

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

Valor Devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kubelet --address=0.0.0.0 --allowed-unsafe-sysctls=net.ipv4.ip_forward,net.ipv6.conf.all.forwarding --anonymous-auth=false --authentication-token-webhook=true --authorization-mode=Webhook --cgroup-driver=systemd --client-ca-file=/var/lib/rancher/k3s/agent/client-ca.crt --cloud-provider=external --cluster-dns=10.43.0.10 --cluster-domain=cluster.local --container-runtime-endpoint=unix:///run/k3s/containerd/containerd.sock --containerd=/run/k3s/containerd/containerd.sock --event-qps=0 --eviction-hard=imagefs.available<5%,nodefs.available<5% --eviction-minimum-reclaim=imagefs.available=10%,nodefs.available=10% --fail-swap-on=false --healthz-bind-address=127.0.0.1 --hostname-override=server-0 --kubeconfig=/var/lib/rancher/k3s/agent/kubelet.kubeconfig --make-iptables-util-chains=true --node-ip=10.10.10.100 --node-labels= --pod-manifest-path=/var/lib/rancher/k3s/agent/pod-manifests --protect-kernel-defaults=true --read-only-port=0 --resolv-conf=/run/systemd/resolve/resolv.conf --serialize-image-pulls=false --streaming-connection-idle-timeout=5m --tls-cert-file=/var/lib/rancher/k3s/agent/serving-kubelet.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/k3s/agent/serving-kubelet.key"
Remediación:

Por defecto, K3s proporciona automáticamente el certificado TLS y la clave privada para el Kubelet. Se generan y localizan en /var/lib/rancher/k3s/agent/serving-kubelet.crt y /var/lib/rancher/k3s/agent/serving-kubelet.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 K3s /etc/rancher/k3s/config.yaml.

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:

journalctl -m -u k3s -u k3s-agent | grep 'Running kubelet' | tail -n1

Resultado Esperado: '--rotate-certificates' está presente O '--rotate-certificates' no está presente

Valor Devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kubelet --address=0.0.0.0 --allowed-unsafe-sysctls=net.ipv4.ip_forward,net.ipv6.conf.all.forwarding --anonymous-auth=false --authentication-token-webhook=true --authorization-mode=Webhook --cgroup-driver=systemd --client-ca-file=/var/lib/rancher/k3s/agent/client-ca.crt --cloud-provider=external --cluster-dns=10.43.0.10 --cluster-domain=cluster.local --container-runtime-endpoint=unix:///run/k3s/containerd/containerd.sock --containerd=/run/k3s/containerd/containerd.sock --event-qps=0 --eviction-hard=imagefs.available<5%,nodefs.available<5% --eviction-minimum-reclaim=imagefs.available=10%,nodefs.available=10% --fail-swap-on=false --healthz-bind-address=127.0.0.1 --hostname-override=server-0 --kubeconfig=/var/lib/rancher/k3s/agent/kubelet.kubeconfig --make-iptables-util-chains=true --node-ip=10.10.10.100 --node-labels= --pod-manifest-path=/var/lib/rancher/k3s/agent/pod-manifests --protect-kernel-defaults=true --read-only-port=0 --resolv-conf=/run/systemd/resolve/resolv.conf --serialize-image-pulls=false --streaming-connection-idle-timeout=5m --tls-cert-file=/var/lib/rancher/k3s/agent/serving-kubelet.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/k3s/agent/serving-kubelet.key"
Remediación:

Por defecto, K3s no establece el argumento --rotate-certificates. Si has establecido este flag con un valor de false, deberías establecerlo en true o eliminar completamente la bandera. Si utilizas el archivo de configuración de K3s /etc/rancher/k3s/config.yaml, elimina cualquier parámetro rotate-certificates. Si utilizas la línea de comandos, elimina la bandera de K3s --kubelet-arg="rotate-certificates". Según tu sistema, reinicia el servicio k3s. Por ejemplo, systemctl restart k3s.service

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

Resultado: PASS

Auditoría:

journalctl -m -u k3s -u k3s-agent | grep 'Running kubelet' | tail -n1

Resultado Esperado: 'RotateKubeletServerCertificate' está presente o 'RotateKubeletServerCertificate' no está presente

Valor Devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kubelet --address=0.0.0.0 --allowed-unsafe-sysctls=net.ipv4.ip_forward,net.ipv6.conf.all.forwarding --anonymous-auth=false --authentication-token-webhook=true --authorization-mode=Webhook --cgroup-driver=systemd --client-ca-file=/var/lib/rancher/k3s/agent/client-ca.crt --cloud-provider=external --cluster-dns=10.43.0.10 --cluster-domain=cluster.local --container-runtime-endpoint=unix:///run/k3s/containerd/containerd.sock --containerd=/run/k3s/containerd/containerd.sock --event-qps=0 --eviction-hard=imagefs.available<5%,nodefs.available<5% --eviction-minimum-reclaim=imagefs.available=10%,nodefs.available=10% --fail-swap-on=false --healthz-bind-address=127.0.0.1 --hostname-override=server-0 --kubeconfig=/var/lib/rancher/k3s/agent/kubelet.kubeconfig --make-iptables-util-chains=true --node-ip=10.10.10.100 --node-labels= --pod-manifest-path=/var/lib/rancher/k3s/agent/pod-manifests --protect-kernel-defaults=true --read-only-port=0 --resolv-conf=/run/systemd/resolve/resolv.conf --serialize-image-pulls=false --streaming-connection-idle-timeout=5m --tls-cert-file=/var/lib/rancher/k3s/agent/serving-kubelet.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/k3s/agent/serving-kubelet.key"
Remediación:

Por defecto, K3s no establece la puerta de características RotateKubeletServerCertificate. Si has habilitado esta puerta de características, deberías eliminarla. Si utilizas el archivo de configuración de K3s /etc/rancher/k3s/config.yaml, elimina cualquier parámetro feature-gate=RotateKubeletServerCertificate. Si utilizas la línea de comandos, elimina la bandera de K3s --kubelet-arg="feature-gate=RotateKubeletServerCertificate". Según tu sistema, reinicia el servicio k3s. Por ejemplo, systemctl restart k3s.service

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

Resultado: PASS

Auditoría:

journalctl -m -u k3s -u k3s-agent | grep 'Running kubelet' | tail -n1

Resultado Esperado: '--tls-cipher-suites' contiene elementos válidos de '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_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256'

Valor Devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running kubelet --address=0.0.0.0 --allowed-unsafe-sysctls=net.ipv4.ip_forward,net.ipv6.conf.all.forwarding --anonymous-auth=false --authentication-token-webhook=true --authorization-mode=Webhook --cgroup-driver=systemd --client-ca-file=/var/lib/rancher/k3s/agent/client-ca.crt --cloud-provider=external --cluster-dns=10.43.0.10 --cluster-domain=cluster.local --container-runtime-endpoint=unix:///run/k3s/containerd/containerd.sock --containerd=/run/k3s/containerd/containerd.sock --event-qps=0 --eviction-hard=imagefs.available<5%,nodefs.available<5% --eviction-minimum-reclaim=imagefs.available=10%,nodefs.available=10% --fail-swap-on=false --healthz-bind-address=127.0.0.1 --hostname-override=server-0 --kubeconfig=/var/lib/rancher/k3s/agent/kubelet.kubeconfig --make-iptables-util-chains=true --node-ip=10.10.10.100 --node-labels= --pod-manifest-path=/var/lib/rancher/k3s/agent/pod-manifests --protect-kernel-defaults=true --read-only-port=0 --resolv-conf=/run/systemd/resolve/resolv.conf --serialize-image-pulls=false --streaming-connection-idle-timeout=5m --tls-cert-file=/var/lib/rancher/k3s/agent/serving-kubelet.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/k3s/agent/serving-kubelet.key"
Remediación:

Si utilizas un archivo de configuración de K3s /etc/rancher/k3s/config.yaml, edita el archivo para establecer TLSCipherSuites en

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. Si utilizas la línea de comandos, añade la bandera de K3s --kubelet-arg="tls-cipher-suites=<mismos valores que se indican arriba>". Según tu sistema, reinicia el servicio k3s. Por ejemplo, systemctl restart k3s.service

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

Resultado: WARN (ADVERTENCIA)

Remediación: Decide un nivel apropiado para este parámetro y configúralo. Si utilizas un archivo de configuración de K3s /etc/rancher/k3s/config.yaml, edita el archivo para establecer podPidsLimit en

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

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 K3s /etc/rancher/k3s/config.yaml, edita el archivo para establecer seccomp-default en kubelet-arg: - "seccomp-default=verdadero"

4.3 kube-proxy

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

Resultado: PASS

Auditoría:

journalctl -m -u k3s -u k3s-agent | grep 'Running kube-proxy' | tail -n1

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

Valor Devuelto:
Sep 16 15:47:27 server-0 k3s[2233]: time="2025-09-16T15:47:27Z" level=info msg="Running 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/k3s/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 host local. El valor por defecto es 127.0.0.1:10249.

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' contiene elementos válidos de 'cluster-admin, helm-kube-system-traefik, helm-kube-system-traefik-crd'

Valor Devuelto:
cluster-admin                                                   cluster-admin                                                   system:masters
cluster-admin                                                   helm-kube-system-traefik                                        helm-traefik
cluster-admin                                                   helm-kube-system-traefik-crd                                    helm-traefik-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. K3s da excepciones a los clusterrolebindings helm-kube-system-traefik y helm-kube-system-traefik-crd ya que son necesarios para la instalación de traefik en el espacio de nombres kube-system para operaciones regulares. 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: PASS

Auditoría:

echo "canGetListWatchSecretsAsSystemAuthenticated: $(kubectl auth can-i get,list,watch secrets --all-namespaces --as=system:authenticated)"

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

Valor Devuelto:
canGetListWatchSecretsAsSystemAuthenticated: no
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 k3s-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: 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: cluster-admin                                      is_whitelist: true  is_compliant: true
**clusterrole_name: clustercidrs-node                                  is_whitelist: false is_compliant: true
**clusterrole_name: edit                                               is_whitelist: false is_compliant: true
**clusterrole_name: k3s-cloud-controller-manager                       is_whitelist: true  is_compliant: true
**clusterrole_name: local-path-provisioner-role                        is_whitelist: true  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:aggregated-metrics-reader                   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:coredns                                     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:k3s-controller                              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-scheduler                              is_whitelist: false is_compliant: true
**clusterrole_name: system:kubelet-api-admin                           is_whitelist: true  is_compliant: true
**clusterrole_name: system:metrics-server                              is_whitelist: false 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:service-account-issuer-discovery            is_whitelist: false is_compliant: true
**clusterrole_name: system:volume-scheduler                            is_whitelist: false is_compliant: true
**clusterrole_name: traefik-kube-system                                is_whitelist: false is_compliant: true
**clusterrole_name: view                                               is_whitelist: false is_compliant: true
Remediación:

Donde sea posible, reemplazar cualquier uso de comodines en clusterroles y roles con objetos o acciones específicas. K3s da excepciones para los siguientes roles de clúster, que son necesarios para operaciones regulares: - k3s-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, eliminar el acceso de creación a objetos pod en el clúster.

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

Resultado: WARN (ADVERTENCIA)

Remediación: Crear cuentas de servicio explícitas siempre que una carga de trabajo de Kubernetes requiera acceso específico al servidor API de Kubernetes. K3s hace una excepción para la cuenta de servicio predeterminada en el espacio de nombres kube-system. Modificar la configuración de cada cuenta de servicio predeterminada para incluir este valor automountServiceAccountToken: false O usando kubectl:

kubectl patch serviceaccount --namespace <NAMESPACE> 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
  # 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
  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' O 'service_account' contiene elementos válidos de 'coredns, helm-traefik, helm-traefik-crd, traefik, metrics-server, svclb, local-path-provisioner-service-account'

Valor Devuelto:
**namespace: kube-system pod_name: coredns-645bdb8675-sm78l service_account: coredns pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: notset is_compliant: false
**namespace: kube-system pod_name: helm-install-traefik-4qhld service_account: helm-traefik pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: true is_compliant: false
**namespace: kube-system pod_name: helm-install-traefik-crd-dqkpt service_account: helm-traefik-crd pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: true is_compliant: false
**namespace: kube-system pod_name: local-path-provisioner-ffbcc4db4-pzhw4 service_account: local-path-provisioner-service-account pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: notset is_compliant: false
**namespace: kube-system pod_name: metrics-server-8677f8544d-kg66f service_account: metrics-server pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: notset is_compliant: false
**namespace: kube-system pod_name: svclb-traefik-01b74a90-k47w2 service_account: svclb pod_is_automountserviceaccounttoken: false svacc_is_automountServiceAccountToken: notset is_compliant: false
**namespace: kube-system pod_name: traefik-5b6d9f7f5c-rs5sw service_account: traefik pod_is_automountserviceaccounttoken: notset svacc_is_automountServiceAccountToken: notset is_compliant: false
Remediación:

Modificar la definición de ServiceAccounts y Pods que no necesitan montar tokens de cuenta de servicio para desactivarlo, con automountServiceAccountToken: false. 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 - ServiceAccount es automountServiceAccountToken: false y el Pod es automountServiceAccountToken: false o notset - ServiceAccount es automountServiceAccountToken: true notset y el Pod es automountServiceAccountToken: false K3s da excepciones a las siguientes cuentas de servicio, que son necesarias para operaciones regulares: - coredns, helm-traefik, helm-traefik-crd, traefik, metrics-server, svclb, local-path-provisioner-service-account

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

Resultado: WARN (ADVERTENCIA)

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

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

Resultado: WARN (ADVERTENCIA)

Remediación: Donde sea posible, eliminar los permisos de impersonate, bind y escalate de los sujetos.

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

Resultado: WARN (ADVERTENCIA)

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

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

Resultado: WARN (ADVERTENCIA)

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

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

Resultado: WARN (ADVERTENCIA)

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

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

Resultado: WARN (ADVERTENCIA)

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

5.1.13 Minimizar el acceso a la creación de tokens de cuentas de servicio (Manual)

Resultado: WARN (ADVERTENCIA)

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

5.2 Normas de seguridad de Pods

5.2.1 Asegurarse de que el clúster tenga al menos un mecanismo de control de políticas activo (Manual)

Resultado: WARN (ADVERTENCIA)

Remediación: Asegurarse 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 Minimizar la admisión de contenedores privilegiados (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.privileged value.
    container_privileged=$(echo ${container} | jq -r '.securityContext.privileged' | sed -e 's/null/notset/g')
    if [ "${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: coredns-645bdb8675-sm78l container_name: coredns pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: helm-install-traefik-4qhld container_name: helm pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: helm-install-traefik-crd-dqkpt container_name: helm pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: local-path-provisioner-ffbcc4db4-pzhw4 container_name: local-path-provisioner pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: metrics-server-8677f8544d-kg66f container_name: metrics-server pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: svclb-traefik-01b74a90-k47w2 container_name: lb-tcp-80 pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: svclb-traefik-01b74a90-k47w2 container_name: lb-tcp-443 pod_namespace: kube-system is_container_privileged: notset is_compliant: true
***pod_name: traefik-5b6d9f7f5c-rs5sw container_name: traefik pod_namespace: kube-system is_container_privileged: notset is_compliant: true
Remediació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 privilegiados. 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 el .securityContext.privileged del contenedor está establecido en true. Por defecto: por defecto, no hay restricciones sobre la creación de contenedores privilegiados.

5.2.3 Minimizar la admisión de contenedores que deseen compartir el espacio de nombres del 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: coredns-645bdb8675-sm78l pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: helm-install-traefik-4qhld pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: helm-install-traefik-crd-dqkpt pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: local-path-provisioner-ffbcc4db4-pzhw4 pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: metrics-server-8677f8544d-kg66f pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: svclb-traefik-01b74a90-k47w2 pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
***pod_name: traefik-5b6d9f7f5c-rs5sw pod_namespace: kube-system is_pod_hostpid: false is_compliant: true
Remediació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 hostPID. 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á establecido en true. Por defecto, no hay restricciones en la creación de contenedores hostPID.

5.2.4 Minimizar 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: coredns-645bdb8675-sm78l pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: helm-install-traefik-4qhld pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: helm-install-traefik-crd-dqkpt pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: local-path-provisioner-ffbcc4db4-pzhw4 pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: metrics-server-8677f8544d-kg66f pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: svclb-traefik-01b74a90-k47w2 pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
***pod_name: traefik-5b6d9f7f5c-rs5sw pod_namespace: kube-system is_pod_hostipc: false is_compliant: true
Remediació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 hostIPC. 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á establecido en true. Por defecto, no hay restricciones en la creación de contenedores hostIPC.

5.2.5 Minimizar la admisión de contenedores que deseen compartir el espacio de nombres de red 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.hostNetwork for each pod.
  pod_hostnetwork=$(kubectl get pod "${pod_name}" --namespace "${pod_namespace}" -o jsonpath='{.spec.hostNetwork}' 2>/dev/null)
  if [ -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: coredns-645bdb8675-sm78l pod_namespace: kube-system is_pod_hostnetwork: false is_compliant: true
***pod_name: helm-install-traefik-4qhld pod_namespace: kube-system is_pod_hostnetwork: false is_compliant: true
***pod_name: helm-install-traefik-crd-dqkpt pod_namespace: kube-system is_pod_hostnetwork: false is_compliant: true
***pod_name: local-path-provisioner-ffbcc4db4-pzhw4 pod_namespace: kube-system is_pod_hostnetwork: false is_compliant: true
***pod_name: metrics-server-8677f8544d-kg66f pod_namespace: kube-system is_pod_hostnetwork: false is_compliant: true
***pod_name: svclb-traefik-01b74a90-k47w2 pod_namespace: kube-system is_pod_hostnetwork: false is_compliant: true
***pod_name: traefik-5b6d9f7f5c-rs5sw pod_namespace: kube-system is_pod_hostnetwork: false is_compliant: true
Remediació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 hostNetwork. 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á establecido en true. Por defecto, no hay restricciones en la creación de contenedores hostNetwork.

5.2.6 Minimizar 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: coredns-645bdb8675-sm78l container_name: coredns pod_namespace: kube-system is_container_allowprivesc: false is_compliant: true
***pod_name: helm-install-traefik-4qhld container_name: helm pod_namespace: kube-system is_container_allowprivesc: false is_compliant: true
***pod_name: helm-install-traefik-crd-dqkpt container_name: helm pod_namespace: kube-system is_container_allowprivesc: false is_compliant: true
***pod_name: local-path-provisioner-ffbcc4db4-pzhw4 container_name: local-path-provisioner pod_namespace: kube-system is_container_allowprivesc: notset is_compliant: true
***pod_name: metrics-server-8677f8544d-kg66f container_name: metrics-server pod_namespace: kube-system is_container_allowprivesc: false is_compliant: true
***pod_name: svclb-traefik-01b74a90-k47w2 container_name: lb-tcp-80 pod_namespace: kube-system is_container_allowprivesc: notset is_compliant: true
***pod_name: svclb-traefik-01b74a90-k47w2 container_name: lb-tcp-443 pod_namespace: kube-system is_container_allowprivesc: notset is_compliant: true
***pod_name: traefik-5b6d9f7f5c-rs5sw container_name: traefik pod_namespace: kube-system is_container_allowprivesc: false is_compliant: true
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 .securityContext.allowPrivilegeEscalation establecido en true. Auditoría: la auditoría recupera el/los contenedor(es) de cada Pod .securityContext.allowPrivilegeEscalation. Condición: is_compliant es falso si .securityContext.allowPrivilegeEscalation del contenedor está establecido en true. Por defecto: Si no está establecido, se permite la escalada de privilegios (por defecto es verdadero). Sin embargo, si se utiliza PSP/PSA con un perfil de restricted, la escalada de privilegios está explícitamente prohibida a menos que se configure de otra manera.

5.2.7 Minimizar la admisión de contenedores [root] (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Crear una política 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é establecido.

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 NET_RAW capacidad.

5.2.9 Minimizar la admisión de contenedores con capacidades añadidas (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 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=""

    # Check if pod is in whitelist
    if echo "${pod_name}" | grep -q -E "^(coredns|svclb-traefik)"; then
      is_whitelist=true
      is_compliant=true
    elif [ "${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 newlines from final output.
    continaer_caps_add=$(echo "${container_caps_add}" | tr -d '\n')
    if [ "${is_whitelist}" = true ]; then
      printf "***pod_name: %-30s container_name: %-30s pod_namespace: %-20s is_whitelist: %-5s is_compliant: true\n" "${pod_name}" "${container_name}" "${pod_namespace}" "${is_whitelist}"
    elif [ "${is_compliant}" = true ]; then
      printf "***pod_name: %-30s container_name: %-30s pod_namespace: %-20s container_caps_add: %-15s is_compliant: true\n" "${pod_name}" "${container_name}" "${pod_namespace}" "${container_caps_add}"
    else
      printf "***pod_name: %-30s container_name: %-30s pod_namespace: %-20s container_caps_add: %-15s is_compliant: false\n" "${pod_name}" "${container_name}" "${pod_namespace}" "${caps_list}"
    fi
  done
done

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

Valor Devuelto:
***pod_name: coredns-645bdb8675-sm78l       container_name: coredns                        pod_namespace: kube-system          is_whitelist: true  is_compliant: true
***pod_name: helm-install-traefik-4qhld     container_name: helm                           pod_namespace: kube-system          container_caps_add: notset          is_compliant: true
***pod_name: helm-install-traefik-crd-dqkpt container_name: helm                           pod_namespace: kube-system          container_caps_add: notset          is_compliant: true
***pod_name: local-path-provisioner-ffbcc4db4-pzhw4 container_name: local-path-provisioner         pod_namespace: kube-system          container_caps_add: notset          is_compliant: true
***pod_name: metrics-server-8677f8544d-kg66f container_name: metrics-server                 pod_namespace: kube-system          container_caps_add: notset          is_compliant: true
***pod_name: svclb-traefik-01b74a90-k47w2   container_name: lb-tcp-80                      pod_namespace: kube-system          is_whitelist: true  is_compliant: true
***pod_name: svclb-traefik-01b74a90-k47w2   container_name: lb-tcp-443                     pod_namespace: kube-system          is_whitelist: true  is_compliant: true
***pod_name: traefik-5b6d9f7f5c-rs5sw       container_name: traefik                        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 para el clúster a menos que esté establecido en un array vacío. Auditoría: la auditoría recupera el/los contenedor(es) de cada Pod con capacidades añadidas. Condición: is_compliant es falso si se añaden capacidades para un contenedor dado. Por defecto: Los contenedores se ejecutan con un conjunto predeterminado de capacidades asignadas por el entorno de ejecución de contenedor. K3s da excepciones a los siguientes pods, que son necesarios para operaciones regulares: - coredns, svclb-traefik

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

Resultado: WARN (ADVERTENCIA)

Solución: Revisa el uso de capacidades en las aplicaciones que se ejecutan en tu 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 Minimiza la admisión de contenedores de Windows HostProcess (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Añade 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 establecido en true.

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

Resultado: WARN (ADVERTENCIA)

Solución: Añade 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 hostPath volúmenes.

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

Resultado: WARN (ADVERTENCIA)

Solución: Añade 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 Asegúrate de que el CNI en uso soporte NetworkPolicies (Manual)

Resultado: WARN (ADVERTENCIA)

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

5.3.2 Asegúrate de que todos los Espacios de Nombres tengan definidas NetworkPolicies (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Sigue la documentación y crea objetos NetworkPolicy según los necesites.

5.4 Gestión de Secretos

5.4.1 Prefiere usar Secretos como archivos en lugar de Secretos como variables de entorno (Manual)

Resultado: WARN (ADVERTENCIA)

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

5.4.2 Considera el almacenamiento externo de secretos (Manual)

Resultado: WARN (ADVERTENCIA)

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

5.5 Control de Admisión Extensible

5.5.1 Configura 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: Utiliza securityContext para habilitar el perfil seccomp docker/default en las definiciones de tu pod. Un ejemplo es el siguiente: securityContext: seccompProfile: type: RuntimeDefault

5.6.3 Aplica SecurityContext a tus Pods y Contenedores (Manual)

Resultado: WARN (ADVERTENCIA)

Solución: Sigue la documentación de Kubernetes y aplica SecurityContexts a tus 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: Asegúrate de que se creen espacios de nombres para permitir la segregación adecuada de los recursos de Kubernetes y que todos los nuevos recursos se creen en un espacio de nombres específico.