@@ -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)"
|
||||
|
||||
Reference in New Issue
Block a user