
Una herramienta para escanear clústeres de Kubernetes en busca de permisos riesgosos.
Una herramienta para escanear clústeres de Kubernetes en busca de permisos riesgosos en el modelo de control de acceso basado en roles (RBAC) de Kubernetes.
La herramienta se publicó como parte de la investigación "Securing Kubernetes Clusters by Eliminating Risky Permissions" https://www.cyberark.com/threat-research-blog/securing-kubernetes-clusters-by-eliminating-risky-permissions/.
KubiScan ayuda a los administradores de clústeres a identificar permisos que los atacantes podrían explotar para comprometer los clústeres.
Esto puede ser especialmente útil en entornos grandes donde hay muchos permisos que pueden ser difíciles de rastrear.
KubiScan recopila información sobre roles/clusterroles, rolebindings/clusterrolebindings, usuarios y pods riesgosos, automatizando procesos manuales tradicionales y brindando a los administradores la visibilidad que necesitan para reducir el riesgo.
Puedes ejecutarlo así:
./docker_run.sh <kube_config_file>
# Por ejemplo: ./docker_run.sh ~/.kube/config
Copiará todos los archivos vinculados dentro del archivo de configuración al contenedor e iniciará un shell en el contenedor.
Para construir la imagen de Docker, ejecuta:
docker build -t kubiscan .
apt-get update
apt-get install -y python3 python3-pip
pip3 install -r requirements.txt
Ejecuta alias kubiscan='python3 /<KubiScan_folder>/KubiScan.py' para usar kubiscan.
Después de instalar todos los requisitos anteriores, puedes ejecutarlo de dos formas diferentes:
Asegúrate de tener acceso al archivo ~/.kube/config y todos los certificados relevantes, simplemente ejecuta:
kubiscan <comando>
Por ejemplo: kubiscan -rs mostrará todos los subjects riesgosos (usuarios, service accounts y grupos).
Algunas funcionalidades requieren una cuenta de servicio privilegiada con los siguientes permisos:
["roles", "clusterroles", "rolebindings", "clusterrolebindings", "pods", "secrets"]["get", "list"]["pods/exec"]["create", "get"]Pero la mayoría de las funcionalidades no lo requieren, por lo que puedes usar esta configuración para una cuenta de servicio limitada:
Se puede crear ejecutando:
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
Ten en cuenta que desde Kubernetes 1.24, la creación de una cuenta de servicio no crea un secret. Esto significa que necesitamos crear el secret.
Antes de 1.24, puedes eliminar el objeto Secret de los comandos anteriores y guardar el token de la cuenta de servicio en un archivo:
kubectl get secrets $(kubectl get sa kubiscan-sa -o=jsonpath='{.secrets[0].name}') -o=jsonpath='{.data.token}' | base64 -d > token
Desde 1.24, no necesitas cambiar nada y guarda el token así:
kubectl get secrets kubiscan-sa-secret -o=jsonpath='{.data.token}' | base64 -d > token
Después de guardar el token en el archivo, puedes usarlo así:
python3 ./KubiScan.py -ho <master_ip:master_port> -t /token <comando>
Por ejemplo:
alias kubiscan='python3 /<KubiScan_folder>/KubiScan.py
kubiscan -ho 192.168.21.129:8443 -t /token -rs
Observa que también puedes usar la autoridad certificadora (ca.crt) para verificar la conexión SSL:
kubiscan -ho <master_ip:master_port> -t /token -c /ca.crt <comando>
Para eliminar la cuenta de servicio privilegiada, ejecuta los siguientes comandos:
kubectl delete clusterroles kubiscan-clusterrole
kubectl delete clusterrolebindings kubiscan-clusterrolebinding
kubectl delete sa kubiscan-sa
kubectl delete secrets kubiscan-sa-secret
Para ver todos los ejemplos, ejecuta python3 KubiScan.py -e o desde el contenedor kubiscan -e.
Un pequeño ejemplo del uso de KubiScan:
Hay un archivo llamado risky_roles.yaml. Este archivo contiene plantillas para roles riesgosos con prioridad.
Aunque el kind en cada rol es Role, estas plantillas se compararán con cualquier Role\ClusterRole en el clúster.
Cuando se compara cada uno de estos roles con un rol en el clúster, verifica si el rol en el clúster contiene las reglas del rol riesgoso. Si es así, se marcará como riesgoso.
Agregamos todos los roles que consideramos riesgosos, pero como cada persona puede definir el término "riesgoso" de manera diferente, puedes modificar el archivo añadiendo\eliminando roles que consideres más\menos riesgosos.
Copyright (c) 2020 CyberArk Software Ltd. Todos los derechos reservados
Este repositorio está licenciado bajo GPL-3.0 License - consulta LICENSE para más detalles.
Para más comentarios, sugerencias o preguntas, puedes contactar a Eviatar Gerzi (@g3rzi) y CyberArk Labs.