|
Ce document a été traduit à l'aide d'une technologie de traduction automatique. Bien que nous nous efforcions de fournir des traductions exactes, nous ne fournissons aucune garantie quant à l'exhaustivité, l'exactitude ou la fiabilité du contenu traduit. En cas de divergence, la version originale anglaise prévaut et fait foi. |
CIS 1.11 Guide d’auto-évaluation
Présentation
Ce document est un complément au guide de renforcement de la sécurité K3s. Le guide de renforcement de la sécurité fournit des conseils prescriptifs pour durcir une installation de production de K3s, et ce guide de référence est destiné à vous aider à évaluer le niveau de sécurité du cluster durci par rapport à chaque contrôle du CIS Kubernetes Benchmark. Il est destiné aux opérateurs de K3s, aux équipes de sécurité, aux auditeurs et aux décideurs.
Ce guide est spécifique à la ligne de version v1.29-v1.34 de K3s et à la version v1.11 du CIS Kubernetes Benchmark.
Pour plus d’informations sur chaque contrôle, y compris des descriptions détaillées et des remédiations pour les tests échoués, vous pouvez vous référer à la section correspondante du CIS Kubernetes Benchmark v1.9. Vous pouvez télécharger le benchmark, après avoir créé un compte gratuit, dans Centre pour la sécurité Internet (CIS).
Méthodologie de test des contrôles
Chaque contrôle du CIS Kubernetes Benchmark a été évalué par rapport à un cluster K3s configuré selon le guide de renforcement de la sécurité accompagnant.
Lorsque les audits de contrôle diffèrent du benchmark CIS original, les commandes d’audit spécifiques à K3s sont fournies pour les tests.
Voici les résultats possibles pour chaque contrôle :
-
Réussite - Le cluster K3s testé a réussi l’audit décrit dans le benchmark.
-
Non applicable - Le contrôle n’est pas applicable à K3s en raison de la manière dont il est conçu pour fonctionner. La section de remédiation expliquera pourquoi cela est le cas.
-
Avertissement - Le contrôle est manuel dans le benchmark CIS et dépend du cas d’utilisation du cluster ou d’un autre facteur qui doit être déterminé par l’opérateur du cluster. Ces contrôles ont été évalués pour s’assurer que K3s ne prévient pas leur mise en œuvre, mais aucune configuration ou audit supplémentaire du cluster testé n’a été effectué.
Ce guide part du principe que K3s fonctionne en tant qu’unité Systemd. Votre installation peut varier et nécessitera que vous ajustiez les commandes "audit" pour s’adapter à votre scénario.
1.1 Fichiers de configuration des nœuds du plan de contrôle
1.1.1 Assurez-vous que les permissions du fichier de spécification du pod API sont définies sur 600 ou plus restrictives (Automatisé)
Résultat : Sans objet
Motif:
Par défaut, K3s intègre le serveur API dans le processus k3s. Il n’y a pas de fichier de spécification du pod API.
1.1.2 Assurez-vous que la propriété du fichier de spécification du pod API est définie sur root:root (Automatisé)
Résultat : Sans objet
Motif:
Par défaut, K3s intègre le serveur API dans le processus k3s. Il n’y a pas de fichier de spécification du pod API.
1.1.3 Assurez-vous que les permissions du fichier de spécification du pod du gestionnaire de contrôleur sont définies sur 600 ou plus restrictives (Automatisé)
Résultat : Sans objet
Motif :
Par défaut, K3s intègre le gestionnaire de contrôleur dans le processus k3s. Il n’y a pas de fichier de spécification du pod du gestionnaire de contrôleur.
1.1.4 Assurez-vous que la propriété du fichier de spécification du pod du gestionnaire de contrôleur est définie sur root:root (Automatisé)
Résultat : Sans objet
Motif :
Par défaut, K3s intègre le gestionnaire de contrôleur dans le processus k3s. Il n’y a pas de fichier de spécification du pod du gestionnaire de contrôleur.
1.1.5 Assurez-vous que les permissions du fichier de spécification du pod planificateur sont définies sur 600 ou plus restrictives (Automatisé)
Résultat : Sans objet
Motif :
Par défaut, K3s intègre le planificateur dans le processus k3s. Il n’y a pas de fichier de spécification du pod planificateur.
1.1.6 Assurez-vous que la propriété du fichier de spécification du pod planificateur est définie sur root:root (Automatisé)
Résultat : Sans objet
Motif :
Par défaut, K3s intègre le planificateur dans le processus k3s. Il n’y a pas de fichier de spécification du pod planificateur.
1.1.7 Assurez-vous que les permissions du fichier de spécification du pod etcd sont définies sur 600 ou plus restrictives (Automatisé)
Résultat : Sans objet
Motif :
Par défaut, K3s intègre etcd dans le processus k3s. Il n’y a pas de fichier de spécification du pod etcd.
1.1.8 Assurez-vous que la propriété du fichier de spécification du pod etcd est définie sur root:root (Automatisé)
Résultat : Sans objet
Motif:
Par défaut, K3s intègre etcd dans le processus k3s. Il n’y a pas de fichier de spécification du pod etcd.
1.1.9 Assurez-vous que les permissions du fichier de l’interface réseau de conteneur sont définies sur 600 ou plus restrictives (Automatisé)
Résultat : PASS
Audit :
find /var/lib/cni/networks -type f ! -name lock 2> /dev/null | xargs --no-run-if-empty stat -c permissions=%a
Résultat attendu : les permissions sont 600, attendu 600 ou plus restrictives
Valeur retournée :
permissions=600
permissions=600
permissions=600
permissions=600
permissions=600
permissions=600
Correction :
Par défaut, K3s définit les permissions du fichier CNI à 600.
Notez que pour de nombreux CNI, un fichier de verrouillage est créé avec des permissions 750. C’est attendu et peut être ignoré.
Si vous modifiez votre configuration CNI, assurez-vous que les permissions sont définies à 600.
Par exemple, chmod 600 /var/lib/cni/networks/<filename>
1.1.10 Assurez-vous que la propriété du fichier de l’interface réseau de conteneur est définie sur root:root (Automatisé)
Résultat : PASS
Audit :
find /var/lib/cni/networks -type f 2> /dev/null | xargs --no-run-if-empty stat -c %U:%G
Résultat attendu : 'root:root' est présent
Valeur retournée :
root:root
root:root
root:root
root:root
root:root
root:root
root:root
Correction :
Exécutez la commande ci-dessous (en fonction de l’emplacement du fichier sur votre système) sur le nœud de plan de contrôle.
Par exemple,
chown root:root /var/lib/cni/networks/<filename>
1.1.11 Assurez-vous que les permissions du répertoire de données etcd sont définies à 700 ou plus restrictives (Manuel)
Résultat : PASS
Audit :
stat -c permissions=%a /var/lib/rancher/k3s/server/db/etcd
Résultat attendu: les permissions sont définies à 700, attendu 700 ou plus restrictives
Valeur retournée:
permissions=700
Correction:
Non applicable pour le cluster non-etcd. Si vous exécutez uniquement le maître sans rôle etcd, cette vérification n’est pas applicable.
Si les rôles de plan de contrôle et etcd sont présents sur les mêmes nœuds mais que cette vérification est un avertissement alors
Sur le nœud serveur etcd, obtenez le répertoire de données etcd, passé comme argument --data-dir,
à partir de la commande 'ps -ef | grep etcd'.
Exécutez la commande ci-dessous (en fonction du répertoire de données etcd trouvé ci-dessus). Par exemple,
chmod 700 /var/lib/rancher/k3s/server/db/etcd
1.1.12 Assurez-vous que la propriété du répertoire de données etcd est définie sur etcd:etcd (Automatisé)
Résultat : Sans objet
Motif:
Pour K3s, etcd est intégré dans le processus k3s. Il n’y a pas de processus etcd séparé. Par conséquent, la propriété du répertoire de données etcd est gérée par le processus k3s et doit être root:root.
1.1.13 Assurez-vous que les permissions du fichier admin.conf sont définies sur 600 ou plus restrictives (Automatisé)
Résultat : PASS
Audit :
/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'
Résultat attendu: les permissions sont 600, attendu 600 ou plus restrictives
Valeur retournée:
permissions=600
Correction:
Exécutez la commande ci-dessous (en fonction de l’emplacement du fichier sur votre système) sur le nœud de plan de contrôle.
Par exemple, chmod 600 /var/lib/rancher/k3s/server/cred/admin.kubeconfig
1.1.14 Assurez-vous que la propriété du fichier admin.conf est définie sur root:root (Automatisé)
Résultat : PASS
Audit :
/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'
Résultat attendu: 'root:root' est égal à 'root:root'
Valeur retournée:
root:root
Correction:
Exécutez la commande ci-dessous (en fonction de l’emplacement du fichier sur votre système) sur le nœud de plan de contrôle.
Par exemple, chown root:root /var/lib/rancher/k3s/server/cred/admin.kubeconfig
1.1.15 Assurez-vous que les permissions du fichier scheduler.conf sont définies sur 600 ou plus restrictives (Automatisé)
Résultat : PASS
Audit :
/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'
Résultat attendu: les permissions sont 600, attendu 600 ou plus restrictives
Valeur retournée:
permissions=600
Correction:
Exécutez la commande ci-dessous (en fonction de l’emplacement du fichier sur votre système) sur le nœud de plan de contrôle.
Par exemple,
chmod 600 /var/lib/rancher/k3s/server/cred/scheduler.kubeconfig
1.1.16 Assurez-vous que la propriété du fichier scheduler.conf est définie sur root:root (Automatisé)
Résultat : PASS
Audit :
/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'
Résultat attendu: 'root:root' est présent
Valeur retournée:
root:root
Correction:
Exécutez la commande ci-dessous (en fonction de l’emplacement du fichier sur votre système) sur le nœud de plan de contrôle.
Par exemple,
chown root:root /var/lib/rancher/k3s/server/cred/scheduler.kubeconfig
1.1.17 Assurez-vous que les permissions du fichier controller-manager.conf sont définies sur 600 ou plus restrictives (Automatisé)
Résultat : PASS
Audit :
/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'
Résultat attendu : les permissions sont 600, attendu 600 ou plus restrictives
Valeur retournée:
permissions=600
Correction:
Exécutez la commande ci-dessous (en fonction de l’emplacement du fichier sur votre système) sur le nœud de plan de contrôle.
Par exemple,
chmod 600 /var/lib/rancher/k3s/server/cred/controller.kubeconfig
1.1.18 Assurez-vous que la propriété du fichier controller-manager.conf est définie sur root:root (Automatisé)
Résultat : PASS
Audit :
stat -c %U:%G /var/lib/rancher/k3s/server/cred/controller.kubeconfig
Résultat attendu : 'root:root' est égal à 'root:root'
Valeur retournée:
root:root
Correction:
Exécutez la commande ci-dessous (en fonction de l’emplacement du fichier sur votre système) sur le nœud de plan de contrôle.
Par exemple,
chown root:root /var/lib/rancher/k3s/server/cred/controller.kubeconfig
1.1.19 Assurez-vous que la propriété du répertoire et des fichiers PKI de Kubernetes est définie sur root:root (Automatisé)
Résultat : PASS
Audit :
stat -c %U:%G /var/lib/rancher/k3s/server/tls
Résultat attendu : 'root:root' est présent
Valeur retournée:
root:root
Correction:
Exécutez la commande ci-dessous (en fonction de l’emplacement du fichier sur votre système) sur le nœud de plan de contrôle.
Par exemple,
chown -R root:root /var/lib/rancher/k3s/server/tls
1.1.20 Assurez-vous que les permissions du fichier de certificat PKI de Kubernetes sont définies sur 644 ou plus restrictives (Automatisé)
Résultat : PASS
Audit :
/bin/sh -c 'stat -c permissions=%a /var/lib/rancher/k3s/server/tls/*.crt'
Résultat attendu : les permissions sont 644, attendu 644 ou plus restrictives
Valeur retournée:
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
Correction:
Exécutez la commande ci-dessous (en fonction de l’emplacement du fichier sur votre système) sur le nœud maître.
Par exemple,
chmod -R 644 /var/lib/rancher/k3s/server/tls/*.crt
Par défaut, K3s définit les permissions des fichiers de certificat PKI sur 644, des permissions plus restrictives telles que 600 sont prises en charge.
1.1.21 Assurez-vous que les permissions du fichier clé PKI de Kubernetes sont définies sur 600 (Automatisé)
Résultat : PASS
Audit :
/bin/sh -c 'stat -c permissions=%a /var/lib/rancher/k3s/server/tls/*.key'
Résultat attendu : les permissions sont 600, attendu 600 ou plus restrictives
Valeur retournée:
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
Correction:
Exécutez la commande ci-dessous (en fonction de l’emplacement du fichier sur votre système) sur le nœud maître.
Par exemple,
chmod -R 600 /var/lib/rancher/k3s/server/tls/*.key
1.2 Serveur API
1.2.1 Assurez-vous que l’argument --anonymous-auth est défini sur false (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'anonymous-auth'
Résultat attendu: '--anonymous-auth' est égal à 'false'
Valeur retournée:
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"
Correction:
Par défaut, K3s définit l’argument --anonymous-auth sur false. Si cette vérification échoue, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez tout ce qui ressemble à ci-dessous.
kube-apiserver-arg: - "anonymous-auth=true"
1.2.2 Assurez-vous que le paramètre --token-auth-file n’est pas défini (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1
Résultat attendu: '--token-auth-file' est absent
Valeur retournée:
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"
Correction:
Suivez la documentation et configurez des mécanismes alternatifs pour l’authentification. Si cette vérification échoue, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez tout ce qui ressemble à ci-dessous.
kube-apiserver-arg: - "token-auth-file=<path>"
1.2.3 Assurez-vous que le --DenyServiceExternalIPs est défini (Manuel)
Résultat : WARN
Correction: Par défaut, K3s ne définit pas DenyServiceExternalIPs. Pour activer ce drapeau, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml comme ci-dessous.
kube-apiserver-arg: - "enable-admission-plugins=DenyServiceExternalIPs"
1.2.4 Assurez-vous que les arguments --kubelet-client-certificate et --kubelet-client-key sont définis comme appropriés (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1
Résultat attendu : '--kubelet-client-certificate' est présent ET '--kubelet-client-key' est présent
Valeur retournée :
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"
Correction:
Par défaut, K3s fournit automatiquement le certificat client kubelet et la clé. Ils sont générés et situés à /var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt et /var/lib/rancher/k3s/server/tls/client-kube-apiserver.key. Si pour une raison quelconque vous devez fournir votre propre certificat et clé, vous pouvez définir les paramètres ci-dessous dans le fichier de configuration 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 Assurez-vous que l’argument --kubelet-certificate-authority est défini comme approprié (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'kubelet-certificate-authority'
Résultat attendu : '--kubelet-certificate-authority' est présent
Valeur retournée :
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"
Correction:
Par défaut, K3s fournit automatiquement le fichier de certificat CA kubelet, à /var/lib/rancher/k3s/server/tls/server-ca.crt. Si pour une raison quelconque vous devez fournir votre propre certificat CA, envisagez d’utiliser l’outil en ligne de commande de certificat k3s. Si cette vérification échoue, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez toutes les lignes comme ci-dessous.
kube-apiserver-arg: - "kubelet-certificate-authority=<path/to/ca-cert-file>"
1.2.6 Assurez-vous que l’argument --authorization-mode n’est pas défini sur AlwaysAllow (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'authorization-mode'
Résultat attendu : '--authorization-mode' n’a pas 'AlwaysAllow'
Valeur retournée :
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"
Correction:
Par défaut, K3s ne définit pas le --authorization-mode sur AlwaysAllow. Si cette vérification échoue, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml, supprimez toutes les lignes comme ci-dessous.
kube-apiserver-arg: - "authorization-mode=AlwaysAllow"
1.2.7 Assurez-vous que l’argument --authorization-mode inclut Node (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'authorization-mode'
Résultat attendu: '--authorization-mode' a 'Node'
Valeur retournée:
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"
Correction:
Par défaut, K3s définit le --authorization-mode sur Node et RBAC. Si cette vérification échoue, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml, assurez-vous de ne pas remplacer le authorization-mode.
1.2.8 Assurez-vous que l’argument --authorization-mode inclut RBAC (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'authorization-mode'
Résultat attendu: '--authorization-mode' a 'RBAC'
Valeur retournée:
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"
Correction:
Par défaut, K3s définit le --authorization-mode sur Node et RBAC. Si cette vérification échoue, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml, assurez-vous de ne pas remplacer le authorization-mode.
1.2.9 Assurez-vous que le plugin de contrôle d’admission EventRateLimit est défini (Manuel)
Résultat : WARN
Correction: Suivez la documentation Kubernetes et définissez les limites souhaitées dans un fichier de configuration. Ensuite, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et définissez les paramètres ci-dessous.
kube-apiserver-arg: - "enable-admission-plugins=...,EventRateLimit,..." - "admission-control-config-file=<path/to/configuration/file>"
1.2.10 Assurez-vous que le plugin de contrôle d’admission AlwaysAdmit n’est pas défini (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'enable-admission-plugins'
Résultat attendu: '--enable-admission-plugins' n’a pas 'AlwaysAdmit' OU '--enable-admission-plugins' n’est pas présent
Valeur retournée:
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"
Correction:
Par défaut, K3s ne définit pas le --enable-admission-plugins sur AlwaysAdmit. Si cette vérification échoue, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml, supprimez toutes les lignes comme ci-dessous.
kube-apiserver-arg: - "enable-admission-plugins=AlwaysAdmit"
1.2.11 Assurez-vous que le plugin de contrôle d’admission AlwaysPullImages est défini (Manuel)
Résultat : WARN
Correction: Permissif, selon les directives CIS, "Ce paramètre pourrait avoir un impact sur les clusters hors ligne ou isolés, qui ont des images préchargées et n’ont pas accès à un registre pour tirer des images en cours d’utilisation." Ce paramètre n’est pas approprié pour les clusters qui utilisent cette configuration." Modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et définissez le paramètre ci-dessous.
kube-apiserver-arg: - "enable-admission-plugins=...,AlwaysPullImages,..."
1.2.12 Assurez-vous que le plugin de contrôle d’admission ServiceAccount est défini (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1
Résultat attendu: '--disable-admission-plugins' est présent OU '--disable-admission-plugins' n’est pas présent
Valeur retournée:
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"
Correction:
Par défaut, K3s ne définit pas le --disable-admission-plugins sur quoi que ce soit. Suivez la documentation et créez des objets ServiceAccount selon votre environnement. Si cette vérification échoue, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez toute ligne comme ci-dessous.
kube-apiserver-arg: - "disable-admission-plugins=ServiceAccount"
1.2.13 Assurez-vous que le plugin de contrôle d’admission NamespaceLifecycle est défini (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1
Résultat attendu: '--disable-admission-plugins' est présent OU '--disable-admission-plugins' n’est pas présent
Valeur retournée:
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"
Correction:
Par défaut, K3s ne définit pas le --disable-admission-plugins sur quoi que ce soit. Si cette vérification échoue, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez toute ligne comme ci-dessous.
kube-apiserver-arg: - "disable-admission-plugins=...,NamespaceLifecycle,..."
1.2.14 Assurez-vous que le plugin de contrôle d’admission NodeRestriction est défini (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'enable-admission-plugins'
Résultat attendu: '--enable-admission-plugins' a 'NodeRestriction'
Valeur retournée:
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"
Correction:
Par défaut, K3s définit le --enable-admission-plugins sur NodeRestriction. Si vous utilisez le fichier de configuration K3s /etc/rancher/k3s/config.yaml, vérifiez que vous ne remplacez pas les plugins d’admission. Si c’est le cas, incluez NodeRestriction dans la liste.
kube-apiserver-arg: - "enable-admission-plugins=...,NodeRestriction,..."
1.2.15 Assurez-vous que l’argument --profiling est défini sur false (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'profiling'
Résultat attendu: '--profiling' est égal à 'false'
Valeur retournée:
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"
Correction:
Par défaut, K3s définit l’argument --profiling sur false. Si cette vérification échoue, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez toute ligne comme ci-dessous.
kube-apiserver-arg: - "profiling=true"
1.2.16 Assurez-vous que l’argument --audit-log-path est défini (Manuel)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1
Résultat attendu: '--audit-log-path' est présent
Valeur retournée:
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"
Correction:
Modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et définissez le paramètre audit-log-path sur un chemin et un fichier appropriés où vous souhaitez que les journaux d’audit soient écrits, par exemple,
kube-apiserver-arg: - "audit-log-path=/var/lib/rancher/k3s/server/logs/audit.log"
1.2.17 Assurez-vous que l’argument --audit-log-maxage est défini sur 30 ou selon ce qui est approprié (Manuel)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1
Résultat attendu: '--audit-log-maxage' est supérieur ou égal à 30
Valeur retournée:
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"
Correction:
Modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml sur le nœud de contrôle et définissez le paramètre audit-log-maxage sur 30 ou sur un nombre de jours approprié, par exemple,
kube-apiserver-arg: - "audit-log-maxage=30"
1.2.18 Assurez-vous que l’argument --audit-log-maxbackup est défini sur 10 ou selon ce qui est approprié (Manuel)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1
Résultat attendu: '--audit-log-maxbackup' est supérieur ou égal à 10
Valeur retournée:
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"
Correction:
Modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml sur le nœud de contrôle et définissez le paramètre audit-log-maxbackup sur 10 ou sur une valeur appropriée. Exemples :
kube-apiserver-arg: - "audit-log-maxbackup=10"
1.2.19 Assurez-vous que l’argument --audit-log-maxsize est défini sur 100 ou selon ce qui est approprié (Manuel)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1
Résultat attendu: '--audit-log-maxsize' est supérieur ou égal à 100
Valeur retournée:
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"
Correction:
Modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml sur le nœud de contrôle et définissez le paramètre audit-log-maxsize sur une taille appropriée en Mo. Exemples :
kube-apiserver-arg: - "audit-log-maxsize=100"
1.2.20 Assurez-vous que l’argument --request-timeout est défini selon ce qui est approprié (Manuel)
Résultat : WARN
Correction: Conformément aux directives du CIS, "il est recommandé de définir cette limite de manière appropriée et de modifier la limite par défaut de 60 secondes uniquement si nécessaire". Modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et définissez le paramètre ci-dessous si nécessaire. Exemples :
kube-apiserver-arg: - "request-timeout=300s"
1.2.21 Assurez-vous que l’argument --service-account-lookup est défini sur true (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1
Résultat attendu: '--service-account-lookup' n’est pas présent OU '--service-account-lookup' est présent
Valeur retournée:
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"
Correction:
Par défaut, K3s ne définit pas l’argument --service-account-lookup. Modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et définissez le service-account-lookup. Exemples :
kube-apiserver-arg: - "service-account-lookup=true"
Alternativement, vous pouvez supprimer le paramètre service-account-lookup de ce fichier afin que la valeur par défaut prenne effet.
1.2.22 Assurez-vous que l’argument --service-account-key-file est défini de manière appropriée (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1
Résultat attendu: '--service-account-key-file' est présent
Valeur retournée:
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"
Correction:
K3s génère automatiquement et définit le fichier de clé du compte de service. Il est situé à /var/lib/rancher/k3s/server/tls/service.key. Si cette vérification échoue, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez toutes les lignes comme ci-dessous.
kube-apiserver-arg: - "service-account-key-file=<path>"
1.2.23 Assurez-vous que les arguments --etcd-certfile et --etcd-keyfile sont définis de manière appropriée (Automatisé)
Résultat : PASS
Audit :
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
Résultat attendu: '--etcd-certfile' est présent ET '--etcd-keyfile' est présent
Valeur retournée:
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"
Correction:
K3s génère automatiquement et définit les fichiers de certificat et de clé etcd. Ils sont situés à /var/lib/rancher/k3s/server/tls/etcd/client.crt et /var/lib/rancher/k3s/server/tls/etcd/client.key. Si cette vérification échoue, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez toute ligne comme ci-dessous.
kube-apiserver-arg: - "etcd-certfile=<path>" - "etcd-keyfile=<path>"
1.2.24 Assurez-vous que les arguments --tls-cert-file et --tls-private-key-file sont définis de manière appropriée (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep -A1 'Running kube-apiserver' | tail -n2
Résultat attendu: '--tls-cert-file' est présent ET '--tls-private-key-file' est présent
Valeur retournée:
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"
Correction:
Par défaut, K3s génère automatiquement et fournit le certificat TLS et la clé privée pour l’apiserver. Ils sont générés et situés à /var/lib/rancher/k3s/server/tls/serving-kube-apiserver.crt et /var/lib/rancher/k3s/server/tls/serving-kube-apiserver.key. Si cette vérification échoue, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez toute ligne comme ci-dessous.
kube-apiserver-arg: - "tls-cert-file=<path>" - "tls-private-key-file=<path>"
1.2.25 Assurez-vous que l’argument --client-ca-file est défini de manière appropriée (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'client-ca-file'
Résultat attendu: '--client-ca-file' est présent
Valeur retournée:
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"
Correction:
Par défaut, K3s fournit automatiquement le fichier d’autorité de certification du client. Il est généré et situé à /var/lib/rancher/k3s/server/tls/client-ca.crt. Si pour une raison quelconque vous devez fournir votre propre certificat CA, envisagez d’utiliser l’outil de ligne de commande de certificat k3s. Si cette vérification échoue, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez toute ligne comme ci-dessous.
kube-apiserver-arg: - "client-ca-file=<path>"
1.2.26 Assurez-vous que l’argument --etcd-cafile est défini de manière appropriée (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'etcd-cafile'
Résultat attendu: '--etcd-cafile' est présent
Valeur retournée:
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"
Correction:
Par défaut, K3s fournit automatiquement le fichier d’autorité de certification etcd. Il est généré et situé à /var/lib/rancher/k3s/server/tls/client-ca.crt. Si pour une raison quelconque vous devez fournir votre propre certificat CA, envisagez d’utiliser l’outil de ligne de commande de certificat k3s. Si cette vérification échoue, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez toute ligne comme ci-dessous.
kube-apiserver-arg: - "etcd-cafile=<path>"
1.2.27 Assurez-vous que l’argument --encryption-provider-config est défini de manière appropriée (Manuel)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'encryption-provider-config'
Résultat attendu : '--encryption-provider-config' est présent
Valeur retournée :
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"
Correction :
K3s peut être configuré pour utiliser des fournisseurs de chiffrement afin de chiffrer les secrets au repos.
Modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml sur le nœud de contrôle et définissez le paramètre ci-dessous.
secrets-encryption: true
Le chiffrement des secrets peut ensuite être géré avec l’outil de ligne de commande k3s secrets-encrypt.
Si nécessaire, vous pouvez trouver la configuration de chiffrement générée à /var/lib/rancher/k3s/server/cred/encryption-config.json.
1.2.28 Assurez-vous que les fournisseurs de chiffrement sont configurés de manière appropriée (Manuel)
Résultat : PASS
Audit :
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
Résultat attendu : 'provider' contient des éléments valides de 'aescbc,kms,secretbox'
Valeur retournée :
provider=aescbc
Correction :
K3s peut être configuré pour utiliser des fournisseurs de chiffrement afin de chiffrer les secrets au repos. K3s utilisera le fournisseur aescbc.
Modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml sur le nœud de contrôle et définissez le paramètre ci-dessous.
secrets-encryption: true
Le chiffrement des secrets peut ensuite être géré avec l’outil de ligne de commande k3s secrets-encrypt.
Si nécessaire, vous pouvez trouver la configuration de chiffrement générée à /var/lib/rancher/k3s/server/cred/encryption-config.json
1.2.29 Assurez-vous que le serveur API n’utilise que des chiffrements cryptographiques forts (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'tls-cipher-suites'
Résultat attendu : '--tls-cipher-suites' contient des éléments valides 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'
Valeur retournée :
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"
Correction :
Par défaut, le kube-apiserver de K3s respecte ce test. Les modifications apportées à ces valeurs peuvent entraîner des régressions, assurez-vous donc que tous les clients apiserver prennent en charge la nouvelle configuration TLS avant de l’appliquer dans des déploiements en production.
Si une configuration TLS personnalisée est requise, envisagez également de créer une version personnalisée de cette règle qui correspond à vos exigences.
Si cette vérification échoue, supprimez toute configuration personnalisée autour de tls-cipher-suites ou mettez à jour le fichier /etc/rancher/k3s/config.yaml pour correspondre à la valeur par défaut en ajoutant ce qui suit :
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 Assurez-vous que le paramètre --service-account-extend-token-expiration est défini sur false (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-apiserver' | tail -n1 | grep 'service-account-extend-token-expiration'
Résultat attendu : '--service-account-extend-token-expiration' est égal à 'false'
Valeur retournée :
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"
Correction :
Modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et définissez le paramètre --service-account-extend-token-expiration sur false avant de recharger k3s, comme ci-dessous :
kube-apiserver-arg :
- "service-account-extend-token-expiration=false"
Par défaut, ce paramètre est défini sur true.
1.3 Gestionnaire de contrôleur
1.3.1 Assurez-vous que l’argument --terminated-pod-gc-threshold est défini de manière appropriée (Manuel)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-controller-manager' | tail -n1 | grep 'terminated-pod-gc-threshold'
Résultat attendu : '--terminated-pod-gc-threshold' est présent
Valeur retournée :
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"
Correction :
Modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml sur le nœud de plan de contrôle et définissez le --terminated-pod-gc-threshold à un seuil approprié,
kube-controller-manager-arg: - "terminated-pod-gc-threshold=10"
1.3.2 Assurez-vous que l’argument --profiling est défini sur false (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-controller-manager' | tail -n1 | grep 'profiling'
Résultat attendu : '--profiling' est égal à 'false'
Valeur retournée :
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"
Correction :
Par défaut, K3s définit l’argument --profiling sur false. Si cette vérification échoue, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez toutes les lignes comme ci-dessous.
kube-controller-manager-arg: - "profiling=true"
1.3.3 Assurez-vous que l’argument --use-service-account-credentials est défini sur true (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-controller-manager' | tail -n1 | grep 'use-service-account-credentials'
Résultat attendu : '--use-service-account-credentials' n’est pas égal à 'false'
Valeur retournée :
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"
Correction :
Par défaut, K3s définit l’argument --use-service-account-credentials sur true. Si cette vérification échoue, modifiez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez toutes les lignes comme ci-dessous.
kube-controller-manager-arg: - "use-service-account-credentials=false"
1.3.4 Assurez-vous que l’argument --service-account-private-key-file est défini de manière appropriée (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-controller-manager' | tail -n1 | grep 'service-account-private-key-file'
Résultat attendu : '--service-account-private-key-file' est présent
Valeur retournée :
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"
Correction :
Par défaut, K3s fournit automatiquement le fichier de clé privée du compte de service. Il est généré et situé à /var/lib/rancher/k3s/server/tls/service.current.key. Si cette vérification échoue, éditez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez toutes les lignes comme ci-dessous.
kube-controller-manager-arg: - "service-account-private-key-file=<path>"
1.3.5 Assurez-vous que l’argument --root-ca-file est défini de manière appropriée (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-controller-manager' | tail -n1 | grep 'root-ca-file'
Résultat attendu: '--root-ca-file' est présent
Valeur retournée:
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"
Remédiation:
Par défaut, K3s fournit automatiquement le fichier CA racine. Il est généré et situé à /var/lib/rancher/k3s/server/tls/server-ca.crt. Si, pour une raison quelconque, vous devez fournir votre propre certificat CA, envisagez d’utiliser l’outil de ligne de commande k3s pour les certificats. Si cette vérification échoue, éditez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez toutes les lignes comme ci-dessous.
kube-controller-manager-arg: - "root-ca-file=<path>"
1.3.6 Assurez-vous que l’argument RotateKubeletServerCertificate est défini sur true (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-controller-manager' | tail -n1
Résultat attendu: '--feature-gates' est présent OU '--feature-gates' n’est pas présent
Valeur retournée:
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"
Remédiation:
Par défaut, K3s ne définit pas le feature gate RotateKubeletServerCertificate. Si vous avez activé ce feature gate, vous devez le supprimer. Si cette vérification échoue, éditez le fichier de configuration K3s /etc/rancher/k3s/config.yaml, supprimez toutes les lignes comme ci-dessous.
kube-controller-manager-arg: - "feature-gate=RotateKubeletServerCertificate"
1.3.7 Assurez-vous que l’argument --bind-address est défini sur 127.0.0.1 (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-controller-manager' | tail -n1
Résultat attendu: '--bind-address' est égal à '127.0.0.1' OU '--bind-address' n’est pas présent
Valeur retournée:
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"
Remédiation:
Par défaut, K3s définit l’argument --bind-address sur 127.0.0.1. Si cette vérification échoue, éditez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez toutes les lignes comme ci-dessous.
kube-controller-manager-arg: - "bind-address=<IP>"
1.4 Planificateur
1.4.1 Assurez-vous que l’argument --profiling est défini sur false (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-scheduler' | tail -n1 | grep 'profiling'
Résultat attendu: '--profiling' est égal à 'false'
Valeur retournée:
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"
Remédiation:
Par défaut, K3s définit l’argument --profiling sur false. Si cette vérification échoue, éditez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez toutes les lignes comme ci-dessous.
kube-scheduler-arg: - "profiling=true"
1.4.2 Assurez-vous que l’argument --bind-address est défini sur 127.0.0.1 (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s | grep 'Running kube-scheduler' | tail -n1 | grep 'bind-address'
Résultat attendu: '--bind-address' est égal à '127.0.0.1' OU '--bind-address' n’est pas présent
Valeur retournée:
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"
Remédiation:
Par défaut, K3s définit l’argument --bind-address sur 127.0.0.1. Si cette vérification échoue, éditez le fichier de configuration K3s /etc/rancher/k3s/config.yaml et supprimez toutes les lignes comme ci-dessous.
kube-scheduler-arg: - "bind-address=<IP>"
2 Configuration du nœud Etcd
2.1 Assurez-vous que les arguments --cert-file et --key-file sont définis de manière appropriée (Manuel)
Résultat : PASS
Audit :
Résultat attendu: '.client-transport-security.cert-file' est égal à '/var/lib/rancher/k3s/server/tls/etcd/server-client.crt' ET '.client-transport-security.key-file' est égal à '/var/lib/rancher/k3s/server/tls/etcd/server-client.key'
Valeur retournée:
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
Remédiation:
Si vous utilisez sqlite ou une base de données externe, les vérifications etcd ne sont pas applicables. Lors de l’exécution avec embedded-etcd, K3s génère des fichiers de certificat et de clé pour etcd. Ceux-ci se trouvent dans /var/lib/rancher/k3s/server/tls/etcd/. Si cette vérification échoue, assurez-vous que le fichier de configuration /var/lib/rancher/k3s/server/db/etcd/config n’a pas été modifié pour utiliser des fichiers de certificat et de clé personnalisés.
2.2 Assurez-vous que l’argument --client-cert-auth est défini sur true (Manuel)
Résultat : PASS
Audit :
Résultat attendu: '.client-transport-security.client-cert-auth' est égal à 'true'
Valeur retournée:
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
Remédiation:
Si vous utilisez sqlite ou une base de données externe, les vérifications etcd ne sont pas applicables. Lors de l’exécution avec embedded-etcd, K3s définit le paramètre --client-cert-auth sur true. Si cette vérification échoue, assurez-vous que le fichier de configuration /var/lib/rancher/k3s/server/db/etcd/config n’a pas été modifié pour désactiver l’authentification par certificat client.
2.3 Assurez-vous que l’argument --auto-tls n’est pas défini sur true (Manuel)
Résultat : PASS
Audit :
Résultat attendu: '.client-transport-security.auto-tls' est présent OU '.client-transport-security.auto-tls' n’est pas présent
Valeur retournée:
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
Remédiation:
Si vous utilisez sqlite ou une base de données externe, les vérifications etcd ne sont pas applicables. Lors de l’exécution avec embedded-etcd, K3s ne définit pas le paramètre --auto-tls. Si cette vérification échoue, modifiez le fichier de spécification du pod etcd /var/lib/rancher/k3s/server/db/etcd/config sur le nœud maître et soit supprimer le paramètre --auto-tls, soit le définir sur false. client-transport-security: auto-tls: false
2.4 Assurez-vous que les arguments --peer-cert-file et --peer-key-file sont définis de manière appropriée (Manuel)
Résultat : PASS
Audit :
Résultat attendu : '.peer-transport-security.cert-file' est égal à '/var/lib/rancher/k3s/server/tls/etcd/peer-server-client.crt' ET '.peer-transport-security.key-file' est égal à '/var/lib/rancher/k3s/server/tls/etcd/peer-server-client.key'
Valeur retournée :
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
Remédiation :
Si vous utilisez sqlite ou une base de données externe, les vérifications etcd ne sont pas applicables. Lors de l’exécution avec embedded-etcd, K3s génère des fichiers de certificat et de clé pour les pairs etcd. Ceux-ci se trouvent dans /var/lib/rancher/k3s/server/tls/etcd/. Si cette vérification échoue, assurez-vous que le fichier de configuration /var/lib/rancher/k3s/server/db/etcd/config n’a pas été modifié pour utiliser des fichiers de certificat et de clé de pair personnalisés.
2.5 Assurez-vous que l’argument --peer-client-cert-auth est défini sur true (Manuel)
Résultat : PASS
Audit :
Résultat attendu : '.peer-transport-security.client-cert-auth' est égal à 'true'
Valeur retournée :
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
Remédiation :
Si vous utilisez sqlite ou une base de données externe, les vérifications etcd ne sont pas applicables. Lors de l’exécution avec embedded-etcd, K3s définit le paramètre --peer-cert-auth sur true. Si cette vérification échoue, assurez-vous que le fichier de configuration /var/lib/rancher/k3s/server/db/etcd/config n’a pas été modifié pour désactiver l’authentification par certificat client de pair.
2.6 Assurez-vous que l’argument --peer-auto-tls n’est pas défini sur true (Manuel)
Résultat : PASS
Audit :
Résultat attendu : '.peer-transport-security.auto-tls' est présent OU '.peer-transport-security.auto-tls' n’est pas présent
Valeur retournée :
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
Remédiation :
Si vous utilisez sqlite ou une base de données externe, les vérifications etcd ne sont pas applicables. Lors de l’exécution avec embedded-etcd, K3s ne définit pas le paramètre --peer-auto-tls. Si cette vérification échoue, modifiez le fichier de spécification du pod etcd /var/lib/rancher/k3s/server/db/etcd/config sur le nœud maître et soit supprimez le paramètre --peer-auto-tls, soit définissez-le sur false. peer-transport-security: auto-tls: false
2.7 Assurez-vous qu’une autorité de certification unique est utilisée pour etcd (Manuel)
Résultat : PASS
Audit :
Résultat attendu : '.peer-transport-security.trusted-ca-file' est égal à '/var/lib/rancher/k3s/server/tls/etcd/peer-ca.crt'
Valeur retournée:
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
Remédiation:
Si vous utilisez sqlite ou une base de données externe, les vérifications etcd ne sont pas applicables. Lors de l’exécution avec embedded-etcd, K3s génère une autorité de certification unique pour etcd. Ceci est situé à /var/lib/rancher/k3s/server/tls/etcd/peer-ca.crt. Si cette vérification échoue, assurez-vous que le fichier de configuration /var/lib/rancher/k3s/server/db/etcd/config n’a pas été modifié pour utiliser une autorité de certification partagée.
4.1 Fichiers de configuration des nœuds de travail
4.1.1 Assurez-vous que les permissions du fichier de service kubelet sont définies sur 600 ou plus restrictives (Automatisé)
Résultat : Sans objet
Justification:
Le kubelet est intégré dans le processus k3s. Il n’y a pas de fichier de service kubelet, toute la configuration est passée en tant qu’arguments à l’exécution.
4.1.2 Assurez-vous que la propriété du fichier de service kubelet est définie sur root:root (Automatisé)
Résultat : Sans objet
Justification:
Le kubelet est intégré dans le processus k3s. Il n’y a pas de fichier de service kubelet, toute la configuration est passée en tant qu’arguments à l’exécution.
All configuration is passed in as arguments at container run time.
4.1.3 Si le fichier kubeconfig proxy existe, assurez-vous que les permissions sont définies sur 600 ou plus restrictives (Automatisé)
Résultat : PASS
Audit :
/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'
Résultat attendu: les permissions sont 600, attendu 600 ou plus restrictives
Valeur retournée:
permissions=600
Remédiation:
Exécutez la commande ci-dessous (en fonction de l’emplacement du fichier sur votre système) sur chaque nœud de travail.
Par exemple,
chmod 600 /var/lib/rancher/k3s/agent/kubeproxy.kubeconfig
4.1.4 Si le fichier kubeconfig proxy existe, assurez-vous que la propriété est définie sur root:root (Automatisé)
Résultat : PASS
Audit :
/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'
Résultat attendu: 'root:root' est présent
Valeur retournée:
root:root
Remédiation:
Exécutez la commande ci-dessous (en fonction de l’emplacement du fichier sur votre système) sur chaque nœud de travail.
Par exemple, chown root:root /var/lib/rancher/k3s/agent/kubeproxy.kubeconfig
4.1.5 Assurez-vous que les permissions du fichier --kubeconfig kubelet.conf sont définies sur 600 ou plus restrictives (Automatisé)
Résultat : PASS
Audit :
/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'
Résultat attendu: les permissions sont 600, attendu 600 ou plus restrictives
Valeur retournée:
permissions=600
Remédiationa:
Exécutez la commande ci-dessous (en fonction de l’emplacement du fichier sur votre système) sur chaque nœud de travail.
Par exemple,
chmod 600 /var/lib/rancher/k3s/agent/kubelet.kubeconfig
4.1.6 Assurez-vous que la propriété du fichier --kubeconfig kubelet.conf est définie sur root:root (Automatisé)
Résultat : PASS
Audit :
stat -c %U:%G /var/lib/rancher/k3s/agent/kubelet.kubeconfig
Résultat attendua: 'root:root' est présent
Valeur retournée:
root:root
Remédiation:
Exécutez la commande ci-dessous (en fonction de l’emplacement du fichier sur votre système) sur chaque nœud de travail.
Par exemple,
chown root:root /var/lib/rancher/k3s/agent/kubelet.kubeconfig
4.1.7 Assurez-vous que les permissions du fichier des autorités de certification sont définies sur 600 ou plus restrictives (Automatisé)
Résultat : PASS
Audit :
stat -c permissions=%a /var/lib/rancher/k3s/agent/client-ca.crt
Résultat attendu: les permissions sont 600, attendu 600 ou plus restrictives
Valeur retournée:
permissions=600
Remédiation:
Exécutez la commande suivante pour modifier les permissions du fichier de
--client-ca-file chmod 600 /var/lib/rancher/k3s/agent/client-ca.crt
4.1.8 Assurez-vous que la propriété du fichier des autorités de certification des clients est définie sur root:root (Automatisé)
Résultat : PASS
Audit :
stat -c %U:%G /var/lib/rancher/k3s/agent/client-ca.crt
Résultat attendu: 'root:root' est égal à 'root:root'
Valeur retournée:
root:root
Remédiation:
Exécutez la commande suivante pour modifier la propriété du --client-ca-file.
chown root:root /var/lib/rancher/k3s/agent/client-ca.crt
4.1.9 Assurez-vous que le fichier de configuration --kubelet a des permissions définies sur 600 ou plus restrictives (Automatisé)
Résultat : Sans objet
Rationale:
Le kubelet est intégré dans le processus k3s. Il n’y a pas de fichier de configuration kubelet, toute la configuration est passée en tant qu’arguments à l’exécution.
4.1.10 Assurez-vous que la propriété du fichier de configuration --kubelet est définie sur root:root (Automatisé)
Résultat : Sans objet
Rationale:
Le kubelet est intégré dans le processus k3s. Il n’y a pas de fichier de configuration kubelet, toute la configuration est passée en tant qu’arguments à l’exécution.
4.2 Kubelet
4.2.1 Assurez-vous que l’argument --anonymous-auth est défini sur false (Automatisé)
Résultat : PASS
Audit :
/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'
Résultat attendu: '--anonymous-auth' est égal à 'false'
Valeur retournée:
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"
Remédiation:
Par défaut, K3s définit --anonymous-auth sur false. Si vous avez défini cela sur une valeur différente, vous devez le remettre à false. Si vous utilisez le fichier de configuration K3s /etc/rancher/k3s/config.yaml, supprimez toutes les lignes similaires à celles ci-dessous.
kubelet-arg: - "anonymous-auth=true"
Si vous utilisez la ligne de commande, modifiez le fichier de service K3s et supprimez l’argument ci-dessous. --kubelet-arg="anonymous-auth=true" En fonction de votre système, redémarrez le service k3s. Par exemple, systemctl daemon-reload systemctl restart k3s.service
4.2.2 Assurez-vous que l’argument --authorization-mode n’est pas défini sur AlwaysAllow (Automatisé)
Résultat : PASS
Audit :
/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'
Résultat attendu: '--authorization-mode' n’a pas 'AlwaysAllow'
Valeur retournée:
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"
Remédiation:
Par défaut, K3s ne définit pas l’argument --authorization-mode sur AlwaysAllow. Si vous utilisez le fichier de configuration K3s /etc/rancher/k3s/config.yaml, supprimez toutes les lignes similaires à celles ci-dessous.
kubelet-arg: - "authorization-mode=AlwaysAllow"
Si vous utilisez la ligne de commande, modifiez le fichier de service K3s et supprimez l’argument ci-dessous. --kubelet-arg="authorization-mode=AlwaysAllow" En fonction de votre système, redémarrez le service k3s. Par exemple, systemctl daemon-reload systemctl restart k3s.service
4.2.3 Assurez-vous que l’argument --client-ca-file est défini de manière appropriée (Automatisé)
Résultat : PASS
Audit :
/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'
Résultat attendu: '--client-ca-file' est présent
Valeur retournée:
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"
Remédiation:
Par défaut, K3s fournit automatiquement le certificat CA client pour le Kubelet. Il est généré et situé à /var/lib/rancher/k3s/agent/client-ca.crt
4.2.4 Vérifiez que si défini, l’argument --read-only-port est défini sur 0 (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s -u k3s-agent | grep 'Running kubelet' | tail -n1
Résultat attendu: '--read-only-port' est égal à '0' OU '--read-only-port' n’est pas présent
Valeur retournée:
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"
Remédiation:
Par défaut, K3s définit l’argument --read-only-port sur 0. Si vous avez défini cela sur une valeur différente, vous devez le remettre à 0. Si vous utilisez le fichier de configuration K3s /etc/rancher/k3s/config.yaml, supprimez toutes les lignes similaires à celles ci-dessous.
kubelet-arg: - "read-only-port=XXXX"
Si vous utilisez la ligne de commande, modifiez le fichier de service K3s et supprimez l’argument ci-dessous. --kubelet-arg="read-only-port=XXXX" En fonction de votre système, redémarrez le service k3s. Par exemple, systemctl daemon-reload systemctl restart k3s.service
4.2.5 Assurez-vous que l’argument --streaming-connection-idle-timeout n’est pas défini sur 0 (Manuel)
Résultat : PASS
Audit :
journalctl -m -u k3s -u k3s-agent | grep 'Running kubelet' | tail -n1
Résultat attendu: '--streaming-connection-idle-timeout' n’est pas égal à '0' OU '--streaming-connection-idle-timeout' n’est pas présent
Valeur retournée:
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"
Remédiation:
Si vous utilisez le fichier de configuration K3s /etc/rancher/k3s/config.yaml, définissez le paramètre suivant sur une valeur appropriée.
kubelet-arg: - "streaming-connection-idle-timeout=5m"
Si vous utilisez la ligne de commande, exécutez K3s avec --kubelet-arg="streaming-connection-idle-timeout=5m". En fonction de votre système, redémarrez le service k3s. Par exemple, systemctl restart k3s.service
4.2.6 Assurez-vous que l’argument --make-iptables-util-chains est défini sur true (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s -u k3s-agent | grep 'Running kubelet' | tail -n1
Résultat attendu : '--make-iptables-util-chains' est égal à 'true' OU '--make-iptables-util-chains' n’est pas présent
Valeur retournée :
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"
Remédiation :
Si vous utilisez le fichier de configuration K3s /etc/rancher/k3s/config.yaml, définissez le paramètre suivant.
kubelet-arg: - "make-iptables-util-chains=true"
Si vous utilisez la ligne de commande, exécutez K3s avec --kubelet-arg="make-iptables-util-chains=true". En fonction de votre système, redémarrez le service k3s. Par exemple, systemctl restart k3s.service
4.2.7 Assurez-vous que l’argument --hostname-override n’est pas défini (Automatisé)
Résultat : Sans objet
Justification :
Par défaut, K3s définit l’argument --hostname-override. Selon les directives CIS, cela est nécessaire pour se conformer aux fournisseurs de cloud qui exigent ce drapeau pour garantir que le nom d’hôte correspond aux noms des nœuds.
4.2.8 Assurez-vous que l’argument eventRecordQPS est défini à un niveau qui garantit une capture appropriée des événements (Manuel)
Résultat : PASS
Audit :
journalctl -m -u k3s -u k3s-agent | grep 'Running kubelet' | tail -n1
Résultat attendu : '--event-qps' est supérieur ou égal à 0 OU '--event-qps' n’est pas présent
Valeur retournée :
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"
Remédiation :
Par défaut, K3s définit event-qps à 0. Si vous souhaitez modifier cela, si vous utilisez le fichier de configuration K3s /etc/rancher/k3s/config.yaml, définissez le paramètre suivant à une valeur appropriée.
kubelet-arg: - "event-qps=<value>"
Si vous utilisez la ligne de commande, exécutez K3s avec --kubelet-arg="event-qps=<value>". En fonction de votre système, redémarrez le service k3s. Par exemple, systemctl restart k3s.service
4.2.9 Assurez-vous que les arguments --tls-cert-file et --tls-private-key-file sont définis de manière appropriée (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s -u k3s-agent | grep 'Running kubelet' | tail -n1
Résultat attendu : '--tls-cert-file' est présent ET '--tls-private-key-file' est présent
Valeur retournée :
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"
Remédiation :
Par défaut, K3s fournit automatiquement le certificat TLS et la clé privée pour le Kubelet. Ils sont générés et situés à /var/lib/rancher/k3s/agent/serving-kubelet.crt et /var/lib/rancher/k3s/agent/serving-kubelet.key. Si pour une raison quelconque vous devez fournir votre propre certificat et clé, vous pouvez définir les paramètres ci-dessous dans le fichier de configuration 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 Assurez-vous que l’argument --rotate-certificates n’est pas défini sur false (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s -u k3s-agent | grep 'Running kubelet' | tail -n1
Résultat attendu : '--rotate-certificates' est présent OU '--rotate-certificates' n’est pas présent
Valeur retournée :
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"
Remédiation :
Par défaut, K3s ne définit pas l’argument --rotate-certificates. Si vous avez défini ce drapeau avec une valeur de false, vous devez soit le définir sur true, soit supprimer complètement le drapeau.
Si vous utilisez le fichier de configuration K3s /etc/rancher/k3s/config.yaml, supprimez tout paramètre rotate-certificates.
Si vous utilisez la ligne de commande, supprimez le drapeau K3s --kubelet-arg="rotate-certificates".
En fonction de votre système, redémarrez le service k3s. Par exemple, systemctl restart k3s.service
4.2.11 Vérifiez que l’argument RotateKubeletServerCertificate est défini sur true (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s -u k3s-agent | grep 'Running kubelet' | tail -n1
Résultat attendu : 'RotateKubeletServerCertificate' est présent OU 'RotateKubeletServerCertificate' n’est pas présent
Valeur retournée :
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"
Remédiation :
Par défaut, K3s ne définit pas la porte de fonctionnalité RotateKubeletServerCertificate. Si vous avez activé cette porte de fonctionnalité, vous devez la supprimer. Si vous utilisez le fichier de configuration K3s /etc/rancher/k3s/config.yaml, supprimez tout paramètre feature-gate=RotateKubeletServerCertificate. Si vous utilisez la ligne de commande, supprimez le drapeau K3s --kubelet-arg="feature-gate=RotateKubeletServerCertificate". En fonction de votre système, redémarrez le service k3s. Par exemple, systemctl restart k3s.service
4.2.12 Assurez-vous que le Kubelet n’utilise que des chiffrements cryptographiques forts (Manuel)
Résultat : PASS
Audit :
journalctl -m -u k3s -u k3s-agent | grep 'Running kubelet' | tail -n1
Résultat attendu : '--tls-cipher-suites' contient des éléments valides 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'
Valeur retournée :
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"
Remédiation :
Si vous utilisez un fichier de configuration K3s /etc/rancher/k3s/config.yaml, modifiez le fichier pour définir TLSCipherSuites sur
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"
ou sur un sous-ensemble de ces valeurs. Si vous utilisez la ligne de commande, ajoutez le drapeau K3s --kubelet-arg="tls-cipher-suites=<les mêmes valeurs que ci-dessus>" En fonction de votre système, redémarrez le service k3s. Par exemple, systemctl restart k3s.service
4.2.13 Assurez-vous qu’une limite est définie sur les PIDs des pods (Manuel)
Résultat : WARN
Remédiation:
Décidez d’un niveau approprié pour ce paramètre et définissez-le, Si vous utilisez un fichier de configuration K3s /etc/rancher/k3s/config.yaml, modifiez le fichier pour définir podPidsLimit sur
kubelet-arg: - "pod-max-pids=<value>"
4.2.14 Assurez-vous que le paramètre --seccomp-default est défini sur true (Manuel)
Résultat : WARN
Remédiation:
S’il est activé, le kubelet utilisera par défaut le profil seccomp RuntimeDefault, qui est défini par l’environnement d’exécution de conteneur, au lieu d’utiliser le mode Unconfined (seccomp désactivé) (par défaut).
Si vous utilisez un fichier de configuration K3s /etc/rancher/k3s/config.yaml, modifiez le fichier pour définir seccomp-default sur kubelet-arg: - "seccomp-default=true"
4.3 kube-proxy
4.3.1 Assurez-vous que le service de métriques kube-proxy est lié à l’hôte local (Automatisé)
Résultat : PASS
Audit :
journalctl -m -u k3s -u k3s-agent | grep 'Running kube-proxy' | tail -n1
Résultat attendu: '--metrics-bind-address' est présent OU '--metrics-bind-address' n’est pas présent
Valeur retournée:
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"
Remédiation:
Modifiez ou supprimez toutes les valeurs qui lient le service de métriques à une adresse autre que l’hôte local. La valeur par défaut est 127.0.0.1:10249.
5.1 RBAC et Comptes de Service
5.1.1 Assurez-vous que le rôle de cluster-admin n’est utilisé que là où c’est nécessaire (Manuel)
Résultat : PASS
Audit :
kubectl get clusterrolebindings -o=custom-columns=ROLE:.roleRef.name,NAME:.metadata.name,SUBJECT:.subjects[*].name --no-headers | grep cluster-admin
Résultat attendu: 'cluster-admin' contient des éléments valides de 'cluster-admin, helm-kube-system-traefik, helm-kube-system-traefik-crd'
Valeur retournée:
cluster-admin cluster-admin system:masters
cluster-admin helm-kube-system-traefik helm-traefik
cluster-admin helm-kube-system-traefik-crd helm-traefik-crd
Remédiation:
Identifiez tous les clusterrolebindings au rôle de cluster-admin. Vérifiez s’ils sont utilisés et s’ils ont besoin de ce rôle ou s’ils pourraient utiliser un rôle avec moins de privilèges. K3s accorde des exceptions aux clusterrolebindings helm-kube-system-traefik et helm-kube-system-traefik-crd car ceux-ci sont nécessaires pour l’installation de traefik dans l’espace de noms kube-system pour les opérations régulières. Lorsque cela est possible, liez d’abord les utilisateurs à un rôle moins privilégié, puis supprimez le clusterrolebinding au rôle de cluster-admin :
kubectl delete clusterrolebinding [name]
5.1.2 Minimiser l’accès aux secrets (Manuel)
Résultat : PASS
Audit :
echo "canGetListWatchSecretsAsSystemAuthenticated: $(kubectl auth can-i get,list,watch secrets --all-namespaces --as=system:authenticated)"
Résultat attendu: 'canGetListWatchSecretsAsSystemAuthenticated' est égal à 'non'
Valeur retournée:
canGetListWatchSecretsAsSystemAuthenticated: no
Remédiation:
Lorsque cela est possible, supprimez l’accès de type get, list et watch aux objets Secret dans le cluster.
5.1.3 Minimiser l’utilisation de caractères génériques dans les Rôles et ClusterRoles (Manuel)
Résultat : PASS
Audit :
# 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
Résultat attendu : 'is_compliant' est égal à 'vrai'
Valeur retournée :
**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
Remédiation :
Lorsque cela est possible, remplacez toute utilisation de caractères génériques dans les clusterroles et rôles par des objets ou actions spécifiques. K3s accorde des exceptions pour les rôles de cluster suivants, qui sont nécessaires pour les opérations régulières : - 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 Minimiser l’accès à la création de pods (Manuel)
Résultat : PASS
Audit :
echo "canCreatePodsAsSystemAuthenticated: $(kubectl auth can-i create pods --all-namespaces --as=system:authenticated)"
Résultat attendu : 'canCreatePodsAsSystemAuthenticated' est égal à 'non'
Valeur retournée :
canCreatePodsAsSystemAuthenticated: no
Remédiation :
Lorsque cela est possible, supprimer l’accès à la création d’objets pod dans le cluster.
5.1.5 S’assurer que les comptes de service par défaut ne sont pas utilisés activement. (Manuel)
Résultat : WARN
Remédiation : Créer des comptes de service explicites chaque fois qu’une charge de travail Kubernetes nécessite un accès spécifique au serveur API Kubernetes. K3s fait une exception pour le compte de service par défaut dans l’espace de noms kube-system. Modifier la configuration de chaque compte de service par défaut pour inclure cette valeur automountServiceAccountToken: false Ou en utilisant kubectl :
kubectl patch serviceaccount --namespace <NAMESPACE> default --patch '{"automountServiceAccountToken": false}'
5.1.6 S’assurer que les jetons de compte de service ne sont montés que là où cela est nécessaire (Manuel)
Résultat : PASS
Audit :
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
Résultat attendu : 'is_compliant' est égal à 'vrai' OU 'service_account' contient des éléments valides de 'coredns, helm-traefik, helm-traefik-crd, traefik, metrics-server, svclb, local-path-provisioner-service-account'
Valeur retournée :
**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
Remédiation :
Modifier la définition des comptes de service et des pods qui n’ont pas besoin de monter des jetons de compte de service pour les désactiver, avec automountServiceAccountToken: false.
Si à la fois le compte de service et le .spec du pod spécifient une valeur pour automountServiceAccountToken, la spécification du pod prévaut.
Condition : Le pod est conforme à 'vrai' lorsque : - le compte de service est défini avec automountServiceAccountToken : false et le pod est défini avec automountServiceAccountToken : false ou n’est pas défini, - le compte de service est défini avec automountServiceAccountToken : true (ou n’est pas défini) et le pod est défini avec automountServiceAccountToken : false. K3s donne des exceptions aux comptes de service suivants, qui sont nécessaires pour les opérations régulières : - coredns, helm-traefik, helm-traefik-crd, traefik, metrics-server, svclb, local-path-provisioner-service-account
5.1.7 Éviter l’utilisation du groupe system:masters (Manuel)
Résultat : WARN
Remédiation : Supprimer le groupe system:masters de tous les utilisateurs du cluster.
5.1.8 Limiter l’utilisation des permissions Bind, Impersonate et Escalate dans le cluster Kubernetes (Manuel)
Résultat : WARN
Remédiation : Lorsque cela est possible, supprimer les droits impersonate, bind et escalate des sujets.
5.1.9 Minimiser l’accès à la création de volumes persistants (Manuel)
Résultat : WARN
Remédiation : Lorsque cela est possible, supprimer l’accès à la création d’objets PersistentVolume dans le cluster.
5.1.10 Minimiser l’accès à la sous-ressource proxy des nœuds (Manuel)
Résultat : WARN
Remédiation : Dans la mesure du possible, supprimer l’accès à la sous-ressource proxy des objets de nœud.
5.1.11 Minimiser l’accès à la sous-ressource d’approbation des objets de demandes de signature de certificat (Manuel)
Résultat : WARN
Remédiation : Dans la mesure du possible, supprimer l’accès à la sous-ressource d’approbation des objets de demandes de signature de certificat.
5.2 Normes de sécurité des pods
5.2.1 S’assurer que le cluster dispose d’au moins un mécanisme de contrôle de politique actif en place (Manuel)
Résultat : WARN
Remédiation: S’assurer que soit l’admission de sécurité des pods, soit un système de contrôle de politique externe est en place pour chaque espace de noms contenant des charges de travail utilisateur.
5.2.2 Minimiser l’admission de conteneurs privilégiés (Manuel)
Résultat : PASS
Audit :
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
Résultat attendu : 'is_compliant' est égal à 'vrai'
Valeur retournée :
***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
Remédiation :
Ajouter des politiques à chaque espace de noms dans le cluster qui a des charges de travail utilisateur pour restreindre l’admission de conteneurs privilégiés.
Audit : l’audit liste tous les conteneurs des pods pour récupérer leur valeur .securityContext.privileged.
Condition : is_compliant est faux si .securityContext.privileged du conteneur est défini sur true.
Par défaut, il n’y a aucune restriction sur la création de conteneurs privilégiés.
5.2.3 Minimiser l’admission de conteneurs souhaitant partager l’espace de noms de l’ID du processus hôte (Manuel)
Résultat : PASS
Audit :
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
Résultat attendu: 'is_compliant' est égal à 'vrai'
Valeur retournée:
***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
Remédiation:
Ajouter des politiques à chaque espace de noms dans le cluster qui a des charges de travail utilisateur pour restreindre l’admission de conteneurs hostPID.
Audit : l’audit récupère le champ spec.hostPID de chaque Pod.
Condition : is_compliant est faux si le champ spec.hostPID du Pod est défini sur true.
Par défaut, il n’y a aucune restriction sur la création de conteneurs hostPID.
5.2.4 Minimiser l’admission des conteneurs souhaitant partager l’espace de noms IPC de l’hôte (Manuel)
Résultat : PASS
Audit :
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
Résultat attendu: 'is_compliant' est égal à 'vrai'
Valeur retournée:
***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
Remédiation:
Ajouter des politiques à chaque espace de noms dans le cluster qui a des charges de travail utilisateur pour restreindre l’admission de conteneurs hostIPC.
Audit : l’audit récupère le champ spec.IPC de chaque Pod.
Condition : is_compliant est faux si le champ hostIPC du Pod est défini sur true.
Par défaut, il n’y a aucune restriction sur la création de conteneurs hostIPC.
5.2.5 Minimiser l’admission des conteneurs souhaitant partager l’espace de noms réseau de l’hôte (Manuel)
Résultat : PASS
Audit :
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
Résultat attendu: 'is_compliant' est égal à 'vrai'
Valeur retournée:
***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
Remédiation:
Ajouter des politiques à chaque espace de noms dans le cluster qui a des charges de travail utilisateur pour restreindre l’admission de conteneurs hostNetwork.
Audit : l’audit récupère le champ hostNetwork de chaque Pod.
Condition : is_compliant est faux si le champ hostNetwork du Pod est défini sur true.
Par défaut, il n’y a aucune restriction sur la création de conteneurs hostNetwork.
5.2.6 Minimiser l’admission des conteneurs avec allowPrivilegeEscalation (Manuel)
Résultat : PASS
Audit :
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
Résultat attendu: 'is_compliant' est égal à 'vrai'
Valeur retournée:
***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
Correction:
Ajoutez des stratégies à chaque espace de noms dans le cluster qui a des charges de travail utilisateur pour restreindre l’admission de conteneurs avec .securityContext.allowPrivilegeEscalation défini sur true.
Audit : l’audit récupère le(s) conteneur(s) de chaque Pod .securityContext.allowPrivilegeEscalation.
Condition : is_compliant est faux si .securityContext.allowPrivilegeEscalation du conteneur est défini sur true.
Par défaut : Si non défini, l’escalade de privilèges est autorisée (par défaut à vrai). Cependant, si PSP/PSA est utilisé avec un profil restricted, l’escalade de privilèges est explicitement interdite, sauf si configuré autrement.
5.2.7 Minimiser l’admission de conteneurs root (Manuel)
Résultat : WARN
Correction:
Créez une stratégie pour chaque espace de noms dans le cluster, en veillant à ce que soit MustRunAsNonRoot ou MustRunAs avec la plage d’UIDs n’incluant pas 0, soit défini.
5.2.8 Minimiser l’admission de conteneurs avec la capacité NET_RAW (Manuel)
Résultat : WARN
Correction:
Ajoutez des stratégies à chaque espace de noms dans le cluster qui a des charges de travail utilisateur pour restreindre l’admission de conteneurs avec la capacité NET_RAW.
5.2.9 Minimiser l’admission de conteneurs avec des capacités ajoutées (Manuel)
Résultat : PASS
Audit :
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
Résultat attendu: 'is_compliant' est égal à 'vrai'
Valeur retournée:
***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
Correction:
Assurez-vous que allowedCapabilities n’est pas présent dans les stratégies pour le cluster, sauf s’il est défini sur un tableau vide.
Audit : l’audit récupère les capacités ajoutées de chaque conteneur de Pod.
Condition : is_compliant est faux si des capacités ajoutées sont ajoutées pour un conteneur donné.
Par défaut : Les conteneurs s’exécutent avec un ensemble par défaut de capacités assignées par l’environnement d’exécution de conteneur.
K3s donne des exceptions aux pods suivants, qui sont nécessaires pour les opérations régulières : - coredns, svclb-traefik
5.2.10 Minimiser l’admission de conteneurs avec des capacités assignées (Manuel)
Résultat : WARN
Correction: Examinez l’utilisation des capacités dans les applications s’exécutant sur votre cluster. Lorsqu’un espace de noms contient des applications qui ne nécessitent aucune capacité Linux pour fonctionner, envisagez d’ajouter un PSP qui interdit l’admission de conteneurs ne supprimant pas toutes les capacités.
5.2.11 Minimiser l’admission des conteneurs Windows HostProcess (Manuel)
Résultat : WARN
Correction:
Ajoutez des stratégies à chaque espace de noms dans le cluster ayant des charges de travail utilisateur pour restreindre l’admission de conteneurs ayant .securityContext.windowsOptions.hostProcess défini sur true.
5.3 Politiques réseau et CNI
5.3.1 Assurez-vous que le CNI utilisé prend en charge les NetworkPolicies (Manuel)
Résultat : WARN
Correction: Si le plugin CNI utilisé ne prend pas en charge les politiques réseau, il convient d’envisager d’utiliser un autre plugin ou de trouver un mécanisme alternatif pour restreindre le trafic dans le cluster Kubernetes.
5.4 Gestion des Secrets
5.4.1 Préférez utiliser des Secrets sous forme de fichiers plutôt que des Secrets sous forme de variables d’environnement (Manuel)
Résultat : WARN
Correction: Si possible, réécrivez le code de l’application pour lire les Secrets à partir de fichiers secrets montés, plutôt que depuis des variables d’environnement.
5.6 Règles générales
5.6.1 Créer des limites administratives entre les ressources en utilisant des espaces de noms (Manuel)
Résultat : WARN
Correction: Suivez la documentation et créez des espaces de noms pour les objets dans votre déploiement selon vos besoins.
5.6.2 Assurez-vous que le profil seccomp est défini sur docker/default dans vos définitions de Pod (Manuel)
Résultat : WARN
Correction:
Utilisez securityContext pour activer le profil seccomp docker/default dans vos définitions de pod.
Un exemple est le suivant :
securityContext:
seccompProfile:
type: RuntimeDefault