本文介绍了基于Ludus的Kubernetes安全靶场自动化部署工具ludus_k8s,利用Ansible和Packer在Proxmox上快速构建用于安全研究的K8s环境。支持microk8s与kubeadm两种部署方式,集成Falco进行运行时检测、Grafana/Loki日志可视化,并提供多种易受攻击配置选项,如未认证API访问、ETCD暴露等,简化了K8s攻防实验环境搭建。
注:本文翻译自Alexis Obeng[1]的文章《Automating Kubernetes Security Labs with Ludus》[2],可点击文末“阅读原文”按钮查看英文原文。
全文如下:
Github 仓库地址:
https://github.com/heilancoos/ludus_k8s[3]
一、简介
我在《Attacking and Defending Kubernetes》[4]这篇博客中,介绍了几种不同的攻击技术,并为它们提供了 Falco 检测规则。在撰写那篇博客的三个月里,我发现我大部分时间都只是花在让环境正常工作上。安全研究往往就是这样。

搭建和配置环境确实有助于提升技能,也能让人更全面地理解不同工具。但与此同时,它也可能成为安全研究的一大入门障碍。正是这个问题,构成了 Bad Sector Labs[5] 发布其网络靶场部署工具 Ludus[6] 的核心理念。Ludus 允许用户使用 Ansible 和 Packer 在 Proxmox 中快速、便捷地部署环境。这让安全研究变得无比轻松,我真希望自己能早点知道它。
我决定发布一套 Ansible 角色,让为安全研究搭建 Kubernetes 环境这件事变得更简单。本文将介绍 ludus_k8s 的主要功能。
二、架构概览
ludus_k8s 支持 microk8s 和 kubeadm 两种集群部署方式。默认为 microk8s,但可以通过在主配置文件中设置 k8s_flavor 来选择另一种方式。
Falco 负责运行时检测。它监视节点活动,并基于预定义或自定义规则发出告警。我在另一篇博客此处[7]中更深入地讨论了 Falco。然后,Falcosidekick 会将这些告警转发到配置好的端点。ludus_k8s 内置了对运行 Falcosidekick UI 来展示告警的支持。它还支持 Grafana/Loki 技术栈,其中 Loki 作为集中式日志聚合中心,Grafana 随后在仪表板中对这些日志进行可视化。

此外,针对需要在单个集群中部署多个节点的用户场景,ludus_k8s 的两种部署方式都支持多节点功能。
最后,鉴于这一切都是为了安全研究,ludus_k8s 提供了一种简便的方法来配置常见的易受攻击的错误配置,例如:对 API Server 和 Kubelet API 的未认证访问、ETCD 服务暴露、不安全的 RBAC 配置等等。
2.1 核心 K8s 功能
install_k8s 角色负责处理集群配置和植入漏洞等功能。默认的集群方案(flavor)是 microk8s。
2.1.1 Pods
custom_pods 接受一个列表,其中每个条目可以是一个内联的 Pod 清单(manifest),也可以是一个指向 YAML 文件的路径字符串。
custom_pods:
# 内联 Pod 规格
- apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: default
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
# 文件路径
- "/home/localuser/my-deployment.yaml"
2.1.2 RBAC
服务账号(Service Accounts)、命名空间(Namespaces)、角色/集群角色(Roles/ClusterRoles)以及角色绑定/集群角色绑定(RoleBindings/ClusterRoleBindings)可以分别通过 rbac_namespaces、rbac_service_accounts、rbac_roles 和 rbac_bindings 进行配置。
rbac_namespaces:
- dev
rbac_service_accounts:
- name: app-sa
namespace: dev
rbac_roles:
- kind: ClusterRole
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list"]
rbac_bindings:
- kind: ClusterRoleBinding
name: secret-reader-binding
role_ref:
kind: ClusterRole
name: secret-reader
subjects:
- kind: ServiceAccount
name: app-sa
namespace: dev
2.1.3 网络策略(Network Policies)
对于 kubeadm 部署,可以通过 k8s_cni 启用特定的网络策略提供商(Network Policies Providers)。目前支持的提供商有 Calico 和 Cilium。
对于 microk8s,可以通过 enable_network_policies 启用 Calico。
2.1.4 Pod 安全准入(Pod Security Admission,PSA)
PSA[8] 是一种准入控制器(Admission Controller),它可以强制执行 Pod 安全标准(Pod Security Standards)。这些标准定义了 Pod 的不同隔离级别。可通过 enable_pod_security_admission 启用它,并通过 psa_namespaces 进行定义:
psa_namespaces:
- name: prod
enforce: restricted
audit: restricted
warn: restricted
- name: staging
enforce: baseline
2.1.5 准入控制器(Admission Controllers)
enable_admission_controller 将部署一个 Kyverno 准入控制器,该控制器可以是验证型(Validating)或变更型(Mutating)的。有四个预定义策略:block_privileged、require_labels、inject_security_context 和 add_default_labels。
-
• block_privileged:一个验证型准入控制器,拒绝部署任何特权容器和 hostPath 挂载。 -
• require_labels:一个验证型准入控制器,要求命名空间和 Pod 上必须包含 environment 和 app 标签。 -
• inject_security_context:一个变更型准入控制器,向 Pod 注入经过加固的 securityContext。 -
• add_default_labels:一个变更型准入控制器,为缺少 environment 标签的命名空间添加该标签。
也可以通过 kyverno_custom_policies 传入自定义策略。
2.1.6 多节点(Multinode)
对于简单的环境,单个节点通常就足够了。对于更复杂的环境,可以使用多节点集群来确保高可用性。一个多节点集群由一个主节点(Master)和一个或多个工作节点(Worker)组成。
主节点是控制平面(Control Plane)所在的位置,负责处理诸如工作负载调度之类的事务。工作节点则是实际运行工作负载的地方。
注意:在具有多个节点的 microk8s 集群上,高可用性由 Dqlite 而非 ETCD 管理。因此,在配置了 multinode: true 的 microk8s 集群上,unauth_etcd 功能不可用。
2.1.7 Headlamp 仪表板
由于 Kubernetes Dashboard 已被弃用,Headlamp 可作为替代方案。
enable_headlamp 会部署 Headlamp 仪表板,并且可以定义诸如 headlamp_namespace 和 headlamp_nodeport 等具体配置。

