docs(issues): wiki enrolment live, mail blocker gone, console seen for the wrong host

Three corrections to questions I should not have asked again.

#0103 is implemented: autoEnrollGroups points at wiki-anwender, verified in the live
database rather than from the job log. The decision was already in #0049 - the role
model was built, only the way in was missing.

#0102's blocker was in the documentation all along: maintenance-notify sends under
.de, not .chat, via IONOS on 587. The MAIL_FROM in config.example is an example, not
the operating state. So hardening .chat cannot break maintenance mail, and Authentik
remains its only .chat sender - DKIM-covered.

#0008 is not resolved by the console screenshots: they show fw-matrix-cx42, the
Matrix host, while the issue asks which rule keeps 9090 and 3100 shut on CFGMON.
Still open. What they did show is worth keeping: SSH and the Kubernetes API are
properly source-restricted, and several rules open ports to everyone where nothing
listens - including an inbound smtp 587 that cannot help the outbound sending it was
presumably added for.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Thore Cimbal
2026-08-19 12:00:00 +00:00
co-authored by Claude Opus 5
parent b3d2faa032
commit a90ebd379b
3 changed files with 87 additions and 0 deletions
@@ -79,3 +79,35 @@ echter Gruppen-Call.
Hetzner-Console. Das Skript sagt, *was* von außen erreichbar ist; welche Regeln das Hetzner-Console. Das Skript sagt, *was* von außen erreichbar ist; welche Regeln das
bewirken und ob sie bewusst so stehen, sagt nur die Console. Erst danach ist das bewirken und ob sie bewusst so stehen, sagt nur die Console. Erst danach ist das
Issue erledigt. Issue erledigt.
## Console-Einblick 2026-08-19 — Matrix-Host gesehen, CFGMON weiterhin nicht
sorb hat die Hetzner-Console gezeigt: **`fw-matrix-cx42`, 15 Regeln, vollständig
angewandt.** Das ist der **Matrix-Host**, nicht CFGMON — die Frage dieses Issues
(welche Regel hält 9090/3100 auf CFGMON zu?) ist damit **noch offen**. Gemessen sind
beide Ports zu; *warum*, weiß weiterhin niemand.
Der Einblick war trotzdem wertvoll, in zwei Richtungen.
**Sauber gelöst:** SSH (2248) und die Kubernetes-API (6443) sind quellbeschränkt auf
sorbs Anschluss (`178.25.213.70`, `2a02:8108:0:2f::/64`), nicht für alle offen. Das hat
auch einen Fehler in `pruefe-ports.sh` aufgedeckt: Die Liste führte 2248 schlicht als
„offen", womit das Skript aus jedem anderen Netz zwei Falschbefunde gemeldet hätte.
Behoben — beide gelten jetzt als `quellbeschraenkt` und werden berichtet, aber nicht
gewertet.
**Die Firewall ist deutlich weiter offen als die Plattform.** Von außen gemessen
antwortet auf diesen Regeln nichts:
| Regel | Befund |
|---|---|
| `smtp` TCP **587 eingehend**, Any | **Vermutlich versehentlich.** Der Host verschickt Mail *ausgehend*; eingehende Regeln helfen dabei nicht (Hetzner filtert nur eingehend). Der Deployment-Guide dokumentiert genau dieses Debugging („465 blockiert, 587 geht") — die Regel sieht nach dessen Rest aus. |
| `mRTC SFU muxed` UDP **3000065535** | ~35.500 Ports für einen benötigten (30002). |
| `mRTC SFU TCP` TCP **3000060000** | ~30.000 Ports für einen benötigten (30001). |
| `RTC SFU 1` 6789, `RTC SFU 2` 7880, `mRTC Auth` 8080, je Any | nichts lauscht; die Dienste laufen über den Ingress auf 443. |
Kein akutes Risiko — aber eine unnötig breite *erklärte* Angriffsfläche: Sobald dort je
etwas horcht, ist es sofort weltweit erreichbar, ohne dass jemand eine Regel anfassen
müsste. Festgehalten in `notfallhandbuch:ports-soll.md`.
**Zum Abschluss dieses Issues fehlt weiterhin:** der Blick auf die **CFGMON**-Firewall.
@@ -98,3 +98,27 @@ Richtlinie verschärfen** — umgekehrt zerlegt es den Versand unbemerkt.
- `notfallhandbuch:dns-soll.md` und `pruefe-dns.sh` tragen den neuen Soll-Stand; - `notfallhandbuch:dns-soll.md` und `pruefe-dns.sh` tragen den neuen Soll-Stand;
der bisherige Satz „Härtung vorgeschlagen, aber nicht entschieden" wird der bisherige Satz „Härtung vorgeschlagen, aber nicht entschieden" wird
ersetzt. ersetzt.
## Blocker aufgelöst 2026-08-19 — `maintenance-notify` sendet unter `.de`
Die offene Frage („worüber verschickt `maintenance-notify` tatsächlich?") steht in der
Doku, nicht auf dem Host: `gitops:docs/deployment-guides/07-host-maintenance-notifications.md`,
Abschnitt Stolpersteine.
> **Absender-Domain ≠ Matrix-Server-Domain.** […] bei axion1337 z.B. Mail unter `.de`,
> Matrix unter `.chat` — `MAIL_FROM` und der `user`/`from` in `msmtprc` müssen zur
> tatsächlichen Mail-Domain passen.
Der Versand läuft über **IONOS auf 587/STARTTLS** (465 ist ausgehend blockiert, ebenfalls
dort dokumentiert). Die `MAIL_FROM="wartung@axion1337.chat"` in `config.example` ist ein
**Beispiel**, nicht der Betriebsstand.
**Folge für dieses Issue:** Eine Härtung von `axion1337.chat` berührt
`maintenance-notify` nicht — dessen Absenderdomain `.de` trägt bereits `p=reject`
(#0006). Damit bleibt als einziger `.chat`-Absender **Authentik** (`gamemaster@`,
IONOS-SMTP, DKIM über die drei `*.dkim.ionos.com`-CNAMEs gedeckt).
Der Vorschlag im Issue ist damit ohne die befürchtete Nebenwirkung umsetzbar: eigener
`_dmarc`-TXT statt IONOS-CNAME, zunächst `p=quarantine` mit `rua=`, danach `p=reject`;
Null-MX und `-all` auf den sieben Service-Namen. Abnahme unverändert: Authentik-Testmail
und eine Wartungsmeldung müssen **nachweislich** ankommen.
@@ -147,3 +147,34 @@ zugeordnet.
entschieden. Solange die Punkte oben offen sind, bleibt für diese Konten der stumme entschieden. Solange die Punkte oben offen sind, bleibt für diese Konten der stumme
Fall bestehen — das ist der Grund, warum dieses Issue nicht mit den Freigaben Fall bestehen — das ist der Grund, warum dieses Issue nicht mit den Freigaben
erledigt ist. erledigt ist.
## Umgesetzt 2026-08-19 — Auto-Enrollment aktiv
Entscheidung sorb, und sie stand schon in **#0049**: normale Authentik-Nutzer lesen die
Anwenderdoku, Admins sind Admins („Betrieb = Admin"). Das Rollenmodell war umgesetzt,
der **Weg hinein** nicht — deshalb dieser Fall.
`autoEnrollGroups` der OIDC-Strategy zeigt jetzt auf `wiki-anwender`
(`gitops:apps/production/wikijs-config.py`, Commit `dfb88a3`). Der Konfig-Job wurde neu
angestoßen (Job löschen → Flux legt ihn an, wie im Dateikopf beschrieben) und meldet:
`Auto-Enrollment in wiki-anwender, id 4`.
**In der laufenden Datenbank gegengeprüft**, nicht am Logtext:
```
OIDC-Strategy selfRegistration=t autoEnrollGroups={"v":[4]} # 4 = wiki-anwender
local selfRegistration=f autoEnrollGroups={"v":[]} # Break-Glass, unverändert
```
Admins bleiben Handarbeit in Authentik: Mitgliedschaft in `authentik Admins` kommt über
den `groups`-Claim und wird von dieser Grundausstattung nicht berührt. `betrieb/*`
behält sein Default-Deny — die in #0049 end-to-end verifizierte Abschottung gilt
unverändert, sie greift nur nicht mehr gegen Leute, die gar nicht erst hereingelassen
wurden.
Der Skript-Teil bricht ab, wenn `wiki-anwender` fehlt, statt in eine leere Gruppe zu
enrollen — das wäre genau der Fehler, den dieses Issue beschreibt.
**Offen bleibt der Aufräumteil:** die tote Authentik-Anwendung `wiki` ohne Provider und
die Gruppe `wiki-zugang` (4 Mitglieder), die Rechte an ihr verteilt. Beides fasse ich
erst auf Zuruf an, weil es Authentik-Konfiguration ist.