
Uno strumento per scansionare i cluster Kubernetes alla ricerca di permessi rischiosi
Uno strumento per scansionare i cluster Kubernetes alla ricerca di autorizzazioni rischiose nel modello di controllo degli accessi basato sui ruoli (RBAC) di Kubernetes.
Lo strumento è stato pubblicato come parte della ricerca "Securing Kubernetes Clusters by Eliminating Risky Permissions" https://www.cyberark.com/threat-research-blog/securing-kubernetes-clusters-by-eliminating-risky-permissions/.
KubiScan aiuta gli amministratori dei cluster a identificare autorizzazioni che gli aggressori potrebbero potenzialmente sfruttare per compromettere i cluster. Ciò può essere particolarmente utile in ambienti di grandi dimensioni dove ci sono molte autorizzazioni difficili da tenere traccia. KubiScan raccoglie informazioni su ruoli\clusterroles, rolebindings\clusterrolebindings, utenti e pod rischiosi, automatizzando i processi manuali tradizionali e fornendo agli amministratori la visibilità necessaria per ridurre il rischio.
Puoi eseguirlo così:
./docker_run.sh <kube_config_file>
# Ad esempio: ./docker_run.sh ~/.kube/config
Copierà tutti i file collegati all'interno del file di configurazione nel container e avvierà una shell nel container.
Per costruire l'immagine Docker esegui:
docker build -t kubiscan .
apt-get update
apt-get install -y python3 python3-pip
pip3 install -r requirements.txt
Esegui alias kubiscan='python3 /<KubiScan_folder>/KubiScan.py' per usare kubiscan.
Dopo aver installato tutti i requisiti sopra, puoi eseguirlo in due modi diversi:
Assicurati di avere accesso al file ~/.kube/config e a tutti i certificati pertinenti, quindi esegui semplicemente:
kubiscan <comando>
Ad esempio: kubiscan -rs mostrerà tutti i soggetti rischiosi (utenti, service account e gruppi).
Alcune funzionalità richiedono un service account privilegiato con i seguenti permessi:
["roles", "clusterroles", "rolebindings", "clusterrolebindings", "pods", "secrets"]["get", "list"]["pods/exec"]["create", "get"]Ma la maggior parte delle funzionalità non lo richiedono, quindi puoi utilizzare queste impostazioni per un service account limitato:
Può essere creato eseguendo:
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
Nota che da Kubernetes 1.24, la creazione di un service account non genera più un secret. Ciò significa che dobbiamo creare il secret manualmente.
Prima di 1.24, puoi rimuovere l'oggetto Secret dai comandi precedenti e salvare il token del service account in un file:
kubectl get secrets $(kubectl get sa kubiscan-sa -o=jsonpath='{.secrets[0].name}') -o=jsonpath='{.data.token}' | base64 -d > token
Da 1.24, non devi cambiare nulla e salvare il token così:
kubectl get secrets kubiscan-sa-secret -o=jsonpath='{.data.token}' | base64 -d > token
Dopo aver salvato il token nel file, puoi usarlo così:
python3 ./KubiScan.py -ho <master_ip:master_port> -t /token <comando>
Ad esempio:
alias kubiscan='python3 /<KubiScan_folder>/KubiScan.py'
kubiscan -ho 192.168.21.129:8443 -t /token -rs
Nota che puoi anche utilizzare il certificato CA (ca.crt) per verificare la connessione SSL:
kubiscan -ho <master_ip:master_port> -t /token -c /ca.crt <comando>
Per rimuovere il service account privilegiato, esegui i seguenti comandi:
kubectl delete clusterroles kubiscan-clusterrole
kubectl delete clusterrolebindings kubiscan-clusterrolebinding
kubectl delete sa kubiscan-sa
kubectl delete secrets kubiscan-sa-secret
Per vedere tutti gli esempi, esegui python3 KubiScan.py -e oppure dal container kubiscan -e.
Un piccolo esempio di utilizzo di KubiScan:
Esiste un file chiamato risky_roles.yaml. Questo file contiene modelli di ruoli rischiosi con priorità.
Sebbene il tipo in ogni ruolo sia Role, questi modelli verranno confrontati con qualsiasi Ruolo\ClusterRole nel cluster.
Quando ciascuno di questi ruoli viene confrontato con un ruolo nel cluster, verifica se il ruolo nel cluster contiene le regole del ruolo rischioso. Se è così, verrà contrassegnato come rischioso.
Abbiamo aggiunto tutti i ruoli che abbiamo trovato rischiosi, ma poiché ognuno può definire il termine "rischioso" in modo diverso, puoi modificare il file aggiungendo\rimuovendo ruoli che ritieni più\meno rischiosi.
Copyright (c) 2020 CyberArk Software Ltd. Tutti i diritti riservati
Questo repository è concesso in licenza GPL-3.0 - vedi LICENSE per maggiori dettagli.
Per ulteriori commenti, suggerimenti o domande, puoi contattare Eviatar Gerzi (@g3rzi) e CyberArk Labs.