
Uma ferramenta para analisar clusters Kubernetes em busca de permissões arriscadas
[![GitHub release][release-img]][release]
[![License][license-img]][license]
Uma ferramenta para escanear clusters Kubernetes em busca de permissões arriscadas no modelo de controle de acesso baseado em funções (RBAC) do Kubernetes.
A ferramenta foi publicada como parte da pesquisa "Protegendo Clusters Kubernetes Eliminando Permissões Arriscadas" https://www.cyberark.com/threat-research-blog/securing-kubernetes-clusters-by-eliminating-risky-permissions/.
O KubiScan ajuda administradores de cluster a identificar permissões que invasores poderiam explorar para comprometer os clusters. Isso pode ser especialmente útil em ambientes grandes, onde há muitas permissões difíceis de rastrear. O KubiScan coleta informações sobre funções/funções de cluster arriscadas, vinculações de funções/vinculações de funções de cluster, usuários e pods, automatizando processos manuais tradicionais e dando aos administradores a visibilidade necessária para reduzir o risco.
Você pode executar assim:
./docker_run.sh <kube_config_file>
# Por exemplo: ./docker_run.sh ~/.kube/config
Isso copiará todos os arquivos vinculados no arquivo de configuração para o container e abrirá um shell dentro do container.
Para construir a imagem Docker, execute:
docker build -t kubiscan .
apt-get update
apt-get install -y python3 python3-pip
pip3 install -r requirements.txt
Execute alias kubiscan='python3 /<KubiScan_folder>/KubiScan.py' para usar kubiscan.
Após instalar todos os requisitos acima, você pode executá-lo de duas formas diferentes:
Certifique-se de ter acesso ao arquivo ~/.kube/config e todos os certificados relevantes. Basta executar:
kubiscan <comando>
Por exemplo: kubiscan -rs mostrará todos os subjects arriscados (usuários, service accounts e grupos).
Algumas funcionalidades exigem uma service account privilegiada com as seguintes permissões:
["roles", "clusterroles", "rolebindings", "clusterrolebindings", "pods", "secrets"]
verbs: ["get", "list"]["pods/exec"]
verbs: ["create", "get"]Mas a maioria das funcionalidades não exige, então você pode usar estas configurações para uma service account limitada: Pode ser criada executando:
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
Observe que a partir do Kubernetes 1.24, a criação de uma service account não gera um secret. Isso significa que precisamos criar o secret.
Antes do 1.24, você pode remover o objeto Secret dos comandos acima e salvar o token da service account em um arquivo:
kubectl get secrets $(kubectl get sa kubiscan-sa -o=jsonpath='{.secrets[0].name}') -o=jsonpath='{.data.token}' | base64 -d > token
A partir do 1.24, você não precisa alterar nada e salva o token assim:
kubectl get secrets kubiscan-sa-secret -o=jsonpath='{.data.token}' | base64 -d > token
Após salvar o token no arquivo, você pode usá-lo assim:
python3 ./KubiScan.py -ho <master_ip:master_port> -t /token <comando>
Por exemplo:
alias kubiscan='python3 /<KubiScan_folder>/KubiScan.py
kubiscan -ho 192.168.21.129:8443 -t /token -rs
Note que você também pode usar a autoridade certificadora (ca.crt) para verificar a conexão SSL:
kubiscan -ho <master_ip:master_port> -t /token -c /ca.crt <comando>
Para remover a service account privilegiada, execute os seguintes 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 os exemplos, execute python3 KubiScan.py -e ou de dentro do container kubiscan -e.
Um pequeno exemplo de uso do KubiScan:
Há um arquivo chamado risky_roles.yaml. Este arquivo contém modelos de funções arriscadas com prioridade.
Embora o tipo (kind) em cada função seja Role, esses modelos serão comparados com qualquer Role/ClusterRole no cluster.
Quando cada uma dessas funções é verificada em relação a uma função no cluster, ele verifica se a função no cluster contém as regras da função arriscada. Se contiver, será marcada como arriscada.
Adicionamos todas as funções que consideramos arriscadas, mas como cada um pode definir o termo "arriscado" de forma diferente, você pode modificar o arquivo adicionando/removendo funções que considera mais/menos arriscadas.