返回更新列表
新发布Aug 20, 2026

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/

分类