Files
Hosting-Backoffice/reviews/chatgpt-consolidation-20260518-045303.md
T

350 lines
9.3 KiB
Markdown

# 1. Zusammenfassung
Claude benennt mehrere valide Architektur-Risiken. Übernommen werden vor allem die Punkte, die direkt sicherheits-, compliance- oder konsistenzrelevant sind:
- Tenant-Isolation muss technisch erzwungen werden.
- Secrets dürfen nicht direkt in Fachmodellen gespeichert werden.
- Superadmin-Zugriffe brauchen Schutzmechanismen.
- Kritische Statuswechsel brauchen State Machines und Historisierung.
- Retry/DLQ-Verhalten muss begrenzt und beobachtbar sein.
- Domänensprache und Modulgrenzen müssen vereinheitlicht werden.
Nicht übernommen wird die Empfehlung „zurück ans Reißbrett“. Stattdessen werden konkrete Projektdateien ergänzt/geändert.
---
# 2. Übernommene Punkte
## 2.1 Tenant-Isolation
Übernehmen:
- PostgreSQL Row Level Security für tenant-bezogene Tabellen.
- Tenant-Kontext zentral auf Request-/Job-Ebene.
- Automatischer Model-Scope zusätzlich zu RLS.
- Tests gegen Cross-Tenant-Zugriffe.
## 2.2 Secrets-Management
Übernehmen:
- Keine API-Keys, Passwörter oder Auth-Codes direkt in Business-Tabellen.
- Speicherung nur als Secret-Referenz.
- Verschlüsselung at-rest über Secret-Backend.
- Rotation und Zugriffsaudit dokumentieren.
## 2.3 Audit-Log
Übernehmen:
- Hash-Chain allein reicht nicht als Revisionssicherheit.
- Audit-Log als append-only behandeln.
- Export/Archivierung für Compliance ergänzen.
- Keine Aussage „GoBD-konform“ ohne Verfahrensdokumentation.
## 2.4 Domain-Management
Übernehmen:
- Domainmodell um produktionsrelevante Attribute erweitern.
- Auth-Codes nur als Secret-Referenz.
- Status für Transfer-Lock, DNSSEC, Whois-Privacy und Expiry ergänzen.
## 2.5 Kritische Flows
Übernehmen:
- Vertragsstatus, Zahlungsstatus, Kündigungen und Domain-Transfers nicht als freies CRUD.
- State Machines einführen.
- Statusübergänge historisieren.
## 2.6 Adapter-Resilienz
Übernehmen:
- Circuit Breaker ergänzen.
- Health Checks je Adapter.
- Retry-Limits, Backoff-Caps und DLQ-Verhalten definieren.
## 2.7 Domänensprache
Übernehmen:
- Einheitliche Begriffe festlegen.
- `tenant_id`, `organisation_id`, `customer_id`, `kunde` nicht vermischen.
- Fachsprache in Datenmodell, Code und API vereinheitlichen.
## 2.8 Versionierung von Produkten/Verträgen
Übernehmen:
- Preise, Produktbedingungen und Vertragsstände versionieren.
- Rechnungen müssen reproduzierbar bleiben.
## 2.9 Superadmin
Übernehmen:
- Superadmin-Zugriffe begrenzen.
- Break-Glass-Prozess dokumentieren.
- Kritische Aktionen auditieren.
- Optional 4-Augen-Freigabe für besonders kritische Aktionen.
---
# 3. Abgelehnte oder verschobene Punkte
## Abgelehnt
- **„Zurück ans Reißbrett“**
Nicht notwendig. Die Kritikpunkte werden als konkrete Architektur- und Implementierungsänderungen eingearbeitet.
- **Vollständiges Event Sourcing für alle kritischen Flows sofort**
Zu groß für den nächsten Schritt. Stattdessen: State Machines, Statushistorien, Audit-Events.
- **Vollständige Microservice-Aufteilung nach Bounded Contexts**
Wird nicht sofort umgesetzt. Ziel bleibt zunächst ein modularer Monolith mit klaren Modulgrenzen.
## Verschoben
- **Externer Timestamp-Service für Audit-Logs**
Später prüfen. Kurzfristig wichtiger: append-only Audit, Export, Archivierung, Berechtigungsschutz.
- **Vollständiges DNS-Record-Management**
Nur umsetzen, wenn das Backoffice tatsächlich DNS-Zonen verwalten soll. Kurzfristig werden Domain-Statusfelder ergänzt.
- **Formale GoBD-Zertifizierung**
Verschoben. Zuerst technische Grundlagen und Verfahrensdokumentation vorbereiten.
---
# 4. Neue/geänderte Dateien
## Architektur / ADRs
Neu:
- `docs/adr/0020-tenant-isolation-rls.md`
- `docs/adr/0021-secrets-management.md`
- `docs/adr/0022-audit-log-and-archiving.md`
- `docs/adr/0023-state-machines-for-critical-flows.md`
- `docs/adr/0024-adapter-resilience-circuit-breaker.md`
- `docs/adr/0025-domain-language.md`
- `docs/adr/0026-superadmin-break-glass.md`
- `docs/adr/0027-product-contract-versioning.md`
Ändern:
- `docs/adr/0017-adapter-resilience.md`
---
## Security / Tenancy
Neu:
- `app/Support/Tenancy/TenantContext.php`
- `app/Http/Middleware/ResolveTenantContext.php`
- `app/Models/Concerns/BelongsToTenant.php`
- `app/Jobs/Middleware/ResolveTenantForJob.php`
- `tests/Feature/Security/TenantIsolationTest.php`
- `tests/Feature/Security/TenantContextRequiredTest.php`
Neu/ändern:
- `database/migrations/XXXX_enable_rls_for_tenant_tables.sql`
- `database/migrations/XXXX_add_tenant_id_indexes.sql`
---
## Secrets
Neu:
- `config/secrets.php`
- `app/Services/Secrets/SecretStore.php`
- `app/Services/Secrets/VaultSecretStore.php`
- `app/Services/Secrets/DatabaseEncryptedSecretStore.php`
- `app/Services/Secrets/SecretReference.php`
- `tests/Feature/Security/SecretStorageTest.php`
- `docs/security/secrets-management.md`
Ändern:
- `app/Models/RegistrarAccount.php`
- `app/Models/Domain.php`
Erwartete Änderung:
- Keine Spalten wie `api_key`, `password`, `auth_code`.
- Stattdessen Spalten wie `secret_reference`, `auth_code_secret_reference`.
---
## Audit / Compliance
Neu:
- `app/Models/AuditLog.php`
- `app/Services/Audit/AuditLogger.php`
- `app/Services/Audit/AuditArchiveExporter.php`
- `database/migrations/XXXX_create_audit_logs_table.php`
- `database/migrations/XXXX_restrict_audit_log_mutations.sql`
- `tests/Feature/Audit/AuditLogAppendOnlyTest.php`
- `docs/compliance/audit-log.md`
- `docs/compliance/gobd-verfahrensdokumentation-template.md`
---
## Domain-Management
Ändern:
- `app/Models/Domain.php`
- `database/migrations/XXXX_extend_domains_table.php`
Ergänzen:
- `dnssec_status`
- `transfer_lock_enabled`
- `whois_privacy_enabled`
- `expiry_date`
- `expiry_notification_status`
- `auth_code_secret_reference`
- `registrar_status`
- `last_registry_sync_at`
Neu:
- `app/Enums/Domain/DnssecStatus.php`
- `app/Enums/Domain/RegistrarStatus.php`
- `app/Enums/Domain/ExpiryNotificationStatus.php`
---
## State Machines / Statushistorie
Neu:
- `app/StateMachines/ContractStateMachine.php`
- `app/StateMachines/PaymentStateMachine.php`
- `app/StateMachines/CancellationStateMachine.php`
- `app/StateMachines/DomainTransferStateMachine.php`
Neu:
- `database/migrations/XXXX_create_contract_status_history_table.php`
- `database/migrations/XXXX_create_payment_status_history_table.php`
- `database/migrations/XXXX_create_domain_transfer_status_history_table.php`
Neu:
- `tests/Feature/StateMachines/ContractStateMachineTest.php`
- `tests/Feature/StateMachines/PaymentStateMachineTest.php`
- `tests/Feature/StateMachines/DomainTransferStateMachineTest.php`
---
## Adapter / Retry / DLQ
Neu:
- `config/adapters.php`
- `app/Support/Adapters/CircuitBreaker.php`
- `app/Support/Adapters/AdapterHealthCheck.php`
- `app/Support/Adapters/RetryPolicy.php`
- `app/Support/Adapters/DeadLetterHandler.php`
- `app/Console/Commands/CheckAdapterHealthCommand.php`
- `tests/Feature/Adapters/CircuitBreakerTest.php`
- `tests/Feature/Queue/DeadLetterHandlingTest.php`
Ändern:
- `docs/adr/0017-adapter-resilience.md`
Ergänzen:
- Max Retry Count
- Exponential Backoff Cap
- DLQ nach endgültigem Fehlschlag
- Alerting-Schwelle
- Poison-Message-Handling
---
## Domänensprache / Modulgrenzen
Neu:
- `docs/domain/glossary.md`
- `docs/domain/module-boundaries.md`
Ändern:
- `docs/api/openapi.yaml`
- betroffene Models, DTOs, Requests und Resources
Festlegung:
- Einheitlich verwenden:
- `tenant` für Mandant/Systemgrenze
- `customer` für Kunde
- `contract` für Vertrag
- `product` für Produkt
- `invoice` für Rechnung
---
## Produkt- und Vertragsversionierung
Neu:
- `app/Models/ProductVersion.php`
- `app/Models/ContractVersion.php`
- `database/migrations/XXXX_create_product_versions_table.php`
- `database/migrations/XXXX_create_contract_versions_table.php`
- `tests/Feature/Billing/ProductVersioningTest.php`
- `tests/Feature/Billing/InvoiceReproducibilityTest.php`
Ändern:
- `app/Models/Product.php`
- `app/Models/Contract.php`
- `app/Models/Invoice.php`
---
## Superadmin / Break-Glass
Neu:
- `app/Policies/SuperadminPolicy.php`
- `app/Services/Security/BreakGlassAccessService.php`
- `app/Models/PrivilegedAccessGrant.php`
- `database/migrations/XXXX_create_privileged_access_grants_table.php`
- `tests/Feature/Security/BreakGlassAccessTest.php`
- `docs/security/break-glass.md`
Ergänzen:
- zeitlich begrenzte Rechte
- Begründungspflicht
- Audit-Log für jede privilegierte Aktion
- optional 4-Augen-Freigabe für definierte Aktionen
---
# 5. Konkrete nächste Schritte
1. `docs/adr/0020-tenant-isolation-rls.md` erstellen und RLS als verbindliche Entscheidung festhalten.
2. Tenant-Kontext mit `TenantContext`, Middleware und Model-Concern implementieren.
3. RLS-Migration für alle tenant-bezogenen Tabellen ergänzen.
4. Cross-Tenant-Sicherheitstests schreiben und in CI verpflichtend machen.
5. `docs/adr/0021-secrets-management.md` erstellen.
6. Registrar- und Domain-Secrets aus Fachmodellen entfernen und durch Secret-Referenzen ersetzen.
7. Adapter-ADR `0017` um Circuit Breaker, Health Checks, Retry-Limits und DLQ-Regeln erweitern.
8. State Machines für Vertrag, Zahlung, Kündigung und Domain-Transfer definieren.
9. Produkt- und Vertragsversionierung als Tabellen und Tests ergänzen.
10. `docs/domain/glossary.md` erstellen und Begriffe im Code vereinheitlichen.
11. Break-Glass-Zugriffe für Superadmin modellieren und auditieren.
12. Audit-Log append-only absichern und Archivierungsdokumentation ergänzen.