
Un outil pour analyser les permissions risquées dans un cluster Kubernetes
[![GitHub release][release-img]][release]
[![License][license-img]][license]
Un outil pour scanner les clusters Kubernetes à la recherche de permissions risquées dans le modèle de contrôle d'accès basé sur les rôles (RBAC) de Kubernetes.
L'outil a été publié dans le cadre de la recherche « Securing Kubernetes Clusters by Eliminating Risky Permissions » https://www.cyberark.com/threat-research-blog/securing-kubernetes-clusters-by-eliminating-risky-permissions/.
KubiScan aide les administrateurs de clusters à identifier les permissions que des attaquants pourraient potentiellement exploiter pour compromettre les clusters. Cela peut être particulièrement utile dans les grands environnements où il y a beaucoup de permissions difficiles à suivre.
KubiScan collecte des informations sur les rôles/clusterroles, rolebindings/clusterrolebindings, utilisateurs et pods risqués, automatisant les processus manuels traditionnels et donnant aux administrateurs la visibilité nécessaire pour réduire les risques.
Vous pouvez l'exécuter comme ceci :
./docker_run.sh <kube_config_file>
# Par exemple : ./docker_run.sh ~/.kube/config
Cela copiera tous les fichiers liés dans le fichier de configuration dans le conteneur et ouvrira un shell dans le conteneur.
Pour construire l'image Docker, exécutez :
docker build -t kubiscan .
apt-get update
apt-get install -y python3 python3-pip
pip3 install -r requirements.txt
Exécutez alias kubiscan='python3 /<KubiScan_folder>/KubiScan.py' pour utiliser kubiscan.
Après avoir installé toutes les dépendances ci-dessus, vous pouvez l'exécuter de deux manières différentes :
Assurez-vous d'avoir accès au fichier ~/.kube/config et à tous les certificats pertinents, exécutez simplement :
kubiscan <command>
Par exemple : kubiscan -rs affichera tous les sujets risqués (utilisateurs, comptes de service et groupes).
Certaines fonctionnalités nécessitent un compte de service privilégié avec les permissions suivantes :
["roles", "clusterroles", "rolebindings", "clusterrolebindings", "pods", "secrets"]["get", "list"]["pods/exec"]["create", "get"]Mais la plupart des fonctionnalités ne le sont pas, vous pouvez donc utiliser ces réglages pour un compte de service limité :
Il peut être créé en exécutant :
kubectl apply -f - << EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: kubiscan-sa
namespace: default
---
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: kubiscan-sa-secret
annotations:
kubernetes.io/service-account.name: kubiscan-sa
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: kubiscan-clusterrolebinding
subjects:
- kind: ServiceAccount
name: kubiscan-sa
namespace: default
apiGroup: ""
roleRef:
kind: ClusterRole
name: kubiscan-clusterrole
apiGroup: ""
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: kubiscan-clusterrole
rules:
- apiGroups: ["*"]
resources: ["roles", "clusterroles", "rolebindings", "clusterrolebindings", "pods"]
verbs: ["get", "list"]
EOF
Notez qu'à partir de Kubernetes 1.24, la création d'un compte de service ne crée pas de secret. Cela signifie que nous devons créer le secret.
Avant 1.24, vous pouvez supprimer l'objet Secret des commandes ci-dessus et enregistrer le jeton du compte de service dans un fichier :
kubectl get secrets $(kubectl get sa kubiscan-sa -o=jsonpath='{.secrets[0].name}') -o=jsonpath='{.data.token}' | base64 -d > token
À partir de 1.24, vous n'avez rien à changer et enregistrez le jeton comme ceci :
kubectl get secrets kubiscan-sa-secret -o=jsonpath='{.data.token}' | base64 -d > token
Après avoir enregistré le jeton dans le fichier, vous pouvez l'utiliser comme ceci :
python3 ./KubiScan.py -ho <master_ip:master_port> -t /token <command>
Par exemple :
alias kubiscan='python3 /<KubiScan_folder>/KubiScan.py
kubiscan -ho 192.168.21.129:8443 -t /token -rs
Notez que vous pouvez également utiliser l'autorité de certification (ca.crt) pour vérifier la connexion SSL :
kubiscan -ho <master_ip:master_port> -t /token -c /ca.crt <command>
Pour supprimer le compte de service privilégié, exécutez les commandes suivantes :
kubectl delete clusterroles kubiscan-clusterrole
kubectl delete clusterrolebindings kubiscan-clusterrolebinding
kubectl delete sa kubiscan-sa
kubectl delete secrets kubiscan-sa-secret
Pour voir tous les exemples, exécutez python3 KubiScan.py -e ou depuis le conteneur kubiscan -e.
Un petit exemple d'utilisation de KubiScan :
Il existe un fichier nommé risky_roles.yaml. Ce fichier contient des modèles pour les rôles risqués avec priorité.
Bien que le kind de chaque rôle soit Role, ces modèles seront comparés à tout Role\ClusterRole du cluster.
Lorsque chacun de ces rôles est vérifié par rapport à un rôle du cluster, il vérifie si le rôle du cluster contient les règles du rôle risqué. Si c'est le cas, il sera marqué comme risqué.
Nous avons ajouté tous les rôles que nous avons jugés risqués, mais comme chacun peut définir le terme « risqué » de manière différente, vous pouvez modifier le fichier en ajoutant/supprimant les rôles que vous estimez plus/moins risqués.