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