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>
This commit is contained in:
maierch
2026-07-28 16:39:13 +02:00
commit d3638d49ae
12 changed files with 409 additions and 0 deletions
+31
View File
@@ -0,0 +1,31 @@
# Ausschnitt fuer /etc/squidguard/squidGuard.conf
# dbhome muss zu squidguard-rebuild.sh (DB=/var/lib/squidguard/db) passen.
dbhome /var/lib/squidguard/db
logdir /var/log/squidguard
# --- IP-Zuordnung der Rechner je Arbeitsgruppe ---------------------------
src ag01 { ip 10.0.1.11 10.0.1.12 } # die 8 Rechner der AG01 ...
src ag02 { ip 10.0.2.11 10.0.2.12 }
# ... ag03 .. ag08 analog
# --- Ziel-Listen je Gruppe (self-managed via GitLab) ---------------------
dest ag01 {
domainlist AG01/AG01domain
urllist AG01/AG01url
}
dest ag02 {
domainlist AG02/AG02domain
urllist AG02/AG02url
}
# ... dest ag03 .. ag08 analog
acl {
ag01 { pass ag01 none } # AG01 darf nur ihre eigenen Ziele
ag02 { pass ag02 none }
# ... ag03 .. ag08 analog
default {
pass none
redirect http://intranet.firma.local/blocked?url=%u
}
}
+14
View File
@@ -0,0 +1,14 @@
# /etc/sudoers.d/squidguard-deploy (chmod 0440, chown root:root)
# Der Deploy-User darf NUR die beiden Wrapper-Skripte aufrufen, mit exakt
# diesen Argumenten. Kein Shell-Zugriff, keine anderen Kommandos.
# Pruefen mit: visudo -c -f /etc/sudoers.d/squidguard-deploy
deploy ALL=(root) NOPASSWD: /usr/local/sbin/squidguard-rebuild.sh AG01, \
/usr/local/sbin/squidguard-rebuild.sh AG02, \
/usr/local/sbin/squidguard-rebuild.sh AG03, \
/usr/local/sbin/squidguard-rebuild.sh AG04, \
/usr/local/sbin/squidguard-rebuild.sh AG05, \
/usr/local/sbin/squidguard-rebuild.sh AG06, \
/usr/local/sbin/squidguard-rebuild.sh AG07, \
/usr/local/sbin/squidguard-rebuild.sh AG08, \
/usr/local/sbin/squidguard-reload.sh
+62
View File
@@ -0,0 +1,62 @@
#!/usr/bin/env bash
# /usr/local/sbin/squidguard-rebuild.sh <AG0N>
# Root-owned (0755). Wird vom Deploy-User via sudo aufgerufen.
# Uebernimmt die Staging-Dateien einer Gruppe und baut NUR deren .db neu.
# Bei einem Fehler wird der letzte funktionierende Stand automatisch
# zurueckgerollt, damit die Gruppe nicht offline geht.
set -euo pipefail
ag=${1:-}
case "$ag" in
AG0[1-8]) ;; # nur die erlaubten Gruppen
*) echo "Ungueltige Gruppe: '$ag'" >&2; exit 2 ;;
esac
DB=/var/lib/squidguard/db
IN=/var/lib/squidguard/incoming
BK=/var/lib/squidguard/backup
CONF=/etc/squidguard/squidGuard.conf
PROXY_USER=proxy # Debian/Ubuntu: proxy RHEL: squid
for f in "${ag}domain" "${ag}url"; do
[ -f "$IN/$ag/$f" ] || { echo "Staging-Datei fehlt: $IN/$ag/$f" >&2; exit 3; }
done
install -d -o "$PROXY_USER" -g "$PROXY_USER" -m 0755 "$DB/$ag" "$BK/$ag"
# --- 1) Letzten funktionierenden Stand sichern (Quelllisten + .db) --------
# rsync spiegelt exakt (auch Loeschungen), sodass BK immer der letzte
# erfolgreich uebernommene Stand dieser Gruppe ist.
rsync -a --delete "$DB/$ag/" "$BK/$ag/"
restore() {
echo "Rebuild fuer $ag fehlgeschlagen -> Rollback auf letzten guten Stand" >&2
rsync -a --delete "$BK/$ag/" "$DB/$ag/"
}
# --- 2) Neue Quelllisten uebernehmen -------------------------------------
install -o "$PROXY_USER" -g "$PROXY_USER" -m 0644 "$IN/$ag/${ag}domain" "$DB/$ag/${ag}domain"
install -o "$PROXY_USER" -g "$PROXY_USER" -m 0644 "$IN/$ag/${ag}url" "$DB/$ag/${ag}url"
# --- 3) .db je Liste neu bauen, als Squid-User, mit Fehlererkennung ------
rebuild_one() {
local list=$1 out rc
out=$(sudo -u "$PROXY_USER" squidGuard -c "$CONF" -C "$list" 2>&1) || rc=$?
rc=${rc:-0}
echo "$out"
# squidGuard liefert nicht immer einen aussagekraeftigen Exit-Code:
# zusaetzlich stderr und Existenz/Groesse der .db pruefen.
if [ "$rc" -ne 0 ] \
|| printf '%s' "$out" | grep -qiE 'error|fatal|went not through' \
|| [ ! -s "$DB/$list.db" ]; then
return 1
fi
return 0
}
if ! rebuild_one "$ag/${ag}domain" || ! rebuild_one "$ag/${ag}url"; then
restore
exit 4
fi
echo "rebuilt $ag"
+6
View File
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
# /usr/local/sbin/squidguard-reload.sh
# Root-owned (0755). Laedt Squid neu, damit die frisch gebauten .db aktiv werden.
set -euo pipefail
squid -k reconfigure
echo "squid reloaded"