
Инструмент для сканирования кластера Kubernetes на предмет опасных разрешений
Инструмент для сканирования кластера Kubernetes на предмет опасных разрешений в модели управления доступом на основе ролей (RBAC).
Инструмент был опубликован в рамках исследования «Обеспечение безопасности кластеров Kubernetes путем устранения опасных разрешений» https://www.cyberark.com/threat-research-blog/securing-kubernetes-clusters-by-eliminating-risky-permissions/.
KubiScan помогает администраторам кластеров выявлять разрешения, которые злоумышленники потенциально могут использовать для компрометации кластеров. Это особенно полезно в крупных средах, где множество разрешений может быть трудно отследить. KubiScan собирает информацию об опасных ролях\кластерных ролях, привязках ролей\кластерных привязках ролей, пользователях и подах, автоматизируя традиционные ручные процессы и предоставляя администраторам необходимую видимость для снижения рисков.
Вы можете запустить его так:
./docker_run.sh <kube_config_file>
# Например: ./docker_run.sh ~/.kube/config
Он скопирует все файлы, указанные в конфигурационном файле, в контейнер и откроет оболочку внутри контейнера.
Чтобы создать Docker-образ, выполните:
docker build -t kubiscan .
apt-get update
apt-get install -y python3 python3-pip
pip3 install -r requirements.txt
Выполните alias kubiscan='python3 /<папка_KubiScan>/KubiScan.py', чтобы использовать kubiscan.
После установки всех вышеуказанных требований вы можете запустить его двумя способами:
Убедитесь, что у вас есть доступ к файлу ~/.kube/config и всем соответствующим сертификатам, просто выполните:
kubiscan <команда>
Например: kubiscan -rs покажет всех опасных субъектов (пользователей, сервисные аккаунты и группы).
Некоторые функции требуют привилегированной сервисной учетной записи со следующими разрешениями:
["roles", "clusterroles", "rolebindings", "clusterrolebindings", "pods", "secrets"]["get", "list"]["pods/exec"]["create", "get"]Но большинство функций не требуют этого, поэтому вы можете использовать следующие настройки для ограниченной сервисной учетной записи:
Её можно создать, выполнив:
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
Обратите внимание, что начиная с Kubernetes 1.24 создание сервисной учетной записи не создаёт секрет. Это означает, что нам нужно создать секрет.
До версии 1.24 вы можете удалить объект Secret из приведённых выше команд и сохранить токен сервисной учетной записи в файл:
kubectl get secrets $(kubectl get sa kubiscan-sa -o=jsonpath='{.secrets[0].name}') -o=jsonpath='{.data.token}' | base64 -d > token
Начиная с версии 1.24, вам не нужно ничего менять и сохранять токен так:
kubectl get secrets kubiscan-sa-secret -o=jsonpath='{.data.token}' | base64 -d > token
После сохранения токена в файл вы можете использовать его так:
python3 ./KubiScan.py -ho <master_ip:master_port> -t /token <команда>
Например:
alias kubiscan='python3 /<папка_KubiScan>/KubiScan.py'
kubiscan -ho 192.168.21.129:8443 -t /token -rs
Обратите внимание, что вы также можете использовать центр сертификации (ca.crt) для проверки SSL-соединения:
kubiscan -ho <master_ip:master_port> -t /token -c /ca.crt <команда>
Чтобы удалить привилегированную сервисную учетную запись, выполните следующие команды:
kubectl delete clusterroles kubiscan-clusterrole
kubectl delete clusterrolebindings kubiscan-clusterrolebinding
kubectl delete sa kubiscan-sa
kubectl delete secrets kubiscan-sa-secret
Чтобы увидеть все примеры, выполните python3 KubiScan.py -e или из контейнера kubiscan -e.
Небольшой пример использования KubiScan:
Существует файл с именем risky_roles.yaml. Этот файл содержит шаблоны опасных ролей с приоритетом.
Хотя вид каждой роли — Role, эти шаблоны будут сравниваться с любыми Role\ClusterRole в кластере.
При проверке каждой такой роли на соответствие роли в кластере проверяется, содержит ли роль в кластере правила из опасной роли. Если да, она будет помечена как опасная.
Мы добавили все роли, которые сочли опасными, но поскольку каждый может определять термин «опасно» по-своему, вы можете изменить файл, добавляя\удаляя роли, которые считаете более\менее опасными.
Copyright (c) 2020 CyberArk Software Ltd. Все права защищены
Этот репозиторий лицензирован под GPL-3.0 — подробнее см. в LICENSE.
Для дополнительных комментариев, предложений или вопросов обращайтесь к Eviatar Gerzi (@g3rzi) и CyberArk Labs.