Files
squidguard-gitlab/README.md
T
maierch d3638d49ae SquidGuard-Listen self-managed via GitLab (Shell-Runner)
Beispiel-Setup: ein Repo je AG fuer Zugriffskontrolle, zentrales
Deploy-Repo mit Validierung, Rollout auf beide Proxys, DB-Rebuild
je Gruppe und Auto-Rollback auf den letzten guten Stand.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 16:39:13 +02:00

4.8 KiB

SquidGuard-Listen per GitLab self-managed (Shell-Runner)

Idee / Sicherheitsmodell

  • Ein Repo pro Arbeitsgruppe (squidguard/ag01 .. squidguard/ag08). GitLab-Rechte am Projekt = wer die beiden Dateien AG<NN>domain / AG<NN>url aendern darf. Nur AG01-Mitglieder haben Developer im Repo ag01. Das ist die eigentliche Zugriffskontrolle.
  • Ein zentrales Deploy-Repo (squidguard/deploy), nur Ops beschreibbar. Hier liegen Deploy-Skript und Secrets. Die AG-Repos enthalten KEINE Secrets -> auch wenn eine AG ihre .gitlab-ci.yml frei bearbeitet, kann sie damit nur die zentrale Pipeline anstossen, nichts ausspaehen.
  • Dedizierter Shell-Runner nur fuer das Deploy-Repo (nicht mit den AG-Repos teilen!), Tag squidguard-shell.

Dateibaum

deploy-repo/            -> Inhalt des Repos squidguard/deploy
  .gitlab-ci.yml
  scripts/validate.sh
  scripts/deploy.sh
  config/proxies.env
ag-repo/                -> Vorlage fuer jedes Repo squidguard/agNN
  .gitlab-ci.yml        (optional, nur fuer Sofort-Deploy)
  AG01domain
  AG01url
proxy/                  -> auf BEIDE Squid-Proxies installieren
  usr-local-sbin-squidguard-rebuild.sh
  usr-local-sbin-squidguard-reload.sh
  sudoers.d-squidguard-deploy
  squidGuard.conf.snippet

Einrichtung Proxys (proxy1 + proxy2, je identisch)

# Deploy-User anlegen
useradd -m -s /bin/bash deploy
install -d -o deploy -g deploy /var/lib/squidguard/incoming
install -d -o proxy  -g proxy  /var/lib/squidguard/db
install -d -o proxy  -g proxy  /var/lib/squidguard/backup   # fuer Auto-Rollback

# Wrapper-Skripte installieren
install -o root -g root -m 0755 usr-local-sbin-squidguard-rebuild.sh /usr/local/sbin/squidguard-rebuild.sh
install -o root -g root -m 0755 usr-local-sbin-squidguard-reload.sh  /usr/local/sbin/squidguard-reload.sh

# sudoers (WICHTIG: 0440, vorher pruefen)
install -o root -g root -m 0440 sudoers.d-squidguard-deploy /etc/sudoers.d/squidguard-deploy
visudo -c

# SSH-Key des Runner-Users in ~deploy/.ssh/authorized_keys eintragen
# squidGuard.conf.snippet in /etc/squidguard/squidGuard.conf einbauen

Hinweis: PROXY_USER in squidguard-rebuild.sh ist unter Debian/Ubuntu proxy, unter RHEL/CentOS squid -> ggf. anpassen.

Einrichtung Shell-Runner (auf dem Runner-Host)

# Runner registrieren, an Projekt squidguard/deploy gebunden
gitlab-runner register \
  --url https://gitlab.intern/ \
  --token <PROJECT_RUNNER_TOKEN_des_deploy_repos> \
  --executor shell \
  --tag-list squidguard-shell

# Als Runner-User (meist gitlab-runner): SSH-Key + known_hosts anlegen
sudo -u gitlab-runner ssh-keygen -t ed25519 -N '' -f ~gitlab-runner/.ssh/id_ed25519
sudo -u gitlab-runner ssh-keyscan proxy1.intern proxy2.intern >> ~gitlab-runner/.ssh/known_hosts
# der oeffentliche Key gehoert in ~deploy/.ssh/authorized_keys beider Proxys

Einrichtung GitLab

  1. Gruppe squidguard anlegen, darin Projekte ag01..ag08 und deploy.
  2. Je AG-Repo: nur die AG-Mitglieder als Developer hinzufuegen. Optional main als Protected Branch (Maintainer merged).
  3. Group-Deploy-Token mit Scope read_repository erstellen -> im Deploy-Repo als CI/CD-Variablen GIT_USER / GIT_TOKEN hinterlegen (protected + masked).
  4. Deploy-Repo: Pipeline-Zeitplan (Schedule) z.B. alle 5 Minuten anlegen.
  5. Optional Sofort-Deploy: im Deploy-Repo ein Trigger-Token erzeugen und in jedem AG-Repo als DEPLOY_TRIGGER_TOKEN + DEPLOY_PROJECT_ID hinterlegen, dann ag-repo/.gitlab-ci.yml verwenden.

Ablauf

Push in ag01/main -> (optional Trigger) -> zentrale Pipeline auf dem Shell-Runner -> deploy.sh: klont alle AG-Repos, validiert, rsynct auf beide Proxys, squidguard-rebuild.sh AG<NN> (DB je Gruppe neu), am Ende squidguard-reload.sh (squid -k reconfigure).

Eine ungueltige Zeile wird schon in der CI-Validierung abgefangen und gelangt gar nicht erst auf die Proxys.

Auto-Rollback auf dem Proxy

squidguard-rebuild.sh sichert vor jeder Uebernahme den letzten funktionierenden Stand einer Gruppe (Quelllisten + .db) nach /var/lib/squidguard/backup/AG<NN>/. Schlaegt der Rebuild fehl - erkannt an Exit-Code, Fehlermeldungen in der Ausgabe oder einer leeren .db -, wird dieser Stand automatisch zurueckgespielt. Die Gruppe laeuft damit unveraendert weiter, statt offline zu gehen.

deploy.sh behandelt das pro Gruppe isoliert: eine fehlgeschlagene Gruppe wird uebersprungen (und zurueckgerollt), alle anderen Gruppen gehen normal live, und Squid wird trotzdem neu geladen. Am Ende endet die Pipeline mit Exit-Code 1 und listet die betroffenen proxy/AG auf, damit der Fehler sichtbar bleibt.

Da die CI-Validierung Formatfehler bereits vorher abfaengt, ist der Rollback vor allem die zweite Sicherung gegen Proxy-seitige Probleme (z.B. squidGuard-Version, Rechte, kaputte Bestands-.db).