2.2 遥测(Telemetry)
Falco 默认安装,它同时依赖系统调用(syscalls)和 k8saudit 进行检测。UI 的选择由 ui 定义,支持 grafana 或 falcosidekick,后者会部署 FalcoSidekick Web UI。

有一些预定义的 Falco 规则位于 roles/telemetry/tasks/deps/rules.yaml 中,以便查阅。falco_custom_rules 接受一个由规则名称组成的字符串列表,用于通过 Helm 部署。
示例:
falco_custom_rules:
- "Anonymous Request Allowed"
2.3 不安全配置
2.3.1 未认证的 API 访问
启用 enable_unauth_api 和 enable_unauth_kubelet 可以配置对 API Server 和 Kubelet API 的未认证访问。此外,Kubelet API 的授权模式会被设置为 AlwaysAllow。
然而,enable_unauth_api 不会更改授权模式。anon_cluster_admin: true 会将 cluster-admin 角色绑定到 system:anonymous 用户。
2.3.2 未认证的 ETCD 访问
unauth_etcd: true 会在不要求认证的情况下暴露 ETCD,并安装 etcdctl 和 kubetcd。
2.3.3 匿名集群管理员
anon_cluster_admin 会将 cluster-admin 角色绑定到 system:anonymous 用户。
2.3.4 通过 Nodes/Proxy GET 权限实现 Kubernetes 远程代码执行
这是一种由 Graham Helton[9] 首次详述的技术。gh_nodes_proxy 会启用一个演示环境,该环境设置了一个具有 nodes/proxy get 权限的 ClusterRole。
有关该技术如何工作的详细信息,请参见此处[10](译文详见:K8s RCE 0-day漏洞剖析:仅需nodes/proxy GET权限即可接管集群)。
2.3.5 Pod 远程代码执行
demo_pod_rce: true 会部署一个存在命令注入漏洞的 Flask 应用。
三、总结
我希望这套 Ansible 角色集合能对安全研究人员、系统管理员以及任何希望深入研究 Kubernetes 的人有所帮助。关于未来的扩展计划,我希望能增加对其他 Kubernetes 部署方法的支持,并添加更多功能,让部署 Kubernetes 集群变得更加容易上手。
引用链接
[1] Alexis Obeng: https://heilancoos.github.io/about
[2] 《Automating Kubernetes Security Labs with Ludus》: https://heilancoos.github.io/research/2026/04/22/ludus-k8s.html
[3] https://github.com/heilancoos/ludus_k8s: https://github.com/heilancoos/ludus_k8s
[4] 《Attacking and Defending Kubernetes》: https://heilancoos.github.io/research/2025/12/16/kubernetes.html
[5] Bad Sector Labs: https://blog.badsectorlabs.com/
[6] Ludus: https://docs.ludus.cloud/
[7] 此处: https://heilancoos.github.io/research/2025/12/16/kubernetes.html#falco
[8] PSA: https://kubernetes.io/docs/concepts/security/pod-security-admission/
[9] Graham Helton: https://grahamhelton.com/
[10] 此处: https://grahamhelton.com/blog/nodes-proxy-rce


原文始发于微信公众号(云原生安全指北):基于Ludus的K8s安全靶场自动化部署
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-


评论