基于Ludus的K8s安全靶场自动化部署 :ludus_k8s

admin 2026年4月27日15:46:25评论162 views字数 5296阅读17分39秒阅读模式

本文介绍了基于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 检测规则。在撰写那篇博客的三个月里,我发现我大部分时间都只是花在让环境正常工作上。安全研究往往就是这样。

基于Ludus的K8s安全靶场自动化部署 :ludus_k8s

搭建和配置环境确实有助于提升技能,也能让人更全面地理解不同工具。但与此同时,它也可能成为安全研究的一大入门障碍。正是这个问题,构成了 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

此外,针对需要在单个集群中部署多个节点的用户场景,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 等具体配置。

基于Ludus的K8s安全靶场自动化部署 :ludus_k8s

2.2 遥测(Telemetry)

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

基于Ludus的K8s安全靶场自动化部署 :ludus_k8s

有一些预定义的 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安全靶场自动化部署 :ludus_k8s
交流群

基于Ludus的K8s安全靶场自动化部署 :ludus_k8s

原文始发于微信公众号(云原生安全指北):基于Ludus的K8s安全靶场自动化部署

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2026年4月27日15:46:25
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   基于Ludus的K8s安全靶场自动化部署 :ludus_k8shttp://cn-sec.com/archives/5199244.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息