
Uma ferramenta para analisar clusters Kubernetes em busca de permissões arriscadas
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.
Copyright (c) 2020 CyberArk Software Ltd. Todos os direitos reservados
Este repositório é licenciado sob a Licença GPL-3.0 – veja o arquivo LICENSE para mais detalhes.
Para mais comentários, sugestões ou perguntas, entre em contato com Eviatar Gerzi (@g3rzi) e CyberArk Labs.