用于扫描Kubernetes集群中风险权限的工具
一款用于扫描Kubernetes集群中基于角色的访问控制(RBAC)授权模型下高风险权限的工具。
该工具作为"通过消除高风险权限来确保Kubernetes集群安全"研究的一部分发布 https://www.cyberark.com/threat-research-blog/securing-kubernetes-clusters-by-eliminating-risky-permissions/。
KubiScan帮助集群管理员识别攻击者可能利用来破坏集群的权限。
这在权限繁多且难以跟踪的大型环境中尤其有用。
KubiScan收集关于高风险角色/集群角色、角色绑定/集群角色绑定、用户和Pod的信息,自动化传统手动流程,为管理员提供降低风险所需的可见性。
你可以这样运行:
./docker_run.sh <kube_config_file>
# 例如:./docker_run.sh ~/.kube/config
它会将配置文件中链接的所有文件复制到容器中,并在容器内启动一个shell。
要构建Docker镜像,运行:
docker build -t kubiscan .
apt-get update
apt-get install -y python3 python3-pip
pip3 install -r requirements.txt
运行 alias kubiscan='python3 /<KubiScan_folder>/KubiScan.py' 以便使用 kubiscan。
安装完上述所有依赖后,可以通过两种方式运行:
确保你可以访问 ~/.kube/config 文件以及所有相关证书,直接运行:
kubiscan <command>
例如: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开始,创建服务账户不会自动创建Secret。这意味着我们需要手动创建Secret。
在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 的文件。该文件包含带有优先级的高风险角色模板。
尽管每个角色中的 kind 是 Role,但这些模板将与集群中的任何 Role/ClusterRole 进行比较。
当每个角色与集群中的角色进行比较时,它会检查集群中的角色是否包含高风险角色中的规则。如果包含,则标记为高风险。
我们添加了所有我们发现的高风险角色,但由于每个人对"高风险"的定义不同,你可以通过添加/删除你认为风险更高/更低的角色来修改该文件。
版权所有 (c) 2020 CyberArk Software Ltd. 保留所有权利
本仓库采用GPL-3.0许可证 - 详情参见 LICENSE。
如需更多评论、建议或疑问,请联系Eviatar Gerzi (@g3rzi) 和 CyberArk Labs。