
LeitWacht Agent v0.9.0
eBPF + nftables + DNS 代理出口强制,用于 GitLab Runner CI/CD 作业容器 — 社区版数据平面 https://leitwacht.eu/
leitwacht-agent
https://leitwacht.eu — 真实源头:https://gitlab.com/leitwacht/leitwacht-agent. 问题、合并请求和讨论请到 GitLab。
Pre-1.0.状态 0.x系列处于预稳定阶段;在1.0发布前,次要版本可能包含对API、环境变量名、Helm
values.yaml键和规则文件模式的重大变更。生产环境中请固定使用镜像摘要(而不是浮动标签)。升级说明见CHANGELOG.md。
leitwacht GitLab Runner出口控制系统的数据面代理。eBPF + nftables + 网络命名空间内的DNS代理挂载到每个CI Runner容器,并实施出口策略。CE(本仓库)从本地YAML文件读取规则,完全独立运行——无需后端、无回调、无注册。
另外授权的企业版(gitlab.com/leitwacht/leitwacht)增加了托管控制面(规则编写UI、多租户、审计、GitLab集成)。EE代理从本仓库导入agentcore/,并用gRPC规则流替换YAML加载器。
Layout
agentcore/ 数据面原语(MPL-2.0)
enforcer/ eBPF + nftables + DNS代理 + LSM cred/proc_mem
watcher/ 容器生命周期事件源(containerd, docker)
handler/ 生命周期处理器 — 版本通用
policy/ ResolvedPolicy + Source接口 + 加载器
advisory/ 纯Go Advisory类型 + Sink接口
violation/ 纯Go违规报告Sink接口
wildcard/ 域名模式匹配辅助
version/ 构建版本戳(通过 -ldflags 设置)
cmd/
leitwacht-initc/ Pod初始化容器,在代理挂载前阻塞入口点
ce/ 社区版守护进程(MPL-2.0)
cmd/agent-ce/ 二进制文件
config/ 环境驱动的守护进程设置
ruleyaml/ YAML规则加载器 + fsnotify热重载
sinks/ 标准输出NDJSON / Prometheus / webhook
helm/agent-ce/ Helm Chart
SCHEMA.md YAML规则模式(v1)
examples/
rules.yaml 入门规则集
docs/
EVENT_FLOW.md 观察器 → 处理器 → 强制器流程 + 可调参数(带mermaid图)
Container scope
leitwacht-agent 仅检查带有 GitLab Runner 管理标签 com.gitlab.gitlab-runner.managed=true 的容器。没有此标签的容器——任何手动启动的、边车、应用工作负载——都会被完全忽略(无事件、无强制、无违规)。这是有意为之:leitwacht 是 CI Runner 出口数据面,不应静默拦截非 Runner 工作负载。非 Runner 用例不在 v0.1.0 的范围之内。
Known limitations (v0.1.0)
- 仅 IPv4。 eBPF 程序和 DNS 代理仅对 IPv4 流量实施强制;无论策略如何,IPv6 出口在网络命名空间边界被丢弃。需要 IPv6 连接的 CI 作业在解决此问题前无法使用 leitwacht 强制。
- 仅 Linux x86_64。 尚不支持 arm64 runner(CI 提供 amd64 镜像;一旦有该架构的 eBPF 构件,会跟进 arm64)。
- 仅 GitLab Runner 工作负载。 见上文“容器范围”。
Quickstart
# 构建(CGO_ENABLED=0 允许非 Linux 主机跨平台编译干净)。
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build ./...
# 容器镜像
docker build -f Dockerfile.agent-ce -t leitwacht/agent-ce:dev .
# Helm 安装(Kubernetes)。dnsUpstream 是必需的——将其指向您的集群 DNS 解析器,而不是公共的,以便内部服务保持解析并且查询不泄漏。
KUBE_DNS_IP=$(kubectl -n kube-system get svc kube-dns -o jsonpath='{.spec.clusterIP}')
helm install leitwacht-ce ./ce/helm/agent-ce \
-n leitwacht --create-namespace \
--set-file rules=examples/rules.yaml \
--set "dnsUpstream=${KUBE_DNS_IP}:53"
rules.yaml 的完整模式参考位于 ce/SCHEMA.md。
License
agentcore/ 和 ce/ 根据 Mozilla Public License 2.0 分发 — 参见 LICENSE。MPL-2.0 是一个文件级版权许可:您可以在自己的产品(商业或其他)中使用、修改和重新分发这些文件,但您对 MPL-2.0 许可文件所做的任何更改必须按相同许可提供。
位于 gitlab.com/leitwacht/leitwacht 的企业版后端根据不同的许可分发。这两个仓库由同一团队共同开发。
Contributing
问题与合并请求请提交至规范 GitLab 仓库(https://gitlab.com/leitwacht/leitwacht-agent)。安全问题请遵循 SECURITY.md 中的流程。工作流程和风格说明见 CONTRIBUTING.md。
Building
仅 Linux(eBPF + nftables):GOOS=linux GOARCH=amd64 go build ./...
eBPF 对象(*_bpfel.o)已提交,因为重新生成它们需要 clang + 内核头文件;CI 构建依赖已提交的构件。要在本地重新生成(Linux):
go generate ./agentcore/enforcer/