#!/bin/bash # Partie 1 - Initialisation du control plane # À exécuter UNIQUEMENT sur le nœud MASTER set -e echo "=== Initialisation du Control Plane Kubernetes (hardened) ===" APISERVER_IP=$(hostname -I | awk '{print $1}') POD_CIDR="10.244.0.0/16" SERVICE_CIDR="10.96.0.0/12" echo "IP API server : $APISERVER_IP" echo "Pod CIDR : $POD_CIDR" echo "Service CIDR : $SERVICE_CIDR" echo "" # --- Audit logging --- echo "Création de la politique d'audit..." sudo mkdir -p /var/log/kubernetes/audit sudo mkdir -p /etc/kubernetes/audit sudo tee /etc/kubernetes/audit/audit-policy.yaml > /dev/null <<'EOF' apiVersion: audit.k8s.io/v1 kind: Policy omitStages: - RequestReceived rules: # Tracer tous les accès aux secrets et configmaps (données sensibles) - level: RequestResponse resources: - group: "" resources: ["secrets", "configmaps"] # Tracer les modifications RBAC (vecteur d'escalade de privilèges) - level: RequestResponse resources: - group: "rbac.authorization.k8s.io" resources: ["clusterroles", "clusterrolebindings", "roles", "rolebindings"] # Tracer exec/portforward/attach (accès interactif aux pods — vecteur d'attaque courant) - level: RequestResponse resources: - group: "" resources: ["pods/exec", "pods/portforward", "pods/attach"] # Tracer toutes les créations/suppressions/modifications (niveau Metadata pour réduire le volume) - level: Metadata verbs: ["create", "delete", "patch", "update"] # Ignorer le bruit des health checks et composants systèmes - level: None users: ["system:kube-proxy"] verbs: ["watch"] resources: - group: "" resources: ["endpoints", "services", "services/status"] - level: None users: ["system:apiserver"] verbs: ["get"] resources: - group: "" resources: ["namespaces"] - level: None nonResourceURLs: ["/healthz*", "/readyz*", "/livez*", "/metrics"] # Défaut : niveau Metadata pour tout le reste - level: Metadata EOF # --- Chiffrement etcd at-rest --- echo "Génération de la clé de chiffrement etcd..." sudo mkdir -p /etc/kubernetes/encryption ENCRYPTION_KEY=$(dd if=/dev/urandom bs=32 count=1 2>/dev/null | base64) sudo tee /etc/kubernetes/encryption/encryption-config.yaml > /dev/null < /dev/null <<'EOF' apiVersion: apiserver.config.k8s.io/v1 kind: AdmissionConfiguration plugins: - name: EventRateLimit configuration: apiVersion: eventratelimit.admission.k8s.io/v1alpha1 kind: Configuration limits: - type: Namespace qps: 50 burst: 100 cacheSize: 2000 - type: User qps: 10 burst: 50 - name: PodSecurity configuration: apiVersion: pod-security.admission.config.k8s.io/v1 kind: PodSecurityConfiguration defaults: enforce: "baseline" enforce-version: "latest" audit: "restricted" audit-version: "latest" warn: "restricted" warn-version: "latest" exemptions: namespaces: - kube-system - kubearmor - kyverno - cilium-system usernames: [] runtimeClasses: [] EOF # --- kubeadm config --- echo "Création de la configuration kubeadm..." cat > /tmp/kubeadm-config.yaml <