350 lines
9.3 KiB
Markdown
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. |