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

@@ -71,11 +71,11 @@ else
check_fail "Pods KubeArmor non Running"
fi
KUBEARMOR_POLICIES=$(kubectl get clusterkubearmorpholicies 2>/dev/null | grep -c "block\|audit" || echo "0")
if [[ "$KUBEARMOR_POLICIES" -ge 4 ]]; then
KUBEARMOR_POLICIES=$(kubectl get clusterkubearmorpolicies --no-headers 2>/dev/null | wc -l || echo "0")
if [[ "$KUBEARMOR_POLICIES" -ge 6 ]]; then
check_ok "ClusterKubeArmorPolicies actives: ${KUBEARMOR_POLICIES}"
else
check_fail "ClusterKubeArmorPolicies insuffisantes (trouvées: ${KUBEARMOR_POLICIES}, attendues: 4)"
check_fail "ClusterKubeArmorPolicies insuffisantes (trouvées: ${KUBEARMOR_POLICIES}, attendues: 6)"
fi
echo ""
@@ -87,12 +87,11 @@ else
check_fail "Pods Kyverno non Running"
fi
KYVERNO_POLICIES=$(kubectl get clusterpolicies 2>/dev/null | grep -c "pass\|fail" || \
kubectl get clusterpolicies 2>/dev/null | tail -n +2 | wc -l || echo "0")
if [[ "$KYVERNO_POLICIES" -ge 8 ]]; then
KYVERNO_POLICIES=$(kubectl get clusterpolicies --no-headers 2>/dev/null | wc -l || echo "0")
if [[ "$KYVERNO_POLICIES" -ge 14 ]]; then
check_ok "ClusterPolicies Kyverno actives: ${KYVERNO_POLICIES}"
else
check_fail "ClusterPolicies Kyverno insuffisantes (trouvées: ${KYVERNO_POLICIES}, attendues: 8)"
check_fail "ClusterPolicies Kyverno insuffisantes (trouvées: ${KYVERNO_POLICIES}, attendues: 14)"
fi
echo ""
@@ -190,6 +189,93 @@ kubectl wait --for=condition=available deployment/cluster-verify-test \
check_fail "Déploiement légitime échoué (vérifier les policies)"
echo ""
# --- 11. Test KubeArmor : blocage de l'exécution de shell ---
echo "11. KubeArmor - blocage shell dans pod externe:"
# Créer un pod test dans un namespace simulant l'équipe externe
kubectl create namespace kubearmor-test --dry-run=client -o yaml | kubectl apply -f - > /dev/null 2>&1
CLEANUP_RESOURCES+=("namespace/kubearmor-test")
kubectl run kubearmor-test-pod \
--image=busybox:1.36 \
--restart=Never \
-n kubearmor-test \
-- sleep 3600 2>/dev/null || true
kubectl wait --for=condition=ready pod/kubearmor-test-pod -n kubearmor-test --timeout=60s 2>/dev/null || true
# Tenter d'exécuter /bin/sh — KubeArmor doit refuser via la policy block-shell-execution
SHELL_OUTPUT=$(kubectl exec -n kubearmor-test kubearmor-test-pod -- /bin/sh -c 'echo blocked-test' 2>&1 || true)
if echo "$SHELL_OUTPUT" | grep -qiE "permission denied|operation not permitted|block"; then
check_ok "KubeArmor bloque l'exécution de /bin/sh"
else
# Note: KubeArmor peut nécessiter ~30s pour propager la policy, et certains
# busybox embarquent /bin/sh avec un chemin différent. Pas critique en CTF.
check_fail "KubeArmor n'a pas bloqué /bin/sh (policy peut-être pas propagée, ou chemin différent)"
fi
echo ""
# --- 12. Test RBAC : SA externe ne doit pas pouvoir lister les nodes ---
echo "12. RBAC - SA external-deployer ne peut pas lister les nodes:"
SA_NS="external-app"
SA_NAME="external-deployer"
if kubectl get sa "$SA_NAME" -n "$SA_NS" >/dev/null 2>&1; then
if kubectl auth can-i list nodes \
--as="system:serviceaccount:${SA_NS}:${SA_NAME}" 2>/dev/null | grep -q "^no$"; then
check_ok "SA externe ne peut pas lister les nodes"
else
check_fail "PROBLÈME: SA externe peut lister les nodes (énumération possible)"
fi
if kubectl auth can-i create clusterrolebindings \
--as="system:serviceaccount:${SA_NS}:${SA_NAME}" 2>/dev/null | grep -q "^no$"; then
check_ok "SA externe ne peut pas créer de ClusterRoleBinding"
else
check_fail "PROBLÈME: SA externe peut créer des ClusterRoleBindings"
fi
if kubectl auth can-i get secrets \
--as="system:serviceaccount:${SA_NS}:${SA_NAME}" -n kube-system 2>/dev/null | grep -q "^no$"; then
check_ok "SA externe ne peut pas lire les secrets de kube-system"
else
check_fail "PROBLÈME: SA externe peut lire les secrets de kube-system"
fi
else
echo " ⓘ SA $SA_NAME pas encore créé (lancer 08-generate-restricted-kubeconfig.sh)"
fi
echo ""
# --- 13. Test Kyverno : NodePort doit être refusé ---
echo "13. Kyverno - rejet service NodePort:"
NODEPORT_OUTPUT=$(kubectl create service nodeport kyverno-test-nodeport \
--tcp=80:80 \
--node-port=31999 \
--dry-run=server 2>&1 || true)
if echo "$NODEPORT_OUTPUT" | grep -qiE "disallow-nodeport|admission webhook|denied"; then
check_ok "Service NodePort correctement refusé par Kyverno"
else
check_fail "Service NodePort NON refusé — vérifier la ClusterPolicy disallow-nodeport-loadbalancer"
fi
echo ""
# --- 14. Test Kyverno : ClusterRole avec wildcard refusé ---
echo "14. Kyverno - rejet ClusterRole avec verbe '*':"
WILDCARD_OUTPUT=$(kubectl apply --dry-run=server -f - 2>&1 <<'YAML' || true
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: kyverno-wildcard-test
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
YAML
)
if echo "$WILDCARD_OUTPUT" | grep -qiE "block-rbac-wildcards|admission webhook|denied"; then
check_ok "ClusterRole avec wildcards correctement refusé par Kyverno"
else
check_fail "ClusterRole avec wildcards NON refusé — vérifier la ClusterPolicy block-rbac-wildcards"
fi
echo ""
# --- Résumé ---
echo "============================================="
echo " RÉSUMÉ DES VÉRIFICATIONS"