
LeitWacht v1.21.0
Leitwacht control plane — GitLab Runner CI/CD के लिए रनटाइम सुरक्षा: नीति लेखन, बहु-किरायेदारी, ऑडिट, GitLab एकीकरण
GitLab Runner Leitwacht
GitLab Runner CI/CD कंटेनरों के लिए नेटवर्क एग्रेस एनफोर्समेंट। Leitwacht प्रत्येक जॉब कंटेनर नेटवर्क पर क्या एक्सेस कर सकता है, इसे नियंत्रित करके सप्लाई चेन हमलों को सीक्रेट्स को बाहर निकालने से रोकता है।
यह कैसे काम करता है
Leitwacht एक स्वतंत्र एजेंट है जो प्रत्येक नोड पर GitLab Runner के साथ चलता है। यह कंटेनर स्टार्ट इवेंट्स को इंटरसेप्ट करता है, एनफोर्समेंट प्रिमिटिव्स अटैच करता है, और सभी नेटवर्क गतिविधि को एक केंद्रीय बैकएंड को रिपोर्ट करता है। GitLab Runner में कोई संशोधन आवश्यक नहीं है।
एनफोर्समेंट स्टैक (प्रति कंटेनर)
Container Process
|
| DNS query (port 53)
v
nftables redirect ──> DNS Proxy (:15353)
|
|── Allowlist check (FQDN match)
|── Block: NXDOMAIN response
|── Allow: forward to upstream, add resolved IPs to eBPF allow map
|── Record: domain, resolved IPs, PID, process name
v
Upstream DNS (CoreDNS / external)
Container Process
|
| TCP/UDP egress (any port)
v
eBPF cgroup-skb/egress filter
|── IP in allow map? ──> ALLOW (counted)
|── IP in trusted CIDRs? ──> ALLOW (pod net, svc net)
|── Cloud metadata (169.254.169.254)? ──> BLOCK (always)
|── DoT (port 853)? ──> BLOCK (always)
|── IPv6 (non-loopback)? ──> BLOCK (always)
|── Default ──> BLOCK (drop event to ringbuf)
पॉड-स्तरीय शेयरिंग (Kubernetes)
K8s पॉड के सभी कंटेनर एक नेटवर्क नेमस्पेस साझा करते हैं। Leitwacht प्रति पॉड एक NetnsContext बनाता है जो साझा स्थिति (DNS प्रॉक्सी, nftables नियम, eBPF मैप) का मालिक होता है। प्रत्येक कंटेनर को अपना स्वयं का cgroup-skb अटैचमेंट मिलता है ताकि कोई भी सहोदर फिल्टर को बायपास न कर सके।
Pod (shared netns)
+-- NetnsContext (1 per pod)
| +-- DNS Proxy (1 goroutine pair)
| +-- nftables redirect rules
| +-- eBPF program + maps
| +-- Ringbuf reader
|
+-- Container A
| +-- CgroupLink (eBPF attached to A's cgroup)
| +-- ViolationRecorder
|
+-- Container B
+-- CgroupLink (eBPF attached to B's cgroup)
+-- ViolationRecorder
एजेंट-बैकएंड संचार
+------------------+ gRPC +------------------+
| Leitwacht Agent | ──────────────────────> | Leitwacht Server |
| (per node) | | (central) |
| | GetPolicy(project) | |
| - Watcher | <───────────────────── | - Policy store |
| - Enforcer | | - Violation DB |
| - DNS Proxy | ReportViolations(job) | - REST API |
| - Reporter | ──────────────────────> | - Frontend SPA |
| - Honeypot LSM | | - Notifications |
| | Heartbeat() | - Baselines |
| | ──────────────────────> | - Anomaly det. |
+------------------+ +------------------+
आर्किटेक्चर
घटक
| घटक | विवरण |
|---|---|
Agent (cmd/agent) | रनर नोड्स पर DaemonSet। कंटेनर्ड को जॉब कंटेनरों के लिए देखता है, eBPF + DNS प्रॉक्सी अटैच करता है, उल्लंघन रिपोर्ट करता है। रूट + Linux की आवश्यकता है। |
Server (cmd/server) | केंद्रीय बैकएंड। फ्रंटेंड के लिए REST API, एजेंटों के लिए gRPC। नीतियां, उल्लंघन, बेसलाइन स्टोर करता है। Postgres या SQLite। |
Frontend (frontend/) | SvelteKit SPA। नीति प्रबंधन, उल्लंघन दर्शक, बेसलाइन प्रबंधन, विसंगति पहचान, ऑडिट लॉग। |
मुख्य पैकेज
यह रिपॉजिटरी EE सर्वर + EE-लाइसेंस प्राप्त एजेंट है। उपरोक्त आरेखों में दिखाया गया नेटवर्क-एनफोर्समेंट डेटा प्लेन (eBPF, DNS प्रॉक्सी, nftables, कंटेनर्ड वॉचर) एक अलग, MPL-2.0 कम्युनिटी-एडिशन मॉड्यूल
leitwacht-agentमें रहता है, जिसे यह रिपॉजिटरी एक निर्भरता के रूप में उपभोग करता है;cmd/agent+ee/EE बिल्ड हैं जो इसे पुन: उपयोग करते हैं और बैकएंड से जोड़ते हैं।
| पैकेज | उद्देश्य |
|---|---|
internal/agentgrpc | gRPC सर्वर: एजेंट उल्लंघन रिपोर्ट को इन्जेस्ट करता है, नीति + नियम स्ट्रीम परोसता है |
internal/api | REST API हैंडलर, प्रमाणीकरण मिडलवेयर, RBAC स्कोपिंग |
internal/auth | OIDC (GitLab) प्रमाणीकरण, सत्र, CSRF |
internal/store | GORM डेटा एक्सेस (प्रोजेक्ट, उल्लंघन, बेसलाइन) + ClickHouse |
internal/license, internal/licensemgr | EE लाइसेंस सत्यापन (Ed25519 JWS) + जीवनचक्र और कॉन्फ़िग गेट (LICENSE देखें) |
internal/notify | अलर्ट डिलीवरी (ईमेल/SES, Slack) + टेम्पलेट |
internal/retention | डेटा-अवधारण / प्रूनिंग |
internal/mcp, internal/mcpauth | MCP सर्वर + प्रमाणीकरण |
ee/reporter | EE एजेंट gRPC क्लाइंट उल्लंघन और सलाहकारों को बैकएंड पर धकेलता है |
ee/policycache, ee/rulewatcher, ee/rulestore | EE एजेंट नीति कैश + नियम वॉच/स्टोर (BBolt) |
contract/ | साझा Go मॉड्यूल: .proto स्रोत + जनरेटेड agentpb वायर प्रकार |
डिप्लॉयमेंट
पूर्वापेक्षाएँ
- Kubernetes क्लस्टर जिसमें containerd रनटाइम हो
- GitLab Runner जो Kubernetes एग्जीक्यूटर का उपयोग करता हो
- रनर्स पर
FF_NETWORK_PER_BUILD=true(प्रत्येक जॉब को अपना नेटवर्क नेमस्पेस मिलता है)
Helm Charts
Server (helm/) — OCI चार्ट के रूप में प्रकाशित। Postgres + ClickHouse और कुछ पूर्व-निर्मित सीक्रेट्स (DB DSN, प्रमाणीकरण कुंजियाँ) की आवश्यकता है। पूर्ण runbook के लिए docs/DEPLOY.md देखें।
helm install leitwacht \
oci://registry.gitlab.com/leitwacht/leitwacht/charts/leitwacht --version 1.18.0 \
--set image.tag=1.18.0 \
--set ingress.domain=example.com --set ingress.hosts[0]=leitwacht.example.com \
--set grpcIngress.domain=example.com --set grpcIngress.hosts[0]=grpc-leitwacht.example.com \
--set app.oidcIssuer=https://gitlab.com --set app.oidcClientId=<oauth-app-id> \
--set clickhouse.embedded.password=<password>
Agent (helm/agent/):
helm install leitwacht-agent \
oci://registry.gitlab.com/leitwacht/leitwacht/charts/leitwacht-agent --version 1.18.0 \
--set agent.backendAddr="leitwacht.namespace.svc.cluster.local:9090" \
--set agent.defaultAction=audit \
--set agent.dnsUpstream="10.96.0.10:53,1.1.1.1:53" \
--set agent.trustedCIDRs="10.244.0.0/16,10.96.0.0/12"
एनफोर्समेंट मोड
| मोड | DNS नीति | eBPF फ़िल्टर | उपयोग का मामला |
|---|---|---|---|
| audit | सभी को अग्रेषित करें, उल्लंघन रिकॉर्ड करें | सभी को अनुमति दें, ड्रॉप रिकॉर्ड करें | बेसलाइन निर्माण, प्रारंभिक रोलआउट |
| block | गैर-अनुमतियों के लिए NXDOMAIN | गैर-अनुमति वाले IPs को ड्रॉप करें | उत्पादन एनफोर्समेंट |
| allow | कोई एनफोर्समेंट नहीं | कोई एनफोर्समेंट नहीं | छूट प्राप्त प्रोजेक्ट |
विकास
बिल्ड
# Backend
go build ./cmd/agent
go build ./cmd/server
# Frontend
cd frontend && pnpm install && pnpm build
# gRPC contract regeneration (edit contract/proto/**, then):
cd contract && buf generate proto/
eBPF डेटा प्लेन इस रिपॉजिटरी में नहीं है — यह
leitwacht-agent(CE) मॉड्यूल में रहता है। वहाँ इसके BPF स्केलेटन को पुनर्जीवित करें (उस रिपॉजिटरी का Makefile देखें:make ebpf-generate)।
टेस्ट
# Unit tests (any platform)
go test ./...
# Integration / e2e tests requiring sidecars (ClickHouse + Postgres) live under
# internal/store, internal/api, internal/agentgrpc — bring those up first.
# Frontend
cd frontend && pnpm test
लिंट
# Backend
golangci-lint run ./...
# Frontend
cd frontend && pnpm lint
दस्तावेज़ीकरण
| दस्तावेज़ | सामग्री |
|---|---|
| docs/DEPLOY.md | पूर्ण Kubernetes डिप्लॉयमेंट runbook (सीक्रेट्स, ClickHouse, माइग्रेशन, लाइसेंस स्थापना, एक्सपोज़र) |
| docs/MULTI_ORG.md | मल्टी-ऑर्ग / मल्टी-टेनेंट सेटअप |
| LICENSE, NOTICE | BSL 1.1 शर्तें (परिवर्तन लाइसेंस: MPL-2.0) और CE/EE लाइसेंस विभाजन |
leitwacht-agent | MPL-2.0 कम्युनिटी-एडिशन डेटा-प्लेन एजेंट (eBPF / DNS प्रॉक्सी / nftables एनफोर्समेंट) — उपरोक्त आरेखों के पीछे का इंजन |