
eBPF + nftables + DNS proxy فرض التدفق الصادر لحاويات وظائف GitLab Runner CI/CD — مستوى بيانات الإصدار المجتمعي https://leitwacht.eu/
https://leitwacht.eu — مصدر الحقيقة: https://gitlab.com/leitwacht/leitwacht-agent. المشكلات وطلبات الدمج والنقاشات موجودة على GitLab.
قبل 1.0. سلسلة 0.x غير مستقرة؛ قد تحمل الإصدارات الثانوية تغييرات مكسورة لواجهات برمجة التطبيقات، وأسماء متغيرات البيئة، ومفاتيح
values.yamlالخاصة بـ Helm، ومخطط ملف القواعد حتى إصدار 1.0. استخدم ملخصات الصور (وليس العلامات العائمة) في الإنتاج. راجع CHANGELOG.md لملاحظات الترقية.
وكيل مستوى البيانات لنظام التحكم في الخروج (egress) الخاص بـ leitwacht GitLab Runner. eBPF + nftables + وكيل DNS داخل مساحة اسم الشبكة يتم إرفاقهم بكل حاوية مشغل CI ويقومون بفرض سياسة الخروج. CE (هذا المستودع) يقرأ قواعده من ملف YAML محلي وهو مستقل تمامًا — لا خلفية، لا اتصال خارجي، لا تسجيل.
إصدار المؤسسة المرخص بشكل منفصل
(gitlab.com/leitwacht/leitwacht)
يضيف لوحة تحكم مدارة (واجهة تأليف القواعد، تعدد المستأجرين، التدقيق،
تكامل GitLab). وكيل EE يستورد agentcore/ من هذا المستودع
ويستبدل محمل YAML بدفق قواعد gRPC.
agentcore/ بدائيات مستوى البيانات (MPL-2.0)
enforcer/ eBPF + nftables + وكيل DNS + LSM cred/proc_mem
watcher/ مصدر أحداث دورة حياة الحاوية (containerd, docker)
handler/ معالج دورة الحياة — محايد للإصدار
policy/ ResolvedPolicy + واجهة Source + محمل
advisory/ نوع استشارة بلغة Go الخالصة + واجهة Sink
violation/ نوع انتهاك بلغة Go الخالصة لواجهة Sink للإبلاغ عن الانتهاكات
wildcard/ مساعدات مطابقة أنماط النطاقات
version/ طابع إصدار البناء (يُعيّن عبر -ldflags)
cmd/
leitwacht-initc/ حاوية init للبودات تمنع نقاط الدخول حتى يتم إرفاق الوكيل
ce/ إصدار المجتمع (MPL-2.0)
cmd/agent-ce/ الملف الثنائي
config/ إعدادات الوكيل المعتمدة على البيئة
ruleyaml/ محمل قواعد YAML + إعادة تحميل سريع عبر fsnotify
sinks/ stdout NDJSON / Prometheus / webhook
helm/agent-ce/ مخطط Helm
SCHEMA.md مخطط قواعد YAML (v1)
examples/
rules.yaml مجموعة قواعد بداية
docs/
EVENT_FLOW.md تدفق watcher → handler → enforcer + إعدادات قابلة للتعديل (مع mermaid)
وكيل leitwacht يقوم فقط بفحص الحاويات التي تحمل الوسم المُدار com.gitlab.gitlab-runner.managed=true الخاص بـ GitLab Runner.
الحاويات بدون هذا الوسم — أي شيء تشغله يدويًا، أو الحاويات الجانبية، أو أحمال العمل التطبيقية — يتم تجاهلها تمامًا (لا أحداث، لا فرض، لا انتهاكات).
هذا متعمد: leitwacht هو مستوى البيانات لخروج مشغل CI فقط، ولا ينبغي اعتراض أحمال العمل غير المشغلة Runner بصمت.
حالات الاستخدام غير Runner خارج نطاق الإصدار v0.1.0.
# بناء (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.
agentcore/ و ce/ موزعة تحت رخصة Mozilla Public License
2.0 — راجع LICENSE. MPL-2.0 هي رخصة حقوق متراكمة على مستوى الملف:
يمكنك استخدام هذه الملفات وتعديلها وإعادة توزيعها في منتجاتك الخاصة
(تجارية أو غير ذلك)، ولكن أي تغييرات تجريها على الملفات المرخصة بـ MPL-2.0
يجب أن تكون متاحة تحت نفس الرخصة.
الخلفية الخاصة بإصدار المؤسسة في gitlab.com/leitwacht/leitwacht موزعة تحت رخصة مختلفة. المستودعان يتم تطويرهما معًا من قبل نفس الفريق.
المشكلات وطلبات الدمج على مستودع GitLab الأساسي (https://gitlab.com/leitwacht/leitwacht-agent). يجب اتباع عملية القضايا الأمنية في SECURITY.md. ملاحظات سير العمل والأسلوب موجودة في CONTRIBUTING.md.
Linux فقط (eBPF + nftables): GOOS=linux GOARCH=amd64 go build ./...
كائنات eBPF (*_bpfel.o) ملتزمة لأن إعادة توليدها تتطلب
clang + رؤوس النواة؛ تعتمد بنيات CI على الأثريات الملتزمة.
لإعادة التوليد محليًا على Linux:
go generate ./agentcore/enforcer/