175 lines
5.8 KiB
Bash
Executable File
175 lines
5.8 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.
|
|
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"
|
|
spec:
|
|
selector:
|
|
matchLabels: {}
|
|
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:
|
|
matchLabels: {}
|
|
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:
|
|
matchLabels: {}
|
|
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
|
|
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:
|
|
matchLabels: {}
|
|
process:
|
|
matchPaths:
|
|
- path: /usr/bin/nsenter
|
|
- path: /usr/sbin/nsenter
|
|
- path: /usr/bin/unshare
|
|
- path: /usr/bin/capsh
|
|
action: Block
|
|
EOF
|
|
|
|
echo " ✓ 4 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 clusterubearmorpolicies 2>/dev/null || kubectl get clusterkubearmorpholicies 2>/dev/null || \
|
|
kubectl get -f - <<< "$(kubectl api-resources --api-group=security.kubearmor.com -o name 2>/dev/null | head -1)" 2>/dev/null || \
|
|
kubectl get kubearmorpholicies --all-namespaces 2>/dev/null || \
|
|
echo " (CRDs en cours d'initialisation — vérifier dans 30s)"
|
|
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 clusterkubearmorpholicy audit-network-recon-tools --type=merge -p '{\"spec\":{\"action\":\"Block\"}}'"
|