项目地址
https://github.com/cyberark/KubiScan
一种用于扫描 Kubernetes 集群以获取 Kubernetes 基于角色的访问控制 (RBAC) 授权模型中的风险权限的工具。 该工具作为“通过消除风险权限保护 Kubernetes 集群”研究的一部分发布 https://www.cyberark.com/threat-research-blog/securing-kubernetes-clusters-by-eliminating-risky-permissions/ 。
概述
KubiScan 帮助集群管理员识别攻击者可能利用的权限来破坏集群。 这对于存在许多难以跟踪的权限的大型环境尤其有用。 KubiScan 收集有关风险角色\集群角色、角色绑定\集群角色绑定、用户和 Pod 的信息,使传统的手动流程自动化,并为管理员提供他们降低风险所需的可见性。
它能做什么?
- 识别有风险的 Roles\ClusterRoles
- 识别有风险的 RoleBindings\ClusterRoleBindings
- 识别有风险的主题(用户、组和 ServiceAccounts)
- 识别有风险的 Pod\Container
- 从 pod 中转储令牌(全部或按命名空间)
- 获取关联的 RoleBindings\ClusterRoleBindings 到 Role、ClusterRole 或 Subject(用户、组或服务帐户)
- 列出特定类型的主题(“用户”、“组”或“服务帐户”)
- 列出 RoleBinding 或 ClusterRoleBinding 的规则
- 显示可以通过卷或环境变量访问秘密数据的 Pod
- 获取集群的引导令牌
用法
容器
你可以这样运行它:
./docker_run.sh <kube_config_file>
# For example: ./docker_run.sh ~/.kube/config
它会将配置文件中链接的所有文件复制到容器中,并将 shell 发送到容器中。
要构建 Docker 镜像运行:
docker build -t kubiscan .
直接用 Python3
先决条件:
- Python 3.6+
- 点3
- Kubernetes Python 客户端
- 漂亮的
- openssl (内置于 ubuntu 中)- 仅用于连接令牌
在 Ubuntu 上安装示例:
apt-get update
apt-get install -y python3 python3-pip
pip3 install -r requirements.txt
运行 alias kubiscan='python3 /<KubiScan_folder>/KubiScan.py'
使用 kubiscan
。
安装上述所有要求后,您可以通过两种不同的方式运行它:
使用 KubeConfig 文件:
确保您有权访问 ~/.kube/config
文件和所有相关证书,只需运行:kubiscan <command>
例如: kubiscan -rs
将显示所有有风险的主题(用户、服务帐户和组)。
从带有 ServiceAccount 令牌的远程
某些功能需要具有以下权限的 特权 服务帐户:
- 资源 :
["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 <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 用法的一个小例子:
![图片[1]-一个扫描Kubernetes集群的权限风险的工具-网络攻防学习社区-安全圈子-FancyPig's blog](https://github.com/cyberark/KubiScan/raw/assets/kubiscan_embeded.png?raw=true)
风险角色 YAML
有一个名为 risky_roles.yaml
. 此文件包含具有优先级的风险角色的模板。
尽管每个角色中的种类都是 Role
,但这些模板将与集群中的任何 Role\ClusterRole 进行比较。
当根据集群中的角色检查这些角色中的每一个时,它会检查集群中的角色是否包含来自风险角色的规则。 如果是这样,它将被标记为有风险。
我们添加了我们发现有风险的所有角色,但是因为每个角色都可以用不同的方式定义术语“有风险”,所以您可以通过添加/删除您认为风险更大/更小的角色来修改文件。
❤️ 展示案例
- 在 RSA 2020 上发表 “通过利用 RBAC 权限破坏 Kubernetes 集群”
- 在 RSA 2022 上发表 “攻击和防御 Kubernetes 集群:Kubesploit vs KubiScan”
- PortSwigger 的文章 “KubiScan:在 Black Hat 2020 上展示的开源 Kubernetes 安全工具”
没有回复内容