diff --git a/apps/production/kustomization.yaml b/apps/production/kustomization.yaml index e9b7356..364d9e3 100644 --- a/apps/production/kustomization.yaml +++ b/apps/production/kustomization.yaml @@ -65,6 +65,7 @@ resources: - wiki-ingress.yaml - wikijs-config.yaml # Konfig-Job (headless Setup + OIDC + Rollen) - wikijs-postgres-backup.yaml # Nächtliches Borg-Backup der Wiki-DB (#0048) + - wikijs-gruppenpruefung.yaml # Tägliche Prüfung auf Nutzer ohne Gruppe (#0103) # Synapse-Modul als eigene Datei gepflegt (lintbar/testbar), aber als ConfigMap gemounted - # disableNameSuffixHash, da der Name in synapse-values.yaml's eingebettetem values.yaml diff --git a/apps/production/networkpolicy.yaml b/apps/production/networkpolicy.yaml index 487dd78..a68e591 100644 --- a/apps/production/networkpolicy.yaml +++ b/apps/production/networkpolicy.yaml @@ -405,6 +405,10 @@ spec: - podSelector: matchLabels: app.kubernetes.io/name: wikijs-backup + # Tägliche Gruppenprüfung (wikijs-gruppenpruefung.yaml, #0103) liest nur. + - podSelector: + matchLabels: + app.kubernetes.io/name: wikijs-gruppenpruefung ports: - protocol: TCP port: postgres diff --git a/apps/production/wikijs-gruppenpruefung.yaml b/apps/production/wikijs-gruppenpruefung.yaml new file mode 100644 index 0000000..b5136a6 --- /dev/null +++ b/apps/production/wikijs-gruppenpruefung.yaml @@ -0,0 +1,96 @@ +# Taegliche Pruefung: Gibt es Wiki-Nutzer ohne Gruppe? (management #0103) +# +# Der Fall, den dieses Issue ausgeloest hat: @apo meldete sich erfolgreich an, landete in +# keiner Gruppe und sah deshalb nichts - ohne Fehlermeldung, ohne Logzeile, ohne Zaehler. +# Aufgefallen ist es erst, weil er sich beschwerte. Das Auto-Enrollment verhindert den Fall +# jetzt; diese Pruefung stellt sicher, dass ein erneutes Versagen NICHT wieder auf eine +# Beschwerde angewiesen ist (Abnahmekriterium des Issues). +# +# Bewusst eine taegliche Stichprobe auf der Datenbank statt einer Instrumentierung des +# Logins: Wiki.js meldet den Zustand "angemeldet, aber ohne Gruppe" nirgends, und ein +# Patch am Anmeldeweg waere fuer diesen Zweck unverhaeltnismaessig. Ein Tag Verzug ist +# hinnehmbar - der Fall lag vorher Tage unbemerkt. +# +# Die Ausgabe geht nach stdout und damit ueber Alloy nach Loki. Suchbegriff fuer eine +# Abfrage oder ein Panel: "Wiki-Nutzer ohne Gruppe". +apiVersion: batch/v1 +kind: CronJob +metadata: + name: wikijs-gruppenpruefung + namespace: matrix +spec: + schedule: "15 6 * * *" + concurrencyPolicy: Forbid + successfulJobsHistoryLimit: 3 + failedJobsHistoryLimit: 3 + jobTemplate: + spec: + backoffLimit: 1 + template: + metadata: + labels: + # Diese Marke steht auch in networkpolicy.yaml - ohne sie kaeme der Pod nicht + # an die Datenbank, und zwar lautlos. + app.kubernetes.io/name: wikijs-gruppenpruefung + app.kubernetes.io/component: pruefung + spec: + restartPolicy: Never + containers: + - name: pruefung + image: postgres:15-alpine + env: + - name: PGHOST + value: wikijs-postgres + - name: PGDATABASE + value: wiki + - name: PGUSER + valueFrom: + secretKeyRef: + name: wikijs-postgres-secret + key: username + - name: PGPASSWORD + valueFrom: + secretKeyRef: + name: wikijs-postgres-secret + key: password + command: + - /bin/sh + - -c + - | + set -eu + + # Gegenprobe zuerst: Antwortet die Datenbank ueberhaupt? Ohne diese + # Zeile sieht "0 Nutzer ohne Gruppe" bei unerreichbarer DB genauso aus + # wie ein sauberes Ergebnis - stiller Erfolg ist hier das eigentliche + # Risiko, nicht der Fund. + gesamt="$(psql -Atc 'select count(*) from users;')" + if [ -z "$gesamt" ] || [ "$gesamt" -eq 0 ]; then + echo "FEHLER: keine Nutzer gelesen - Datenbank nicht erreichbar oder leer." + exit 1 + fi + + ohne="$(psql -Atc ' + select count(*) from users u + left join "userGroups" ug on ug."userId" = u.id + where ug."userId" is null;')" + + if [ "$ohne" -gt 0 ]; then + echo "WARNUNG: $ohne von $gesamt Wiki-Nutzer ohne Gruppe - sie sehen nach der Anmeldung nichts (management #0103)" + # -At mit Vorgabe-Trenner "|" statt eines eingebetteten E'\t': + # Die Anfuehrungszeichen-Verschachtelung waere die wahrscheinlichste + # Fehlerquelle in dieser Datei und traegt nichts zur Aussage bei. + psql -Atc ' + select u.id, u.email from users u + left join "userGroups" ug on ug."userId" = u.id + where ug."userId" is null order by u.id;' \ + | while IFS= read -r z; do echo " betroffen: $z"; done + echo "Behebung: Auto-Enrollment der OIDC-Strategy pruefen (wikijs-config.py, Gruppe wiki-anwender)." + else + echo "OK: kein Wiki-Nutzer ohne Gruppe ($gesamt geprueft)" + fi + resources: + requests: + memory: 32Mi + cpu: 10m + limits: + memory: 96Mi