
Kubernetes 클러스터에서 위험한 권한을 스캔하는 도구
Kubernetes 클러스터에서 RBAC(Role-based access control) 권한 부여 모델의 위험한 권한을 스캔하는 도구입니다.
이 도구는 "위험한 권한 제거로 Kubernetes 클러스터 보호" 연구의 일환으로 발표되었습니다. https://www.cyberark.com/threat-research-blog/securing-kubernetes-clusters-by-eliminating-risky-permissions/
KubiScan은 클러스터 관리자가 공격자가 잠재적으로 활용하여 클러스터를 손상시킬 수 있는 권한을 식별할 수 있도록 도와줍니다.
이는 추적하기 어려운 많은 권한이 있는 대규모 환경에서 특히 유용합니다.
KubiScan은 위험한 Roles\ClusterRoles, RoleBindings\ClusterRoleBindings, 사용자 및 Pod에 대한 정보를 수집하여 기존의 수동 프로세스를 자동화하고 관리자에게 위험을 줄이는 데 필요한 가시성을 제공합니다.
다음과 같이 실행할 수 있습니다:
./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
kubiscan을 사용하려면 alias kubiscan='python3 /<KubiScan_folder>/KubiScan.py'를 실행하세요.
위의 모든 요구 사항을 설치한 후 다음 두 가지 방법으로 실행할 수 있습니다:
~/.kube/config 파일과 관련 인증서에 접근할 수 있는지 확인한 후, 다음을 실행하세요:
kubiscan <command>
예: kubiscan -rs는 모든 위험한 subjects (사용자, 서비스 계정, 그룹)를 표시합니다.
일부 기능에는 다음 권한이 있는 권한 있는 서비스 계정이 필요합니다:
["roles", "clusterroles", "rolebindings", "clusterrolebindings", "pods", "secrets"]
verbs: ["get", "list"]["pods/exec"]
verbs: ["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 <command>
예:
alias kubiscan='python3 /<KubiScan_folder>/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 <command>
권한 있는 서비스 계정을 제거하려면 다음 명령을 실행하세요:
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. All rights reserved
이 저장소는 GPL-3.0 라이선스에 따라 사용이 허가되었습니다. 자세한 내용은 LICENSE를 참조하세요.
더 많은 의견, 제안 또는 질문이 있으시면 Eviatar Gerzi (@g3rzi) 및 CyberArk Labs에 연락해 주세요.