Signed-off-by: Louis Labeyrie <labeyrielouis@gmail.com>
This commit is contained in:
2026-04-27 16:21:21 +02:00
parent 1e24ec3243
commit 1580a13fb6
10 changed files with 760 additions and 40 deletions

View File

@@ -111,6 +111,28 @@ fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 512
EOF
# Hardening kernel (defense in depth pour le Kube Battle)
# POURQUOI:
# kptr_restrict=2 : masque les adresses kernel dans /proc/kallsyms (anti-leak)
# dmesg_restrict=1 : dmesg réservé à root (évite leak d'infos kernel)
# ptrace_scope=2 : ptrace réservé à root (bloque attaques mémoire inter-process)
# bpf_jit_harden=2 : JIT BPF durci contre les attaques Spectre
# protected_* : durcit les liens symboliques et FIFO dans /tmp
# NOTE: unprivileged_bpf_disabled=1 est DÉLIBÉRÉMENT omis car Cilium en a besoin.
echo "Configuration sysctl hardening kernel..."
cat <<EOF | sudo tee /etc/sysctl.d/99-kube-hardening.conf
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
kernel.yama.ptrace_scope = 2
kernel.kexec_load_disabled = 1
net.core.bpf_jit_harden = 2
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
fs.protected_fifos = 2
fs.protected_regular = 2
fs.suid_dumpable = 0
EOF
sudo sysctl --system
# Configurer firewalld avec les règles Kubernetes
@@ -160,6 +182,18 @@ containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
echo "Activation du driver cgroup systemd pour containerd..."
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# Forcer le profil seccomp par défaut sur tous les containers
# POURQUOI: Sans cette option, les pods démarrent en seccomp "Unconfined" — tous les
# syscalls sont permis, y compris ceux utilisés pour l'évasion de container
# (keyctl, add_key, bpf, perf_event_open, etc.).
# Avec "runtime/default", containerd applique le profil seccomp standard
# qui bloque ~50 syscalls dangereux. Un pod qui en a besoin doit explicitement
# demander securityContext.seccompProfile.type=Unconfined (bloqué par PSA).
echo "Configuration du profil seccomp par défaut dans containerd..."
if ! grep -q 'unset_seccomp_profile' /etc/containerd/config.toml; then
sudo sed -i '/\[plugins\."io\.containerd\.grpc\.v1\.cri"\]/a\ unset_seccomp_profile = "runtime/default"' /etc/containerd/config.toml
fi
sudo systemctl restart containerd
sudo systemctl enable containerd
@@ -208,6 +242,40 @@ fi
sudo systemctl enable kubelet
# Installation et configuration d'auditd
# POURQUOI: Lors du Kube Battle, on veut savoir QUI a fait QUOI sur les VMs.
# auditd trace les execve, l'écriture de fichiers sensibles, les changements
# de configuration K8s. Indispensable pour le post-mortem et la détection
# d'évasion de container (un syscall depuis l'hôte = trace).
echo "Installation d'auditd..."
sudo dnf install -y audit
sudo systemctl enable --now auditd
sudo tee /etc/audit/rules.d/k8s.rules > /dev/null <<'EOF'
-w /etc/kubernetes/ -p wa -k k8s-config
-w /var/lib/kubelet/ -p wa -k kubelet-data
-w /var/lib/etcd/ -p wa -k etcd-data
-w /etc/containerd/ -p wa -k containerd-config
-w /usr/bin/kubectl -p x -k kubectl-exec
-w /usr/bin/kubeadm -p x -k kubeadm-exec
-w /usr/bin/crictl -p x -k crictl-exec
-a always,exit -F arch=b64 -S execve -F euid=0 -k root-exec
-a always,exit -F arch=b64 -S mount -k mount-syscall
EOF
sudo augenrules --load 2>/dev/null || sudo systemctl restart auditd
echo " ✓ auditd configuré"
# Durcissement des permissions sur les répertoires sensibles
# POURQUOI: Les répertoires K8s contiennent les certificats, les kubeconfigs et les
# données etcd. En mode 755 (défaut), tout utilisateur de la VM peut les lire.
echo "Durcissement des permissions des répertoires Kubernetes..."
sudo install -d -m 0700 /etc/kubernetes 2>/dev/null || sudo chmod 700 /etc/kubernetes 2>/dev/null || true
sudo install -d -m 0700 /var/lib/kubelet 2>/dev/null || sudo chmod 700 /var/lib/kubelet 2>/dev/null || true
if [[ "$NODE_ROLE" == "master" ]]; then
sudo install -d -m 0700 /var/lib/etcd 2>/dev/null || sudo chmod 700 /var/lib/etcd 2>/dev/null || true
fi
echo " ✓ /etc/kubernetes, /var/lib/kubelet, /var/lib/etcd en mode 0700"
echo ""
echo "=== Vérifications ==="
echo "Swap désactivé: $(free -h | grep Swap | awk '{print $2}') (doit être 0)"
@@ -219,8 +287,12 @@ else
fi
echo "Modules kernel: $(lsmod | grep -E 'overlay|br_netfilter|ip_vs|nf_conntrack' | wc -l)/7 chargés"
echo "firewalld: $(systemctl is-active firewalld)"
echo "auditd: $(systemctl is-active auditd)"
echo "containerd: $(systemctl is-active containerd)"
echo "SystemdCgroup: $(grep 'SystemdCgroup = true' /etc/containerd/config.toml > /dev/null && echo 'activé ✓' || echo 'ATTENTION: non activé!')"
echo "seccomp default: $(grep 'unset_seccomp_profile' /etc/containerd/config.toml > /dev/null && echo 'runtime/default ✓' || echo 'ATTENTION: Unconfined!')"
echo "kptr_restrict: $(sysctl -n kernel.kptr_restrict 2>/dev/null) (doit être 2)"
echo "ptrace_scope: $(sysctl -n kernel.yama.ptrace_scope 2>/dev/null) (doit être 2)"
echo ""
echo "✓ Pré-requis installés avec succès!"
echo "Version kubeadm: $(kubeadm version -o short)"