Commit graph

18 commits

Author SHA1 Message Date
Carsten Abele
fd88251e07 feat(check): handlungsleitende Hinweise bei TLS- und Zertifikatsfehlern
Der bisherige Fehlertext gab den rohen x509-Fehler weiter, ohne zu sagen, was
zu tun ist. check unterscheidet jetzt unbekannte CA, unpassenden Hostnamen,
SHA-1-Signatur, abgelaufenes Zertifikat, zu alte TLS-Version und fehlende
gemeinsame Cipher-Suite und nennt jeweils die passende Stellschraube.

Der technische Originalfehler bleibt erhalten. Reine Netzwerkfehler bekommen
bewusst keinen Hinweis, damit kein falscher Verdacht entsteht.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 13:29:47 +02:00
Carsten Abele
7237aee744 fix(cli): Test las die Konfiguration des Hosts statt einer Attrappe
TestRunNoArgsDefaultsToServe rief run(nil) auf und griff damit auf den
Default-Pfad /etc/vpnportal/config.yaml zu. Auf einem Entwicklungsrechner
existiert der nicht, der Test war dort gruen. Auf einem Zielhost mit
installierter Konfiguration las er dagegen die Produktivkonfiguration und
loeste echte Verbindungsversuche zu Firewall und Domain Controllern aus.

Die Kommandoauswahl ist jetzt als reine Funktion commandFor testbar. Kein
Test ruft serve oder check mehr ohne expliziten --config-Pfad auf.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 13:22:35 +02:00
Carsten Abele
0fc2d8808b feat(auth): konfigurierbare TLS-Mindestversion fuer den Verzeichnisdienst
Domain Controller auf Windows Server 2012 R2 koennen TLS 1.2 per Registry
deaktiviert haben. ad.min_tls_version (Default 1.2) erlaubt es, fuer solche
Altsysteme auf 1.0/1.1 herunterzugehen; das Portal warnt dann bei jedem Start.

Die Zertifikatspruefung bleibt in jedem Fall aktiv — fuer LDAP gibt es
weiterhin keine Insecure-Option. Im Legacy-Modus kommen lediglich die
CBC-SHA256-Suiten hinzu, die Go als unsicher einstuft; RC4, 3DES und Suiten
ohne Forward Secrecy werden nie angeboten.

README dokumentiert zusaetzlich die beiden anderen 2012-R2-Stolpersteine:
SHA-1-signierte DC-Zertifikate (seit Go 1.24 nicht mehr umgehbar) und
RSA-Schluesselaustausch (nur ueber GODEBUG=tlsrsakex=1).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 13:18:24 +02:00
Carsten Abele
a2bce25424 fix(check): Log-Verzeichnis darf beim Start angelegt werden
Der Audit-Logger legt sein Verzeichnis per MkdirAll selbst an, check brach
aber ab, wenn es noch nicht existierte — der Pruefer war strenger als die
Laufzeit und blockierte die Erstinbetriebnahme. Fehlt zusaetzlich das
uebergeordnete Verzeichnis, bleibt es ein Fehler: dann steckt fast immer
ein Tippfehler im Pfad.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 10:14:06 +02:00
Carsten Abele
6694aa5d2e docs: Go-Version korrigiert und Installation auf dem Zielhost beschrieben
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 10:09:17 +02:00
Carsten Abele
4130a4eb4d fix(deps): korrekte go-Direktive und direkte Dependencies auszeichnen
go mod init hatte 1.26.5 eingetragen (lokaler Toolchain-Stand statt echter
Anforderung) und alle Abhängigkeiten faelschlich als indirect markiert.
Die tatsaechliche Untergrenze ist 1.25.0, vorgegeben durch golang.org/x/crypto.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 10:07:09 +02:00
Carsten Abele
f202ab811b Merge branch 'feature/v1-portal': VPN-Konfig-Portal v1
Vollständige Implementierung nach PRD.md: AD-Authentifizierung mit
DC-Failover, read-only OPNsense-Export-Client, serverseitig autorisierter
Streaming-Download, JSONL-Audit-Log mit Rotation, Startvalidierung und
gehärtete systemd-Unit.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 09:40:49 +02:00
Carsten Abele
4b287f9b1b docs: Installationsanleitung, gehärtete systemd-Unit und Beispielkonfiguration
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 09:37:45 +02:00
Carsten Abele
2d223c5823 feat(check,serve): Startvalidierung, HTTPS-Server, Signal-Handling und Versionscheck
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 09:34:22 +02:00
Carsten Abele
7e23df9fec feat(portal): Zertifikatssicht mit serverseitig autorisiertem Streaming-Export
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 09:27:31 +02:00
Carsten Abele
eb89d78ce2 feat(web): Router, Login/Logout, Übersicht, CSRF-geschützter Download, Anleitungen und /healthz
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 09:25:52 +02:00
Carsten Abele
bb2bc223b9 feat(web): Sessions, Rate-Limiting, Security-Header, Templates und eingebettete Assets
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 09:20:45 +02:00
Carsten Abele
e49882b8a8 feat(opnsense,certmatch): read-only Export-Client mit Streaming und CN-Zuordnung
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 09:15:53 +02:00
Carsten Abele
99ee8758cc feat(auth): AD-Authenticator mit Zwei-Schritt-Bind, DC-Failover und verschachtelter Gruppenprüfung
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 09:11:38 +02:00
Carsten Abele
2eb69bdcfe feat(audit): JSONL-Logger mit Größenrotation, gzip und SIGHUP-Reopen
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 09:08:19 +02:00
Carsten Abele
b47ee11ba4 feat(config): Strict-YAML, Secret-Dateien, Env-Overrides, Dateirechte und Validierung
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 09:06:43 +02:00
Carsten Abele
fbfff90b38 feat: CLI-Skeleton mit version/serve/check und Makefile
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 09:03:31 +02:00
Carsten Abele
bb84607bf8 docs: PRD und Implementierungsplan für das VPN-Konfig-Portal
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
2026-08-14 09:00:51 +02:00