idriss-eliguene/landlock-genprof
GitHub: idriss-eliguene/landlock-genprof
一款基于 eBPF 观察运行中 Pod 实际行为,自动生成 Kubernetes 最小权限安全策略(Landlock、seccomp、NetworkPolicy 等)的自动化工具。
Stars: 2 | Forks: 1
# landlock-genprof
[](https://github.com/idriss-eliguene/landlock-genprof/actions/workflows/ci.yml)
[](https://goreportcard.com/report/github.com/idriss-eliguene/landlock-genprof)
[](COPYRIGHT)
自动化的 Kubernetes 安全配置文件生成器 —— [Landlock](https://landlock.io/)、
`NetworkPolicy`、seccomp 和 Linux capabilities —— 基于对运行中 pod 的**观察**(即“训练运行”)构建,而非手动编写规则。
```
Container runs with broad, hand-guessed permissions
│
▼
landlock-genprof trace --pod nginx --duration 60s
│
▼
Observed runtime behavior — filesystem, network, syscalls
│
▼
Generated least-privilege profiles, confidence-annotated
✓ Filesystem → PodLock LandlockProfile
✓ Network → Kubernetes NetworkPolicy
✓ Syscalls → seccomp (security-profiles-operator)
✓ Hardening → securityContext fragment
```
**为什么:** Kubernetes 已经提供了强大的最小权限控制,但团队在正确配置它们时却面临困难 —— 策略编写是手动的、容易出错的,并且需要深厚的平台专业知识。请参阅
[`docs/product-definition-v1.md`](docs/product-definition-v1.md) 获取完整的产品定义(问题、价值主张、以及相对于
PodLock/SPO/静态合规扫描工具的定位)。
有关真实生成的配置文件,请参见 [§8 — 示例输出](#8-example-output)。
这个名称是特意致敬 `aa-genprof` / `aa-logprof` —— 即 AppArmor
配置文件生成工具。项目启动之初,Landlock 还没有类似的工具,
填补这一空白正是该名称的由来 —— 但该工具本身后来已经
从相同的训练运行中扩展到涵盖网络、syscalls 和 capabilities,而不仅仅是 Landlock 自身的文件系统/网络权限。
## 3 条命令快速体验
还没有集群?[`hack/init-vm.sh`](hack/init-vm.sh) 会构建一个一次性的
集群(包含 `kind` + Cilium + Inspektor Gadget + 一个测试 pod),详细的
分步说明请参见 [`docs/test-environment.md`](docs/test-environment.md)。
已经有集群了?请参阅
[`INSTALL.md`](INSTALL.md) —— 只要
安装好 CLI 及其 RBAC/CRD,就可以使用下面同样的三条命令。
```
kubectl landlock-genprof trace --pod nginx-demo --namespace default \
--binary /usr/sbin/nginx --duration 60s
kubectl landlock-genprof review nginx-demo
kubectl landlock-genprof apply-proposal nginx-demo
```
观察、审查、应用 —— 这就是整个循环。完整的参数参考请见:
[`docs/usage.md`](docs/usage.md);每个命令各自的选项/示例请见:
[CLI 参考](https://idriss-eliguene.github.io/landlock-genprof/cli/landlock-genprof.html)。
## 快速链接
| | |
|---|---|
| **还没有集群** | [`docs/test-environment.md`](docs/test-environment.md) —— 一次性 `kind` 集群,从零开始。 |
| **安装** | [`INSTALL.md`](INSTALL.md) —— 已经有集群了?从这里开始。 |
| **完整用法参考** | [`docs/usage.md`](docs/usage.md) —— 每一个 `trace` 参数,各占一节。 |
| **架构** | [`docs/architecture.md`](docs/architecture.md) —— 数据流、[时序图](docs/sequence-diagram.md)、[包依赖](docs/packages.md)。 |
| **演示** | [`demo/script.md`](demo/script.md) —— 一个 75 秒的演示脚本。 |
| **贡献** | [`CONTRIBUTING.md`](CONTRIBUTING.md) · [`GOVERNANCE.md`](GOVERNANCE.md) · [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) |
| **强制执行前提条件** | [`docs/enforcement-prerequisites.md`](docs/enforcement-prerequisites.md) —— PodLock/SPO/支持 NetworkPolicy 的 CNI 各自需要什么,包括 PodLock 在本项目自身的 `kind` 设置上的实际限制。 |
## 1. 问题所在
Kubernetes 有几种真正的最小权限机制 —— Landlock、
seccomp、`NetworkPolicy`、Linux capabilities —— 但它们中的每一个
都要求在任何人观察到应用程序运行之前,**预先猜测**应用程序实际需要什么,
并手动编写:
- **过于宽松** → 策略起不到任何保护作用(为了避免破坏应用程序,一切都被允许)
- **过于严格** → 应用程序在生产环境中由于罕见的代码路径而崩溃
### Landlock:旗舰示例,以及名称的由来
**Landlock** 是在内核 5.13 中引入的 Linux 安全模块(LSM),它
允许进程将自身限制在文件系统和网络的特定子集中,
**无需 root 权限**。这是一种罕见且有价值的特性:
而 AppArmor、SELinux 或 seccomp 需要管理员进行系统范围的配置,进程可以自行武装 Landlock。
在 Kubernetes 环境下,上述问题对 Landlock 来说尤为严重:
- Landlock **在 containerd/runc 中没有原生集成**,因此没有
标准的 K8s 支持(`securityContext` 无法启用 Landlock)
- Landlock **没有 `aa-genprof` 的等效工具**,无论是在
[Security Profiles Operator](https://github.com/kubernetes-sigs/security-profiles-operator)
还是在 [PodLock](https://github.com/flavio/podlock) 中都没有
这个空白正是该项目存在的原因,也是其名称的由来 —— 但
对于 seccomp 和
`NetworkPolicy` 来说,同样的“手动猜测”问题也同样存在,这就是为什么 `landlock-genprof` 会在
同一次训练运行中解决所有这些问题,而不仅仅是 Landlock:先观察,后编写
策略。
## 2. 定位 —— PodLock、SPO 与 Kubernetes 原生强制执行
`landlock-genprof` 本身不执行任何强制操作 —— 它为
现有的、相互独立的三个强制执行机制提供数据,每个领域一个:
| 领域 | 强制执行者 | 本项目生成的内容 |
|---|---|---|
| 文件系统 | [PodLock](https://github.com/flavio/podlock)([Kubewarden](https://www.kubewarden.io/) 生态系统) | `LandlockProfile` CRD |
| Syscalls (seccomp) | [security-profiles-operator](https://github.com/kubernetes-sigs/security-profiles-operator) (SPO) | `SeccompProfile` CRD |
| 网络 | 任何实现 `NetworkPolicy` 的 CNI(例如 Cilium) | Kubernetes `NetworkPolicy` |
[PodLock](https://github.com/flavio/podlock) 整体上是现有最接近的
项目 —— 它提供了 `LandlockProfile` CRD 以及在容器启动时强制执行它的 operator,但**并不生成
配置文件**:用户仍然必须手动编写它们,这恰恰是
这里要解决的问题。
```
┌─────────────────────────────────┐
landlock-genprof │ PodLock (Kubewarden) │
────────────────── │ ─────────────────────────────── │
observes the pod ──────►│ LandlockProfile CRD │
generates YAML │ K8s operator │
(human review) ──────►│ Runtime enforcement │
└─────────────────────────────────┘
```
`landlock-genprof` 是 **PodLock、SPO 和你的 CNI 的补充** ——
而不是它们中任何一个的竞争对手。它以每种工具
已经期望的格式生成配置文件,
处于链路的上游,涵盖了给定训练运行实际观察到的任何领域。
生成正确的 `LandlockProfile` 并不需要在任何地方安装 PodLock 的 operator
—— 但要看到它实际被执行,就需要安装了。请参阅
[`docs/enforcement-prerequisites.md`](docs/enforcement-prerequisites.md)
不要假设本仓库基于 `kind` 的开发设置可以端到端地
展示这一点;简而言之:根据 PodLock 自己的文档,它做不到 —— 而且
同一份文档也涵盖了 SPO 和 CNI 各自的前提条件。
## 3. 工作原理
五个核心步骤 —— 完整细节和每个可选参数请见
[`docs/usage.md`](docs/usage.md):
1. **训练运行** —— 目标 pod 正常运行设定的时长
(`landlock-genprof trace --pod ... --duration 60s`)。
2. **捕获** —— [Inspektor Gadget](https://www.inspektor-gadget.io/)
gadget 通过 eBPF 观察文件系统、网络、syscall 和 capability 活动。
3. **综合** —— 事件按目录聚合,每条规则根据观察到的
一致程度获得一个 `Confidence` 级别(`high`/`medium`/`low`)。
4. **导出** —— 每个输出打包为一个:PodLock `LandlockProfile`
(始终生成)、`NetworkPolicy`、seccomp(纯 JSON 和/或 SPO
`SeccompProfile` CR)、capabilities 片段、组合后的
`securityContext`、Markdown 审查报告 —— 外加一个
`SecurityProfileProposal` 集群对象,结合了四个可直接应用的产物,在每次运行时发布(强制的,非可选)。请参阅 [§8](#8-example-output) 获取每个输出的真实示例。
5. **人工审查** —— `landlock-genprof` 本身绝不应用任何东西。
每个产物都是审查的起点,而不是最终结果。
## 4. 技术栈
| 组件 | 选择 | 理由 |
|---|---|---|
| 语言 | **Go 1.26** | 原生 K8s 生态系统;Inspektor Gadget Go SDK |
| Tracer | **[Inspektor Gadget](https://www.inspektor-gadget.io/)** | 预先编写、CNCF 维护的 eBPF gadget —— 避免了从头编写 eBPF |
| 输出格式 | **PodLock** `LandlockProfile`、`NetworkPolicy`、seccomp(JSON + SPO CR)、capabilities、`securityContext` | 现有的、上游格式 —— 是补充,而非竞争 |
| 开发集群 | **[kind](https://kind.sigs.k8s.io/)** + **[Cilium](https://cilium.io/)** | kind 共享主机内核(Landlock/eBPF 所需);Cilium 替换了 kindnet,从而使生成的 `NetworkPolicy` 真正可被强制执行 |
| CI | **GitHub Actions** (`ubuntu-24.04`) | 内核 6.8 —— 同时涵盖 FS 和网络 Landlock;`build-and-test` + `security`(gosec、Trivy)均为必需检查 |
| License | **Apache-2.0 OR MIT** | 双重许可,接收者自行选择 —— 兼容 PodLock 和 CNCF 生态系统 |
**主要 Go 依赖**(全部在 `go.mod` 中锁定确切版本,从不使用 `@latest`):
```
github.com/inspektor-gadget/inspektor-gadget # tracer SDK (Linux-only, see internal/tracer)
sigs.k8s.io/yaml # YAML serialization
k8s.io/client-go # pod resolution
github.com/spf13/cobra # CLI
```
## 5. 仓库布局
```
landlock-genprof/
├── cmd/landlock-genprof/ CLI entry point — trace, review, version
├── internal/
│ ├── tracer/ Syscall event capture (Inspektor Gadget)
│ ├── policy/ Event aggregation → Behavior IR
│ ├── profile/ Behavior IR — independent of any output format
│ ├── exporter/ One package per output format (6 total)
│ ├── history/ TrainingHistory CRD (multi-run Confidence)
│ ├── proposal/ SecurityProfileProposal CRD
│ └── k8s/ Pod resolution, --restart, --patched-manifest-out
├── pkg/ Go types for PodLock/seccomp/SPO CRDs
├── examples/ Illustrative + real generated artifacts
├── docs/ Architecture, usage, threat model, roadmap, ...
├── deploy/ RBAC/CRD manifests + the Helm chart
├── demo/ Demo script
├── hack/ Dev VM/kernel-check scripts
└── .github/workflows/ CI (build-and-test, security)
```
## 6. 前置条件
### Linux 内核
landlock-genprof 唯一真正的硬性要求是 **kernel 版本** —— 而非
特定的发行版。`hack/` 下的任何内容都不会调用特定于发行版的包管理
器(`apt`/`dnf`/`yum`等);`check-kernel.sh`/`init-vm.sh` 仅使用
`uname`、`curl`、`tar` 和通用的 Linux 工具。任何提供
满足下列版本要求的 kernel 的发行版都应该可以工作。
| 功能 | 最低内核版本 | 说明 |
|---|---|---|
| Landlock FS | **≥ 5.13** | 文件/目录限制 |
| Landlock 网络 | **≥ 6.4** | TCP 限制(connect/bind) |
| eBPF (Inspektor Gadget) | 推荐 **≥ 5.8** | BPF ring buffer |
**实际测试过的**(这是一个“已知可用”列表,并非限制 ——
见上文):
| 发行版 | 内核 | 状态 |
|---|---|---|
| Ubuntu 24.04 | 6.8 | ✅ 已验证 |
| Ubuntu 26.04 | 7.0 | ✅ 已验证 |
检查宿主机前置条件:
```
./hack/check-kernel.sh
```
### 工具
```
go 1.26+ # Build and tests
kind # Local K8s cluster (shares host kernel)
kubectl # Cluster interaction
helm # Installing this project's own chart, and Cilium below
```
### 设置 kind 和开发集群
```
# 安装 kind(固定版本,而非 @latest)
go install sigs.k8s.io/kind@v0.32.0
# 创建 cluster —— 特意在此禁用了 CNI,详见下方说明
cat <
标签:Docker镜像, EVTX分析, Go, Landlock, Ruby工具, seccomp, Web截图, 子域名突变, 安全基线生成, 容器安全, 日志审计