23seriy/FALCO-in-action

GitHub: 23seriy/FALCO-in-action

一个基于 Falco 和 eBPF 的 Kubernetes 运行时安全实战演示项目,通过七种真实攻击场景帮助用户学习和验证容器运行时威胁检测能力。

Stars: 1 | Forks: 0

# 🛡️ Falco 实战 一个演示 **Falco** 的动手实践项目 —— 由 eBPF 驱动的 Kubernetes 运行时安全工具。以 NBA 场景为核心构建:集群是篮球馆,Falco 是安全监控系统,而“违规球员” Pod 就是你实时抓捕的入侵者。 [Kyverno](https://github.com/23seriy/kyverno-in-action) 在门口拦截恶意 Pod(准入控制),而 Falco 一旦它们进入集群内部,就会通过监控 Linux 内核 syscalls 来捕捉威胁 —— 例如 shell 访问、凭证窃取、挖矿等。 ![Falco](https://img.shields.io/badge/Falco-0.40+-00AEC7?logo=falco&logoColor=white) ![Kubernetes](https://img.shields.io/badge/Kubernetes-1.32-326CE5?logo=kubernetes&logoColor=white) ![Minikube](https://img.shields.io/badge/Minikube-local-F7B93E?logo=kubernetes&logoColor=white) ![Python](https://img.shields.io/badge/Python-3.12-3776AB?logo=python&logoColor=white) ![eBPF](https://img.shields.io/badge/eBPF-kernel-FF6600?logoColor=white) ## 📖 文档 - **[CLAUDE.md](CLAUDE.md)** — 架构、文件结构和常见开发任务 - **[CONTRIBUTING.md](CONTRIBUTING.md)** — 如何贡献(功能、修复、文档) - **[TESTING.md](TESTING.md)** — 手动和自动化测试流程 - **[TROUBLESHOOTING.md](TROUBLESHOOTING.md)** — 常见问题与解决方案 - **[SECURITY.md](SECURITY.md)** — 安全策略与负责任的披露 - **[CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)** — 社区准则 ## 🏗️ 架构 ``` ┌──────────────────────────────────────────────────┐ │ Minikube Cluster │ │ │ User ────────► │ arena-security-api rogue-player │ localhost:9080 │ (compliant, non-root) (attacker, root) │ │ │ │ │ │ │ normal behavior │ 🔴 attacks │ │ │ (no alerts) │ (triggers Falco) │ │ │ │ │ │ └──────────┬───────────┘ │ │ │ kernel syscalls │ │ ▼ │ │ Falco (eBPF driver) │ │ watches ALL containers │ │ │ │ │ ▼ │ │ Falcosidekick │ │ ┌────────┴────────┐ │ │ ▼ ▼ │ │ alert-dashboard Falcosidekick UI │ │ (webhook recv) (built-in web UI) │ └──────────────────────────────────────────────────┘ ``` **arena-security-api** — 合规的 NBA 球馆安保服务。以非 root 用户运行,只读文件系统,并丢弃所有 capabilities。这是永远不会触发 Falco 的“优良公民”。 **rogue-player** — 故意设计的恶意 Pod,其 HTTP endpoint 会按需触发特定的攻击行为。以 root 用户运行。每个 endpoint 都对应一条 Falco 规则。 **alert-dashboard** — 自定义 webhook 接收器,用于存储和展示由 Falcosidekick 转发的 Falco 警报。相当于球馆的安全运营中心 (SOC)。 **Falco** — 基于 eBPF 的运行时安全工具。监控所有容器内的内核 syscalls。可检测 shell 调用、文件读取、网络连接等行为。 **Falcosidekick** — 警报路由器。接收 Falco 事件并将其转发到 alert-dashboard webhook 及其内置的 UI。 ## 📋 你将学到什么 | Falco 功能 | 作用 | 演示场景 | |---|---|---| | **Shell 检测** | 捕获容器内的交互式 shell | `kubectl exec` 进入 rogue-player | | **敏感文件监控** | 读取 `/etc/shadow`、SSH 密钥时发出警报 | rogue-player 读取 `/etc/shadow` | | **二进制目录保护** | 检测对 `/usr/bin`、`/usr/sbin` 的写入行为 | rogue-player 植入后门 | | **包管理器检测** | 容器内运行 `apt-get`、`apk` 时发出警报 | rogue-player 运行包管理器 | | **K8s 凭证窃取** | 检测对 ServiceAccount token 的读取 | rogue-player 读取 SA token | | **出站连接监控** | 捕获连接到外部 IP 的行为 | rogue-player 连接到 1.1.1.1 | | **挖矿检测** | 连接到矿池端口时发出警报 | rogue-player 连接到端口 45700 | | **自定义规则编写** | 为你的环境编写规则 | `falco/custom-rules.yaml` 中的 5 条自定义规则 | | **警报路由** | 将警报转发到 webhook、UI、Slack | Falcosidekick → alert-dashboard | | **eBPF 驱动** | 无需内核模块的内核级监控 | 现代 eBPF 驱动,无需内核头文件 | ## 🚀 快速开始 ### 步骤 0:克隆仓库 ``` git clone https://github.com/23seriy/falco-in-action.git cd falco-in-action ``` ### 前置条件 - **macOS**(脚本使用 Homebrew;Linux 请自行调整) - 正在运行的 **Docker Desktop** - 为 Minikube 分配约 8 GB 内存(用于 Falco + eBPF + 演示应用) ### 步骤 1:安装工具 ``` chmod +x scripts/*.sh ./scripts/01-install-prerequisites.sh ``` 通过 Homebrew 安装 `minikube`、`kubectl`、`helm` 和 `docker`。 ### 步骤 2:启动集群 + 安装 Falco ``` ./scripts/02-start-cluster.sh ``` 在 **Kubernetes v1.32.0** 上创建使用 **containerd** runtime 的 `falco-demo` Minikube profile,安装带有**现代 eBPF 驱动**的 Falco,并安装 Falcosidekick 用于警报路由。 ### 步骤 3:构建与部署 ``` ./scripts/03-deploy-app.sh ``` 使用 `minikube image build` 在 Minikube 内部构建容器镜像,加载带有 MITRE ATT&CK 标签的自定义 Falco 规则,应用 NetworkPolicies,并部署所有三个演示应用。 ### 步骤 4:访问应用 ``` # Terminal 1:Arena Security API(合规应用) kubectl port-forward svc/arena-security-api 9080:8080 -n falco-demo # Terminal 2:Rogue Player(攻击者 pod) kubectl port-forward svc/rogue-player 9081:8080 -n falco-demo # Terminal 3:Alert Dashboard(SOC) kubectl port-forward svc/alert-dashboard 9082:8080 -n falco-demo # Terminal 4:实时查看 Falco 日志 kubectl logs -n falco-system -l app.kubernetes.io/name=falco -f ``` 试一试: ``` # 正常行为 — 无告警 curl http://localhost:9080/security/status # 触发攻击 — 观察 Falco 触发 curl http://localhost:9081/attack/shell curl http://localhost:9081/attack/sensitive curl http://localhost:9081/attack/credentials # 检查 Falco 捕获的内容 curl http://localhost:9082/alerts/summary ``` ### 步骤 5:运行演示场景 ``` ./scripts/04-demo-scenarios.sh ``` 十个交互式场景,每次展示一种攻击。 ## 🎮 演示场景 ### 1. 基准测试 —— 优良公民 无攻击行为。合规的 arena-security-api 正常处理请求。没有 Falco 警报。这就是“默认安全”的样子。 ### 2. 🐚 容器内开启 Shell —— 闯入球馆 ``` kubectl exec -n falco-demo deploy/rogue-player -- /bin/sh -c "whoami" ``` Falco 检测到:**“A shell was spawned in a container”**(容器中生成了 shell)。这是最基础也最常见的攻击媒介。NBA 的类比:球迷翻越护栏并冲入球场。 ### 3. 📄 读取敏感文件 —— 洗劫更衣室 ``` kubectl exec -n falco-demo deploy/rogue-player -- cat /etc/shadow ``` Falco 检测到:**“Sensitive file opened for reading”**(敏感文件被打开以供读取)。攻击者获取密码哈希或 SSH 密钥以进行横向移动。 ### 4. 💀 写入二进制目录下方 —— 植入后门 ``` kubectl exec -n falco-demo deploy/rogue-player -- \ /bin/sh -c "echo '#!/bin/sh' > /usr/bin/backdoor" ``` Falco 检测到:**“Write below binary dir”**(写入二进制目录下)。经典的持久化技术 —— 投递一个能在容器重启后幸存的后门。 ### 5. 📦 包管理 —— 安装攻击工具 ``` kubectl exec -n falco-demo deploy/rogue-player -- apt-get --version ``` Falco 检测到:**“Package management process launched in container”**(容器中启动了包管理进程)。容器应该是不可变的 —— 软件包应包含在镜像中,而不是在运行时安装。 ### 6. 🔑 K8s 凭证窃取 —— 偷取战术手册 ``` kubectl exec -n falco-demo deploy/rogue-player -- \ cat /var/run/secrets/kubernetes.io/serviceaccount/token ``` 触发自定义规则:**“K8s credential access detected in arena pod”**(在场馆 Pod 中检测到 K8s 凭证访问)。攻击者获取 shell 后所做的第一件事就是:读取 SA token 以便在集群内进行跳板攻击。 ### 7. 🌐 出站连接 —— 从后门溜出 ``` kubectl exec -n falco-demo deploy/rogue-player -- python -c \ "import socket; s=socket.socket(); s.settimeout(2); s.connect(('1.1.1.1',443))" ``` 触发自定义规则:**“Outbound connection from arena pod”**(场馆 Pod 发起出站连接)。捕获数据外泄和 C2 回调。 ### 8. ⛏️ 挖矿 —— 盗用球馆的电网 ``` kubectl exec -n falco-demo deploy/rogue-player -- python -c \ "import socket; s=socket.socket(); s.settimeout(2); s.connect(('1.1.1.1',45700))" ``` 触发自定义规则:**“Possible crypto mining detected in arena pod”**(场馆 Pod 中检测到可能的加密挖矿行为)。连接到已知的矿池端口(3333、4444、45700)。 ### 9. 📊 警报面板 —— 安全运营中心 检查 alert-dashboard 中累积的内容: ``` curl http://localhost:9082/alerts/summary curl http://localhost:9082/alerts/critical ``` 同时打开 Falcosidekick UI: ``` kubectl port-forward svc/falcosidekick-ui 2802:2802 -n falco-system # 打开 http://localhost:2802 ``` ### 10. 📋 全面审计 —— 赛后安全报告 查看演示中的所有 Falco 警报: ``` kubectl logs -n falco-system -l app.kubernetes.io/name=falco --tail=500 | \ grep -oE '"rule":"[^"]*"' | sort | uniq -c | sort -rn ``` ## 🗺️ MITRE ATT&CK 映射 每个演示场景都映射到 [MITRE ATT&CK for Containers](https://attack.mitre.org/matrices/enterprise/containers/) 框架中的真实攻击技术: | 场景 | MITRE 技术 | 技术 ID | Falco 规则 | 优先级 | |---|---|---|---|---| | 容器内 Shell | [Exec Into Container](https://attack.mitre.org/techniques/T1609/) | T1609 | Terminal shell in container *(内置)* | Warning | | 读取敏感文件 | [Unsecured Credentials](https://attack.mitre.org/techniques/T1552/) | T1552 | Read sensitive file untrusted *(内置)* | Warning | | 写入二进制目录下方 | [Implant Internal Image](https://attack.mitre.org/techniques/T1525/) | T1525 | Write below binary dir *(内置)* | Error | | 包管理 | [Ingress Tool Transfer](https://attack.mitre.org/techniques/T1105/) | T1105 | Launch Package Management *(内置)* | Error | | K8s 凭证窃取 | [Unsecured Credentials: Container API](https://attack.mitre.org/techniques/T1552/007/) | T1552.007 | Arena Pod Reading K8s Secrets *(自定义)* | Critical | | 出站连接 | [Exfiltration Over C2 Channel](https://attack.mitre.org/techniques/T1041/) | T1041 | Arena Pod Making Outbound Connection *(自定义)* | Warning | | 挖矿 | [Resource Hijacking](https://attack.mitre.org/techniques/T1496/) | T1496 | Arena Pod Crypto Mining Activity *(自定义)* | Critical | ## 🛡️ Kyverno + Falco:纵深防御 | 层级 | 工具 | 时机 | 捕获内容 | 示例 | |---|---|---|---|---| | **准入控制** | Kyverno | Pod 启动前 | 错误的*配置* | 缺失标签、`:latest` 标签、root 容器 | | **运行时** | Falco | Pod 运行时 | 错误的*行为* | shell 访问、凭证窃取、挖矿 | 一个 Pod 即便通过了所有的准入策略,依然可能在运行时被攻破。你需要同时具备这两层防御。 关于准入控制部分,请参见:[kyverno-in-action](https://github.com/23seriy/kyverno-in-action)。 ## 🔧 实用命令 ``` # Falco 状态 kubectl get pods -n falco-system kubectl logs -n falco-system -l app.kubernetes.io/name=falco -f # Falcosidekick 状态 kubectl logs -n falco-system -l app.kubernetes.io/name=falcosidekick # Demo pods kubectl get pods -n falco-demo # 通过 HTTP 触发攻击(kubectl exec 的替代方案) curl http://localhost:9081/attack/shell curl http://localhost:9081/attack/sensitive curl http://localhost:9081/attack/network curl http://localhost:9081/attack/writeback curl http://localhost:9081/attack/package curl http://localhost:9081/attack/credentials curl http://localhost:9081/attack/crypto curl http://localhost:9081/attack/dns # 检查告警面板 curl http://localhost:9082/alerts curl http://localhost:9082/alerts/summary curl http://localhost:9082/alerts/critical # Falcosidekick UI kubectl port-forward svc/falcosidekick-ui 2802:2802 -n falco-system ``` ## 📁 项目结构 ``` falco-in-action/ ├── apps/ │ ├── arena-security-api/ # Compliant NBA arena security service │ │ ├── app.py # Flask app — security zones, incidents, status │ │ ├── Dockerfile # Multi-stage, runs as UID 10001 │ │ └── requirements.txt │ ├── rogue-player/ # Attack simulation pod (runs as root) │ │ ├── app.py # HTTP endpoints that trigger Falco rules │ │ ├── Dockerfile # Single-stage, runs as root (intentional) │ │ └── requirements.txt │ └── alert-dashboard/ # Falcosidekick webhook receiver │ ├── app.py # Stores and displays forwarded alerts │ ├── Dockerfile # Multi-stage, runs as UID 10001 │ └── requirements.txt ├── k8s/ # Kubernetes manifests │ ├── namespace.yaml # falco-demo │ ├── arena-security-api.yaml # Compliant Deployment + Service │ ├── rogue-player.yaml # Attacker Deployment + Service (no securityContext) │ ├── alert-dashboard.yaml # SOC Deployment + Service │ └── network-policy.yaml # Default-deny + selective allow policies ├── falco/ # Falco configuration │ ├── custom-rules.yaml # 5 custom detection rules (NBA-themed) │ ├── falco-values.yaml # Falco Helm values (eBPF driver) │ └── falcosidekick-values.yaml # Falcosidekick Helm values (webhook + UI) ├── scripts/ # Automation scripts │ ├── 01-install-prerequisites.sh │ ├── 02-start-cluster.sh # Minikube + Falco + Falcosidekick │ ├── 03-deploy-app.sh # Build images + deploy apps + load rules │ ├── 04-demo-scenarios.sh # 10 interactive attack scenarios │ └── 05-teardown.sh ├── docs/ │ └── medium-story.md # Full Medium article draft ├── CLAUDE.md # Developer guide ├── CONTRIBUTING.md # How to contribute ├── TESTING.md # Testing procedures ├── TROUBLESHOOTING.md # Debug guide ├── SECURITY.md # Security policy ├── CODE_OF_CONDUCT.md # Community standards ├── LICENSE # MIT └── .gitignore ``` ## 🧹 清理 ``` ./scripts/05-teardown.sh ``` 删除所有演示资源,卸载 Falco 和 Falcosidekick,并移除 Minikube 集群。 ## 💡 关键要点 1. **仅有准入控制是不够的。** 一个完全合规的 Pod 依然可能在运行时被攻破。2024 年 Kubernetes 安全报告发现,89% 的集群中至少有一个容器存在已知漏洞。Falco 监控的是容器实际的*行为*,而不仅仅是它们的配置方式。 2. **eBPF 是实现这一切的基石。** Falco 的现代 eBPF 驱动无需内核模块、sidecar 或代码更改即可监控内核 syscalls。实现应用的零埋点。这就是为什么 Datadog、Cilium 和 Falco 都押注于 eBPF。 3. **自定义规则弥补了差距。** 默认规则覆盖了 80% 的威胁。剩下的 20% 属于*你*的环境:意外的出站连接、凭证访问模式、挖矿指标。编写自定义规则非常简单 —— 参见 `falco/custom-rules.yaml`。 4. **警报路由使其具备可操作性。** Falcosidekick 可以将警报路由到 60 多个输出端:Slack、PagerDuty、SIEM、S3、Elasticsearch 或自定义 webhook。没有通知的检测仅仅是日志记录。 5. **映射到 MITRE ATT&CK。** 每条规则都应映射到一项 MITRE 技术。这为你的 SOC 团队提供了一种通用语言,并有助于确定响应优先级。请参阅上面的[映射表](#️-mitre-attck-mapping)。 6. **纵深防御必不可少。** 准入阶段的 Kyverno + 运行时的 Falco = 没有盲区。像 NBA 球馆构建安保体系那样分层部署你的防御:门口检查身份、内部安装摄像头,并由 SOC 监控所有 feeds。 ## 📚 资源 - [Falco 文档](https://falco.org/docs/) - [Falco 规则参考](https://falco.org/docs/rules/) - [Falco 内置规则](https://github.com/falcosecurity/rules) - [Falcosidekick](https://github.com/falcosecurity/falcosidekick) - [Falcosidekick UI](https://github.com/falcosecurity/falcosidekick-ui) - [eBPF.io — 什么是 eBPF?](https://ebpf.io/) - [MITRE ATT&CK for Containers](https://attack.mitre.org/matrices/enterprise/containers/) -Minikube 文档](https://minikube.sigs.k8s.io/docs/) ## 📝 License MIT — 可自由用于学习、演示和演讲。
标签:AMSI绕过, Docker镜像, Falco, StruQ, 威胁检测, 子域名突变, 安全演示, 敏感词过滤, 请求拦截, 逆向工具