272 lines
8.5 KiB
Bash
Executable File
272 lines
8.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# Partie 1 - Installation de KubeArmor
|
|
# À exécuter sur le nœud MASTER
|
|
#
|
|
# KubeArmor = policies runtime DÉCLARATIVES (allow/block fichiers, processus, réseau)
|
|
# Complément à Tetragon : KubeArmor BLOQUE, Tetragon TRACE en profondeur.
|
|
# Les deux sont indépendants et complémentaires :
|
|
# - Attaque bloquée → KubeArmor (action immédiate)
|
|
# - Analyse forensique → Tetragon (logs syscall détaillés)
|
|
|
|
set -e
|
|
|
|
KUBEARMOR_VERSION="1.4.3"
|
|
|
|
echo "=== Installation KubeArmor ${KUBEARMOR_VERSION} ==="
|
|
echo ""
|
|
|
|
# --- Installation via Helm ---
|
|
echo "Ajout du repo Helm KubeArmor..."
|
|
helm repo add kubearmor https://kubearmor.github.io/charts 2>/dev/null || true
|
|
helm repo update
|
|
|
|
echo ""
|
|
echo "Installation de KubeArmor ${KUBEARMOR_VERSION}..."
|
|
helm upgrade --install kubearmor kubearmor/kubearmor \
|
|
--namespace kubearmor \
|
|
--create-namespace \
|
|
--version "${KUBEARMOR_VERSION}" \
|
|
--set kubearmor.defaultFilePosture=block \
|
|
--set kubearmor.defaultCapabilitiesPosture=audit \
|
|
--set kubearmor.defaultNetworkPosture=audit \
|
|
--wait --timeout=5m
|
|
|
|
echo ""
|
|
echo "Attente que KubeArmor soit opérationnel..."
|
|
kubectl wait --for=condition=ready pod \
|
|
-l app.kubernetes.io/name=kubearmor \
|
|
-n kubearmor \
|
|
--timeout=120s
|
|
|
|
echo " ✓ KubeArmor opérationnel"
|
|
|
|
# --- ClusterKubeArmorPolicies de base ---
|
|
# Ces policies s'appliquent à TOUS les pods du cluster.
|
|
# Le mode Audit log les violations sans bloquer — basculer en Block après validation.
|
|
# Le mode Block bloque la violation et génère une alerte.
|
|
|
|
echo ""
|
|
echo "Application des ClusterKubeArmorPolicies de base..."
|
|
|
|
# Policy 1 : Bloquer l'exécution de shells dans les containers
|
|
# POURQUOI: Un attaquant qui obtient l'exécution de code dans un container essaiera
|
|
# immédiatement d'ouvrir un shell pour explorer l'environnement.
|
|
# Bloquer /bin/sh, /bin/bash, etc. coupe ce vecteur.
|
|
# SCOPING : on EXCLUT les namespaces système (kube-system, kubearmor, kyverno) car
|
|
# certains pods système (CoreDNS, Cilium init, kubelet probes) lancent
|
|
# légitimement /bin/sh — bloquer cela casserait le control plane.
|
|
kubectl apply -f - <<'EOF'
|
|
apiVersion: security.kubearmor.com/v1
|
|
kind: ClusterKubeArmorPolicy
|
|
metadata:
|
|
name: block-shell-execution
|
|
annotations:
|
|
description: "Bloque l'exécution de shells dans tous les containers (hors namespaces système)"
|
|
spec:
|
|
selector:
|
|
matchExpressions:
|
|
- key: namespace
|
|
operator: NotIn
|
|
values:
|
|
- kube-system
|
|
- kubearmor
|
|
- kyverno
|
|
process:
|
|
matchPaths:
|
|
- path: /bin/sh
|
|
- path: /bin/bash
|
|
- path: /usr/bin/sh
|
|
- path: /usr/bin/bash
|
|
- path: /bin/dash
|
|
- path: /bin/zsh
|
|
- path: /usr/bin/zsh
|
|
action: Block
|
|
EOF
|
|
|
|
# Policy 2 : Bloquer l'accès aux paths sensibles de l'hôte depuis les containers
|
|
# POURQUOI: /proc/1/ expose les variables d'environnement du processus init (souvent des tokens).
|
|
# /etc/kubernetes/ contient les certificats et kubeconfigs du cluster.
|
|
# /var/lib/etcd/ contient les données etcd (même si chiffrées, les lire est suspect).
|
|
kubectl apply -f - <<'EOF'
|
|
apiVersion: security.kubearmor.com/v1
|
|
kind: ClusterKubeArmorPolicy
|
|
metadata:
|
|
name: block-sensitive-host-paths
|
|
annotations:
|
|
description: "Bloque l'accès aux paths sensibles de l'hôte depuis les containers"
|
|
spec:
|
|
selector:
|
|
matchExpressions:
|
|
- key: namespace
|
|
operator: NotIn
|
|
values:
|
|
- kube-system
|
|
- kubearmor
|
|
- kyverno
|
|
file:
|
|
matchDirectories:
|
|
- dir: /proc/1/
|
|
recursive: false
|
|
- dir: /etc/kubernetes/
|
|
recursive: true
|
|
- dir: /var/lib/etcd/
|
|
recursive: true
|
|
- dir: /run/secrets/kubernetes.io/
|
|
recursive: true
|
|
action: Block
|
|
EOF
|
|
|
|
# Policy 3 : Audit des outils de reconnaissance réseau
|
|
# POURQUOI: curl, wget, nc sont légitimes dans certaines apps mais sont aussi les premiers
|
|
# outils utilisés pour l'exfiltration de données ou la communication C2.
|
|
# On commence en Audit pour identifier les usages légitimes avant de bloquer.
|
|
kubectl apply -f - <<'EOF'
|
|
apiVersion: security.kubearmor.com/v1
|
|
kind: ClusterKubeArmorPolicy
|
|
metadata:
|
|
name: audit-network-recon-tools
|
|
annotations:
|
|
description: "Audit (puis potentiellement Block) des outils réseau dans les containers"
|
|
spec:
|
|
selector:
|
|
matchExpressions:
|
|
- key: namespace
|
|
operator: NotIn
|
|
values:
|
|
- kube-system
|
|
- kubearmor
|
|
- kyverno
|
|
process:
|
|
matchPaths:
|
|
- path: /usr/bin/curl
|
|
- path: /usr/bin/wget
|
|
- path: /bin/nc
|
|
- path: /usr/bin/nc
|
|
- path: /usr/bin/ncat
|
|
- path: /usr/bin/nmap
|
|
- path: /usr/bin/tcpdump
|
|
- path: /usr/bin/socat
|
|
action: Audit
|
|
EOF
|
|
|
|
# Policy 4 : Bloquer les outils de manipulation de capabilities et namespaces
|
|
# POURQUOI: nsenter, unshare, capsh sont utilisés pour l'évasion de containers.
|
|
# Un attaquant dans un container peut tenter de rejoindre le namespace hôte.
|
|
kubectl apply -f - <<'EOF'
|
|
apiVersion: security.kubearmor.com/v1
|
|
kind: ClusterKubeArmorPolicy
|
|
metadata:
|
|
name: block-namespace-escape-tools
|
|
annotations:
|
|
description: "Bloque les outils d'évasion de containers (nsenter, unshare, capsh)"
|
|
spec:
|
|
selector:
|
|
matchExpressions:
|
|
- key: namespace
|
|
operator: NotIn
|
|
values:
|
|
- kube-system
|
|
- kubearmor
|
|
- kyverno
|
|
process:
|
|
matchPaths:
|
|
- path: /usr/bin/nsenter
|
|
- path: /usr/sbin/nsenter
|
|
- path: /usr/bin/unshare
|
|
- path: /usr/bin/capsh
|
|
action: Block
|
|
EOF
|
|
|
|
# Policy 5 : Bloquer l'accès aux sockets containerd / docker
|
|
# POURQUOI: Si un attaquant peut monter le socket containerd/docker dans son pod
|
|
# (Kyverno bloque hostPath, mais defense in depth), il peut piloter
|
|
# directement le container runtime et créer des containers privileged.
|
|
# Vecteur classique des CVE de breakout.
|
|
kubectl apply -f - <<'EOF'
|
|
apiVersion: security.kubearmor.com/v1
|
|
kind: ClusterKubeArmorPolicy
|
|
metadata:
|
|
name: block-container-runtime-sockets
|
|
annotations:
|
|
description: "Bloque l'accès aux sockets containerd/docker depuis les containers"
|
|
spec:
|
|
selector:
|
|
matchExpressions:
|
|
- key: namespace
|
|
operator: NotIn
|
|
values:
|
|
- kube-system
|
|
- kubearmor
|
|
- kyverno
|
|
file:
|
|
matchPaths:
|
|
- path: /run/containerd/containerd.sock
|
|
- path: /var/run/containerd/containerd.sock
|
|
- path: /var/run/docker.sock
|
|
- path: /run/crio/crio.sock
|
|
action: Block
|
|
EOF
|
|
|
|
# Policy 6 : Bloquer l'écriture dans les répertoires système de l'hôte
|
|
# POURQUOI: Si un attaquant arrive à monter un répertoire hôte (ou exploite un
|
|
# breakout), bloquer l'écriture dans /etc, /usr, /bin, /sbin l'empêche
|
|
# de modifier sudoers, d'écrire un binaire setuid, ou de planter un
|
|
# CronJob de persistance dans /etc/cron.d.
|
|
kubectl apply -f - <<'EOF'
|
|
apiVersion: security.kubearmor.com/v1
|
|
kind: ClusterKubeArmorPolicy
|
|
metadata:
|
|
name: block-host-system-writes
|
|
annotations:
|
|
description: "Bloque l'écriture dans les répertoires système hôte depuis les containers"
|
|
spec:
|
|
selector:
|
|
matchExpressions:
|
|
- key: namespace
|
|
operator: NotIn
|
|
values:
|
|
- kube-system
|
|
- kubearmor
|
|
- kyverno
|
|
file:
|
|
matchDirectories:
|
|
- dir: /etc/
|
|
recursive: true
|
|
readOnly: true
|
|
- dir: /usr/
|
|
recursive: true
|
|
readOnly: true
|
|
- dir: /bin/
|
|
recursive: true
|
|
readOnly: true
|
|
- dir: /sbin/
|
|
recursive: true
|
|
readOnly: true
|
|
- dir: /boot/
|
|
recursive: true
|
|
readOnly: true
|
|
action: Block
|
|
EOF
|
|
|
|
echo " ✓ 6 ClusterKubeArmorPolicies appliquées"
|
|
|
|
# --- Vérifications ---
|
|
echo ""
|
|
echo "=== Vérifications ==="
|
|
echo ""
|
|
echo "1. Pods KubeArmor:"
|
|
kubectl get pods -n kubearmor
|
|
echo ""
|
|
echo "2. ClusterKubeArmorPolicies actives:"
|
|
kubectl get clusterkubearmorpolicies 2>/dev/null || \
|
|
echo " (CRDs en cours d'initialisation — vérifier dans 30s avec: kubectl get clusterkubearmorpolicies)"
|
|
echo ""
|
|
echo "✓ KubeArmor installé avec succès!"
|
|
echo ""
|
|
echo "Logs KubeArmor en temps réel :"
|
|
echo " kubectl logs -n kubearmor -l app=kubearmor -f"
|
|
echo ""
|
|
echo "NOTE: La policy 'audit-network-recon-tools' est en mode Audit."
|
|
echo " Après validation des apps légitimes, passer en Block :"
|
|
echo " kubectl patch clusterkubearmorpolicy audit-network-recon-tools --type=merge -p '{\"spec\":{\"action\":\"Block\"}}'"
|