一个扫描Kubernetes集群的权限风险的工具-网络攻防学习社区-安全圈子-FancyPig's blog

一个扫描Kubernetes集群的权限风险的工具

项目地址

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

先决条件:

在 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

风险角色 YAML

有一个名为 risky_roles.yaml . 此文件包含具有优先级的风险角色的模板。
尽管每个角色中的种类都是 Role ,但这些模板将与集群中的任何 Role\ClusterRole 进行比较。
当根据集群中的角色检查这些角色中的每一个时,它会检查集群中的角色是否包含来自风险角色的规则。 如果是这样,它将被标记为有风险。
我们添加了我们发现有风险的所有角色,但是因为每个角色都可以用不同的方式定义术语“有风险”,所以您可以通过添加/删除您认为风险更大/更小的角色来修改文件。

❤️ 展示案例

 

请登录后发表评论

    没有回复内容