
Ein Tool zum Scannen von Kubernetes-Clustern auf riskante Berechtigungen
Ein Werkzeug zum Scannen von Kubernetes-Clustern auf riskante Berechtigungen im rollenbasierten Zugriffskontrollmodell (RBAC) von Kubernetes.
Das Tool wurde im Rahmen der Forschung „Securing Kubernetes Clusters by Eliminating Risky Permissions“ veröffentlicht: https://www.cyberark.com/threat-research-blog/securing-kubernetes-clusters-by-eliminating-risky-permissions/.
KubiScan hilft Cluster-Administratoren, Berechtigungen zu identifizieren, die Angreifer möglicherweise ausnutzen könnten, um die Cluster zu kompromittieren.
Dies ist besonders in großen Umgebungen hilfreich, in denen es viele Berechtigungen gibt, die schwierig zu verfolgen sein können.
KubiScan sammelt Informationen über riskante Rollen/Clusterrollen, Rollenbindungen/Clusterrollenbindungen, Benutzer und Pods, automatisiert traditionelle manuelle Prozesse und gibt Administratoren die Transparenz, die sie zur Risikominderung benötigen.
So können Sie es ausführen:
./docker_run.sh <kube_config_file>
# Beispiel: ./docker_run.sh ~/.kube/config
Es kopiert alle in der Konfigurationsdatei referenzierten Dateien in den Container und öffnet eine Shell im Container.
Zum Erstellen des Docker-Images führen Sie aus:
docker build -t kubiscan .
apt-get update
apt-get install -y python3 python3-pip
pip3 install -r requirements.txt
Führen Sie alias kubiscan='python3 /<KubiScan_Ordner>/KubiScan.py' aus, um kubiscan zu verwenden.
Nach der Installation aller oben genannten Anforderungen können Sie es auf zwei Arten ausführen:
Stellen Sie sicher, dass Sie Zugriff auf die Datei ~/.kube/config und alle relevanten Zertifikate haben. Führen Sie einfach aus:
kubiscan <befehl>
Beispiel: kubiscan -rs zeigt alle riskanten Subjekte (Benutzer, Servicekonten und Gruppen) an.
Einige Funktionen erfordern ein privilegiertes Servicekonto mit den folgenden Berechtigungen:
["roles", "clusterroles", "rolebindings", "clusterrolebindings", "pods", "secrets"]["get", "list"]["pods/exec"]["create", "get"]Die meisten Funktionen benötigen dies jedoch nicht, daher können Sie diese Einstellungen für ein eingeschränktes Servicekonto verwenden:
Es kann durch Ausführen von erstellt werden:
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
Beachten Sie, dass ab Kubernetes 1.24 die Erstellung eines Servicekontos kein Secret mehr erzeugt. Das bedeutet, dass wir das Secret erstellen müssen.
Vor 1.24 können Sie das Secret-Objekt aus den obigen Befehlen entfernen und das Token des Servicekontos in einer Datei speichern:
kubectl get secrets $(kubectl get sa kubiscan-sa -o=jsonpath='{.secrets[0].name}') -o=jsonpath='{.data.token}' | base64 -d > token
Ab 1.24 müssen Sie nichts ändern und speichern das Token so:
kubectl get secrets kubiscan-sa-secret -o=jsonpath='{.data.token}' | base64 -d > token
Nach dem Speichern des Tokens in der Datei können Sie es wie folgt verwenden:
python3 ./KubiScan.py -ho <master_ip:master_port> -t /token <befehl>
Zum Beispiel:
alias kubiscan='python3 /<KubiScan_Ordner>/KubiScan.py
kubiscan -ho 192.168.21.129:8443 -t /token -rs
Beachten Sie, dass Sie auch die Zertifizierungsstelle (ca.crt) verwenden können, um die SSL-Verbindung zu überprüfen:
kubiscan -ho <master_ip:master_port> -t /token -c /ca.crt <befehl>
Um das privilegierte Servicekonto zu entfernen, führen Sie die folgenden Befehle aus:
kubectl delete clusterroles kubiscan-clusterrole
kubectl delete clusterrolebindings kubiscan-clusterrolebinding
kubectl delete sa kubiscan-sa
kubectl delete secrets kubiscan-sa-secret
Um alle Beispiele zu sehen, führen Sie python3 KubiScan.py -e oder innerhalb des Containers kubiscan -e aus.
Ein kleines Beispiel zur Nutzung von KubiScan:
Es gibt eine Datei namens risky_roles.yaml. Diese Datei enthält Vorlagen für riskante Rollen mit Priorität.
Obwohl die Art in jeder Rolle Role ist, werden diese Vorlagen mit jeder Rolle/Clusterrolle im Cluster verglichen.
Wenn jede dieser Rollen mit einer Rolle im Cluster überprüft wird, wird geprüft, ob die Rolle im Cluster die Regeln aus der riskanten Rolle enthält. Wenn dies der Fall ist, wird sie als riskant markiert.
Wir haben alle Rollen hinzugefügt, die wir als riskant erachtet haben, aber da jeder den Begriff „riskant“ anders definieren kann, können Sie die Datei ändern, indem Sie Rollen hinzufügen/entfernen, die Sie für mehr/weniger riskant halten.
Copyright (c) 2020 CyberArk Software Ltd. Alle Rechte vorbehalten
Dieses Repository ist unter der GPL-3.0-Lizenz lizenziert – siehe LICENSE für weitere Details.
Für weitere Kommentare, Vorschläge oder Fragen kontaktieren Sie Eviatar Gerzi (@g3rzi) und CyberArk Labs.