Rename the top-level lib/ directory to core/ so the project root immediately communicates which code is core platform and which lives in modules/. PHP namespaces (MintyPHP\*) are unchanged — only the Composer PSR-4 path mapping moves from lib/ to core/. Module-internal lib/ directories (modules/*/lib/) are untouched. Updated across the full stack: - composer.json PSR-4 mapping - bootstrap entry points (web/index.php, bin/*, tests/bootstrap.php) - tooling configs (phpstan.neon, phpunit.xml, php-cs-fixer) - 26 architecture contract tests - enforcement-policy, guard-catalog, quality-gates - all documentation (CLAUDE.md, README, 25 docs/, .agents/skills/) - bin/qa-extended.sh search paths - .claude/settings.local.json permission paths Workflow: .agents/runs/CORE-LIB-RENAME-001/ (Analyst → Planner → Executor → Code Review (4 findings fixed) → Security Review → Acceptance Test → Finalizer) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
4.1 KiB
4.1 KiB
Sicherheitsmodell
Letzte Aktualisierung: 2026-03-06
Ziel
Kurze, verbindliche Übersicht der Sicherheitsmechanik für Web und API.
Sicherheitskette pro Request
- Firewall/Request-Grenze
- Authentifizierung
- Permission-Check
- Tenant-Scope-Check
- Endpoint-spezifische Regeln (z. B. Exporte, Media, Audit)
Kein Layer allein reicht aus.
Public vs. Protected
- Public-Routen kommen aus
config/routes.php(public => true). - Zusätzlich sind Präfixe technisch immer public (
branding/,flash/,auth/microsoft/,api/) incore/Http/AccessControl.php. - Alles andere erfordert Login.
API-Sonderfall:
pages/api/v1/auth/login().phpnutztApiBootstrap::init(false)(public Login-Endpunkt).- Geschützte API-Endpunkte nutzen
ApiBootstrap::init().
Auth und Login
- Web-Login ist session-basiert (
pages/auth/login().php). - Remember-Me-Autologin läuft früh in
web/index.php. - Multi-Tenant-Login wählt Tenant-Kontext serverseitig.
- Microsoft-SSO läuft über OIDC (
auth/microsoft/start+auth/microsoft/callback) mitstate,nonce, PKCE und ID-Token-Validierung.
Permission und Tenant-Scope
- Rechte werden serverseitig geprüft (
PermissionService+ Policies). - UI-Sichtbarkeit wird ebenfalls serverseitig vorbereitet (
UiAccessService+$viewAuth), nicht im Template selbst entschieden. - Globaler Scope-Bypass ist explizit:
tenant.scope.global. - Beispiel für harte Feature-Gates:
users.access_pdfcustom_fields.manage,custom_fields.edit_valuestenants.sso_manageapi_audit.view
API-Schutz
- Zentrale API-Rate-Limits laufen in
core/Http/ApiBootstrap.php. - API-Audit läuft zentral über
ApiAuditService:- loggt Metadaten (Pfad, Status, Dauer, Kontext)
- redigiert sensible Query-Parameter
- speichert keine Request-/Response-Bodies
Edge-Hardening (Nginx)
- Security-Header werden zentral im Nginx gesetzt.
- Baseline:
X-Content-Type-Options: nosniffX-Frame-Options: SAMEORIGINReferrer-Policy: strict-origin-when-cross-originPermissions-Policy: camera=(), microphone=(), geolocation=(), payment=(), usb=()X-Permitted-Cross-Domain-Policies: none
- Produktion ergänzt:
Strict-Transport-Security: max-age=31536000
- Lokale Entwicklung setzt bewusst kein HSTS, um HTTP-/localhost-Workflows nicht zu beeinflussen.
System-Audit (fachliche Aktionen)
- Separater Audit-Stream:
system_audit_log(unabhängig vonapi_audit_log). - Scope V2:
- Web: Auth-Events + Admin-Write-Aktionen.
- API: selektive
api.request-Events (Write-Requests,>=500, Security-Endpunkte bei>=400). - Scheduler:
scheduler.run(Runner-Zusammenfassung) undscheduler.job.run(pro Joblauf). - CLI:
cli.commandfür zentrale Betriebsbefehle (z. B.php bin/console doctor).
- Privacy-Default:
- keine Request-/Response-Bodies
- keine Klartext-Secrets/Passwörter/Tokens/E-Mails
- IP/User-Agent nur gehasht (HMAC)
- Globaler Schalter über Settings:
system_audit_enabled(hard-off: keine neuen Events)system_audit_retention_days(Retention/Purge)
- RBAC:
system_audit.viewsystem_audit.purge
Schreibschutz
- Web-Schreibaktionen laufen mit CSRF-Token.
- Kritische Actions sind POST-only + serverseitige Validierung.
- API nutzt Bearer-Auth und eigenes Schutzmodell (kein Form-CSRF).
Betriebschecks
- Permission-Set und Rollen regelmäßig prüfen.
- Tenant-Entzug/Scope-Verhalten testen.
- Rate-Limits und
429-Verhalten bei Login/API testen. - Audit-Streams bewusst getrennt nutzen:
system_audit_log: fachliche/sicherheitsrelevante Ereignisse (summary-level)api_audit_log: API-Request-Telemetrie (Status, Dauer, Pfad)import_audit_runs,user_lifecycle_audit_log,scheduled_job_runs: Domänen-/Betriebsdetails
- Audit-Retention prüfen:
- API-Audit: 90 Tage
- Import-Audit: 90 Tage
- User-Lifecycle-Audit: 365 Tage
- System-Audit: konfigurierbar (Default 365 Tage)
Vertiefung
/docs/explanation-session-management.md/docs/howto-anfragelimits.md/docs/tutorial-07-security-tenant-scope.md/docs/howto-rbac-permissions-playbook.md