# 05 – Vollständiger Prüfkatalog

Generiert aus `catalog.js` (Version 1.0.0). 211 Prüffragen in 12 Kapiteln. Alle Befehle sind ausschließlich lesend.

## A – Windows Server (13)

_Basis des Betriebs: Version, Ressourcen, Netz, Updates, Backup, Umgebungstrennung._ Gate: **SERVER**

### A01 Windows-Server-Version, Edition und Build

- **Antworttyp:** version
- **Warum wichtig?** Bestimmt unterstützte IIS-Version, HTTP/2, TLS 1.3, .NET-Runtimes und den Support-Zeitraum.
- **GUI-/Menüpfad:** Einstellungen → System → Info (oder Ausführen: winver)
- **Lesender Befehl (powershell):**

```powershell
Get-ComputerInfo | Select-Object WindowsProductName, WindowsEditionId, OsVersion, OsBuildNumber, OsArchitecture
```

- **Erwartbare Ergebnisse:** 2016 = IIS 10.0 (HTTP/2 ja, TLS 1.3 nein). 2019 = IIS 10 v1809. 2022 = IIS 10 mit TLS 1.3, HTTP/3 möglich. 2012 R2 = EOL (Okt 2023) → Blocker für neue Produktion.
- **Architekturauswirkung:** Server < 2016: kein HTTP/2, kein TLS 1.3, eingeschränkte .NET-Unterstützung. EOL-Version = organisatorischer Blocker.

### A02 Virtuelle Maschine oder physischer Server?

- **Antworttyp:** single – `vm_vmware` VM (VMware) · `vm_hyperv` VM (Hyper-V) · `vm_andere` VM (andere Plattform) · `physisch` Physisch · `unbekannt` Unbekannt
- **Warum wichtig?** Snapshots ermöglichen Rollback vor Deployments und Test-Klone.
- **GUI-/Menüpfad:** Server-Manager → Lokaler Server → Hardware / Geräte-Manager
- **Lesender Befehl (powershell):**

```powershell
Get-CimInstance Win32_ComputerSystem | Select-Object Manufacturer, Model, TotalPhysicalMemory
```

- **Erwartbare Ergebnisse:** „VMware, Inc.“ / „Microsoft Corporation – Virtual Machine“ = VM.
- **Architekturauswirkung:** VM: Snapshot-basiertes Rollback als Deployment-Sicherheitsnetz möglich (Abstimmung mit IT).

### A03 CPU-Kerne und Arbeitsspeicher

- **Antworttyp:** text
- **Warum wichtig?** Grenzt die Zahl paralleler App-Pools, Worker-Prozesse und In-Memory-Caches ein.
- **GUI-/Menüpfad:** Task-Manager → Leistung
- **Lesender Befehl (powershell):**

```powershell
Get-CimInstance Win32_ComputerSystem | Select-Object NumberOfLogicalProcessors, @{n='RAM_GB';e={[math]::Round($_.TotalPhysicalMemory/1GB)}}
```

- **Erwartbare Ergebnisse:** z. B. 4 Kerne / 8 GB. Unter 4 GB frei: keine zusätzlichen Dienste (Redis, Node) ohne Ausbau.
- **Architekturauswirkung:** Wenig RAM → schlank bleiben: ein App-Pool, Jobs als Scheduled Task statt dauerhafter Dienste.

### A04 Laufwerke, freier Speicher, Ablageort für Anwendungen

- **Antworttyp:** text
- **Warum wichtig?** Anwendungsordner, Logs, Uploads und Backups brauchen definierten, überwachten Platz.
- **GUI-/Menüpfad:** Explorer → Dieser PC
- **Lesender Befehl (powershell):**

```powershell
Get-PSDrive -PSProvider FileSystem | Select-Object Name, @{n='FreeGB';e={[math]::Round($_.Free/1GB,1)}}, @{n='UsedGB';e={[math]::Round($_.Used/1GB,1)}}
```

- **Erwartbare Ergebnisse:** Datenlaufwerk (D:) für inetpub/Apps üblich. < 10 GB frei = Risiko für Logs/Uploads.
- **Architekturauswirkung:** Bestimmt Upload-Konzept (Dateisystem vs. DB), Log-Rotation und Aufbewahrung.

### A05 Welche weiteren Anwendungen laufen auf demselben Server?

- **Antworttyp:** multi – `nur_iis` Nur IIS/Webanwendungen · `andere_web` Andere produktive Webanwendungen · `db_lokal` Datenbankserver lokal · `fachanwendungen` Fachanwendungen/Dienste Dritter · `unbekannt` Unbekannt
- **Warum wichtig?** Geteilte Server erhöhen das Risiko von Seiteneffekten (Neustarts, Ports, Ressourcen, Updates).
- **GUI-/Menüpfad:** Server-Manager → Rollen und Features; IIS-Manager → Sites
- **Lesender Befehl (powershell):**

```powershell
Get-Service | Where-Object Status -eq 'Running' | Where-Object StartType -eq 'Automatic' | Select-Object Name, DisplayName | Sort-Object Name
```

- **Erwartbare Ergebnisse:** Dienstliste zeigt DB-Server, Fachanwendungen, Agenten.
- **Architekturauswirkung:** Shared Host → eigener App-Pool zwingend, keine serverweiten IIS-Änderungen ohne Abstimmung.

### A06 Hostname, FQDN, DNS-Namen, unter denen die Anwendung erreichbar sein soll

- **Antworttyp:** text
- **Warum wichtig?** Bindings, Zertifikat-SAN, Kerberos-SPN, Cookies und PWA-Scope hängen am Hostnamen.
- **GUI-/Menüpfad:** Systemeigenschaften → Computername; DNS-Manager (IT)
- **Lesender Befehl (powershell):**

```powershell
[System.Net.Dns]::GetHostEntry($env:COMPUTERNAME).HostName; Get-DnsClientServerAddress -AddressFamily IPv4 | Select-Object InterfaceAlias, ServerAddresses
```

- **Erwartbare Ergebnisse:** FQDN wie srv-web01.intern.example. Ein eigener DNS-Alias (app.intern) ist wünschenswert.
- **Architekturauswirkung:** Ohne eigenen Hostnamen: Betrieb als Unteranwendung (/app) → relative URLs, Cookie-Path, kein eigener PWA-Scope.

### A07 Wird ausgehender Verkehr über einen Proxy geleitet?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Proxy-Pflicht beeinflusst NuGet/npm-Restore auf dem Server, externe APIs und Update-Downloads.
- **GUI-/Menüpfad:** Einstellungen → Netzwerk → Proxy; Internetoptionen → Verbindungen → LAN-Einstellungen
- **Lesender Befehl (powershell):**

```powershell
netsh winhttp show proxy; [System.Net.WebRequest]::DefaultWebProxy.GetProxy('https://www.microsoft.com')
```

- **Erwartbare Ergebnisse:** „Direkter Zugriff“ = kein Proxy. Sonst Proxy-Adresse; Auth-Proxys blockieren Dienste ohne Anmeldedaten.
- **Architekturauswirkung:** Proxy → alle Server-Prozesse (App-Pool, Dienste) müssen Proxy explizit kennen; Builds nicht auf dem Server.

### A08 Ausgehender Internetzugriff vom Server

- **Antworttyp:** single – `frei` Frei (HTTPS) · `proxy_allowlist` Nur über Proxy/Allowlist · `keiner` Kein Internetzugriff · `unbekannt` Unbekannt
- **Warum wichtig?** Entscheidet, ob Paketquellen, CDNs, externe APIs oder Zertifikatsdienste vom Server erreichbar sind.
- **GUI-/Menüpfad:** Browser auf dem Server: https://api.nuget.org/v3/index.json aufrufen
- **Lesender Befehl (powershell):**

```powershell
Test-NetConnection api.nuget.org -Port 443 | Select-Object ComputerName, TcpTestSucceeded; Test-NetConnection registry.npmjs.org -Port 443 | Select-Object TcpTestSucceeded
```

- **Erwartbare Ergebnisse:** TcpTestSucceeded True = erreichbar. False = geblockt → Self-Contained-Deployments, keine Runtime-Downloads.
- **Architekturauswirkung:** Kein Internet → alle Assets self-hosted, Builds auf Entwicklungsrechnern, Runtimes per Installer durch IT.

### A09 Firewall-Rahmen (eingehend)

- **Antworttyp:** multi – `nur_80_443` Nur 80/443 eingehend erlaubt · `weitere_ports` Weitere Ports freischaltbar (Antrag) · `zentrale_fw` Zentrale Firewall vor dem Server · `lokale_fw_aktiv` Windows-Firewall aktiv · `unbekannt` Unbekannt
- **Warum wichtig?** Zusätzliche Dienste (Kestrel-Port, Node, Redis, WebSocket-Server) brauchen Freischaltungen.
- **GUI-/Menüpfad:** Windows Defender Firewall mit erweiterter Sicherheit → Eingehende Regeln
- **Lesender Befehl (powershell):**

```powershell
Get-NetFirewallProfile | Select-Object Name, Enabled, DefaultInboundAction; Get-NetFirewallRule -Enabled True -Direction Inbound -Action Allow | ForEach-Object { $p = $_ | Get-NetFirewallPortFilter; [pscustomobject]@{Rule=$_.DisplayName; Port=$p.LocalPort; Proto=$p.Protocol} } | Where-Object { $_.Port -and $_.Port -ne 'Any' } | Sort-Object Port -Unique
```

- **Erwartbare Ergebnisse:** Typisch: 80, 443, 3389, 5985. Alles Weitere = Antrag.
- **Architekturauswirkung:** Nur 80/443 → alles hinter IIS (In-Process/ARR), kein direkter Zugriff auf Kestrel/Node-Ports.

### A10 Update-Prozess des Servers

- **Antworttyp:** single – `wsus_automatisch` WSUS/automatisch mit Wartungsfenster · `manuell` Manuell durch IT · `keiner` Kein geregelter Prozess · `unbekannt` Unbekannt
- **Warum wichtig?** Neustarts und Patchstände wirken auf Verfügbarkeit, Runtime-Sicherheitsupdates (Hosting Bundle) und Testfenster.
- **GUI-/Menüpfad:** Einstellungen → Windows Update → Updateverlauf
- **Lesender Befehl (powershell):**

```powershell
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 5 HotFixID, InstalledOn
```

- **Erwartbare Ergebnisse:** Letzte Updates < 60 Tage = gepflegt. Ältere Stände → Sicherheitsrisiko, Klärung.
- **Architekturauswirkung:** Runtime-Updates (.NET) müssen in den Patchprozess integriert werden; Application Initialization für Warmstart nach Reboot.

### A11 Backup/Restore des Servers

- **Antworttyp:** single – `vm_snapshot` VM-Backup/Snapshots · `agent_backup` Agentenbasiertes Backup (Veeam, Commvault, …) · `windows_backup` Windows Server Backup · `keins` Kein Backup · `unbekannt` Unbekannt
- **Warum wichtig?** Ohne belastbares Restore keine Produktionsfreigabe für operative Daten.
- **GUI-/Menüpfad:** Backup-Konsole der IT; Server-Manager → Tools → Windows Server-Sicherung
- **Lesender Befehl (powershell):**

```powershell
Get-Service | Where-Object DisplayName -match 'Backup|Veeam|Acronis|Commvault|Arcserve' | Select-Object Name, DisplayName, Status; wbadmin get versions
```

- **Erwartbare Ergebnisse:** Backup-Agent-Dienst aktiv oder wbadmin-Versionen vorhanden. Wichtig: Wurde ein Restore je getestet?
- **Architekturauswirkung:** Backup-Konzept muss App-Ordner, Uploads, Konfiguration und DB konsistent abdecken.

### A12 Vorhandene DEV/TEST/PROD-Trennung

- **Antworttyp:** single – `drei_umgebungen` DEV, TEST und PROD getrennt · `test_und_prod` TEST und PROD · `nur_prod` Nur PROD · `unbekannt` Unbekannt
- **Warum wichtig?** Bestimmt, ob Änderungen vor Produktion realistisch verprobt werden können.
- **GUI-/Menüpfad:** Serverliste/CMDB der IT; IIS-Manager → Sites (Test-Site vorhanden?)
- **Lesender Befehl (powershell):**

```powershell
Get-IISSite | Select-Object Name, State, @{n='Bindings';e={($_.Bindings | ForEach-Object bindingInformation) -join '; '}}
```

- **Erwartbare Ergebnisse:** Separater Test-Server ideal; Test-Site auf demselben Server akzeptabel; nur PROD = hohes Risiko.
- **Architekturauswirkung:** Nur PROD → Feature-Flags, Blue/Green per Ordnerwechsel, konservative Releases.

### A13 Wartungsfenster und Neustartmöglichkeiten

- **Antworttyp:** text
- **Warum wichtig?** IIS-Rollen-Installationen und Hosting-Bundle-Updates erfordern teils IIS-Neustart.
- **GUI-/Menüpfad:** Betriebsvereinbarung / Change-Prozess der IT
- **Lesender Befehl (text):**

```
(organisatorische Frage – kein Befehl)
```

- **Erwartbare Ergebnisse:** z. B. „Dienstag 18–20 Uhr nach Ankündigung“ oder „jederzeit nach Absprache“.
- **Architekturauswirkung:** Bestimmt Deploymentfrequenz und ob Zero-Downtime-Verfahren nötig sind.

## B – Active Directory (12)

_Authentifizierung, SSO, Gruppen, Service-Konten, Zugriff der App-Pool-Identität._ Gate: **SECURITY**

### B01 Ist der Webserver Mitglied der AD-Domäne?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Voraussetzung für Windows Authentication, gMSA, Kerberos und gruppenbasierte Autorisierung.
- **GUI-/Menüpfad:** Systemeigenschaften → Computername → Domäne
- **Lesender Befehl (powershell):**

```powershell
Get-CimInstance Win32_ComputerSystem | Select-Object Name, Domain, PartOfDomain
```

- **Erwartbare Ergebnisse:** PartOfDomain True + Domänenname.
- **Architekturauswirkung:** Nein → nur Forms/LDAP-Bind-Auth, keine integrierte Windows-Authentifizierung.

### B02 Domänencontroller erreichbar, Domänenname, Standort

- **Antworttyp:** text
- **Warum wichtig?** LDAP/Kerberos-Erreichbarkeit vom Webserver ist Voraussetzung für SSO und Gruppenabfragen.
- **GUI-/Menüpfad:** Active Directory-Benutzer und -Computer (IT)
- **Lesender Befehl (cmd):**

```
nltest /dsgetdc:$env:USERDNSDOMAIN
```

- **Erwartbare Ergebnisse:** DC-Name, Adresse, Site. Fehler = Netz-/DNS-Problem.
- **Architekturauswirkung:** Legt Ziel für LDAP-Abfragen und SPN-Registrierung fest.
- **Folgefrage:** wird nur angezeigt, wenn `v => v('B01') === 'ja'`

### B03 Ist die IIS-Rolle „Windows-Authentifizierung“ installiert?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Ermöglicht transparentes SSO für Domänenbenutzer ohne eigene Passwortverwaltung.
- **GUI-/Menüpfad:** Server-Manager → Rollen → Webserver (IIS) → Sicherheit → Windows-Authentifizierung
- **Lesender Befehl (powershell):**

```powershell
Get-WindowsFeature Web-Windows-Auth | Select-Object Name, InstallState
```

- **Erwartbare Ergebnisse:** InstallState Installed. „Available“ = installierbar (Antrag an IT).
- **Architekturauswirkung:** Vorhanden → AD-SSO (Negotiate/Kerberos) als bevorzugte Auth. Fehlt → Antrag oder Forms-Auth mit LDAP.
- **Folgefrage:** wird nur angezeigt, wenn `v => v('B01') !== 'nein'`

### B04 Gewünschtes/zulässiges Authentifizierungsmodell für die neue Anwendung

- **Antworttyp:** single – `sso_ad` Windows-SSO (Negotiate/Kerberos) · `forms_ldap` Login-Formular mit AD/LDAP-Prüfung · `lokale_konten` Anwendungseigene Konten · `oidc` OpenID Connect / Entra ID / ADFS · `unbekannt` Unbekannt
- **Warum wichtig?** Auth-Modell bestimmt Benutzererlebnis auf mobilen Clients, Sicherheitsfreigabe und Rollenmodell.
- **GUI-/Menüpfad:** Abstimmung mit IT-Security; IIS-Manager → Site → Authentifizierung
- **Lesender Befehl (powershell):**

```powershell
Get-WebConfiguration -Filter 'system.webServer/security/authentication/*' -PSPath 'IIS:\Sites\Default Web Site' | Select-Object SectionPath, enabled
```

- **Erwartbare Ergebnisse:** Zeigt, welche Auth-Module an bestehenden Sites aktiv sind (Muster der Organisation).
- **Architekturauswirkung:** SSO muss im realen Zugriffspfad (MobileIron/Tunnel) funktionieren – siehe Kapitel L.
- **Folgefrage:** wird nur angezeigt, wenn `v => v('B01') !== 'nein'`

### B05 Kerberos oder NTLM im praktischen Einsatz?

- **Antworttyp:** single – `kerberos` Kerberos (SPNs gepflegt) · `ntlm` Überwiegend NTLM · `beides` Beides je nach Client · `unbekannt` Unbekannt
- **Warum wichtig?** Kerberos braucht korrekte SPNs und funktioniert nur bei Hostnamen mit Domänen-Trust; NTLM ist Fallback mit Mehrfach-Roundtrips.
- **GUI-/Menüpfad:** Auf einem Client nach Zugriff auf eine Windows-Auth-Site: Eingabeaufforderung
- **Lesender Befehl (cmd):**

```
klist | findstr /i HTTP
setspn -Q HTTP/<fqdn-des-webservers>
```

- **Erwartbare Ergebnisse:** klist zeigt HTTP/<host>-Ticket = Kerberos. Kein Ticket, Zugriff klappt trotzdem = NTLM.
- **Architekturauswirkung:** Eigener DNS-Alias erfordert SPN-Registrierung (IT-Aufgabe). Mobile Clients nutzen häufig nur NTLM oder gar kein SSO.
- **Folgefrage:** wird nur angezeigt, wenn `v => v('B03') === 'ja' || v('B04') === 'sso_ad'`

### B06 Muss die Anwendung mit Benutzeridentität auf Backend-Ressourcen zugreifen (Double Hop / Delegation)?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Delegation (Kerberos Constrained Delegation) ist aufwendig; meist reicht Zugriff über die Dienstidentität.
- **GUI-/Menüpfad:** AD-Benutzer und -Computer → Computerobjekt → Delegierung (IT)
- **Lesender Befehl (cmd):**

```
setspn -L <computername>
```

- **Erwartbare Ergebnisse:** In der Regel „nein“: App greift mit eigenem Service-Konto auf DB/SMB zu.
- **Architekturauswirkung:** Ja → KCD-Konfiguration durch IT; Nein → Service-Konto/gMSA für Backend-Zugriffe.
- **Folgefrage:** wird nur angezeigt, wenn `v => v('B04') === 'sso_ad'`

### B07 LDAP/LDAPS vom Webserver erreichbar?

- **Antworttyp:** single – `ldaps_636` LDAPS (636) erreichbar · `ldap_389` Nur LDAP (389) · `keins` Nicht erreichbar · `unbekannt` Unbekannt
- **Warum wichtig?** Für Gruppenauflösung, Benutzersuche, Forms-Login gegen AD.
- **GUI-/Menüpfad:** IT-Firewall-Regelwerk
- **Lesender Befehl (powershell):**

```powershell
$dc = (nltest /dsgetdc:$env:USERDNSDOMAIN | Select-String 'DC:').ToString().Split('\\')[-1].Trim(); Test-NetConnection $dc -Port 636 | Select-Object ComputerName, TcpTestSucceeded; Test-NetConnection $dc -Port 389 | Select-Object TcpTestSucceeded
```

- **Erwartbare Ergebnisse:** 636 True = LDAPS möglich (bevorzugt). Nur 389 = Klartext-LDAP, für Anmeldungen ungeeignet.
- **Architekturauswirkung:** LDAPS → Forms-Auth gegen AD und Gruppenabfragen möglich. Keins → nur Windows-Auth-Token oder lokale Konten.
- **Folgefrage:** wird nur angezeigt, wenn `v => v('B01') !== 'nein'`

### B08 Können AD-Gruppen für Anwendungsrollen angelegt/genutzt werden?

- **Antworttyp:** single – `eigene_gruppen` Ja, eigene Gruppen je Anwendung/Rolle · `bestehende` Nur bestehende Gruppen (OE-Gruppen) · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Gruppenbasierte Autorisierung vermeidet eigene Rollenverwaltung, braucht aber einen Pflegeprozess.
- **GUI-/Menüpfad:** AD-Benutzer und -Computer → OU für Anwendungsgruppen (IT)
- **Lesender Befehl (cmd):**

```
whoami /groups | findstr /i APP
:: mit RSAT:
powershell -c "Get-ADGroup -Filter \"Name -like '*APP*'\" | Select-Object Name"
```

- **Erwartbare Ergebnisse:** Konvention wie „APP-<Name>-<Rolle>“ zeigt Praxis.
- **Architekturauswirkung:** Eigene Gruppen → Rollen = Gruppen. Nur bestehende → Rollenmapping in der App-DB nötig (Single Source of Truth klären).
- **Folgefrage:** wird nur angezeigt, wenn `v => v('B01') !== 'nein'`

### B09 Wer pflegt Gruppenmitgliedschaften und wie schnell?

- **Antworttyp:** text
- **Warum wichtig?** Operative Rollen (z. B. Führungsfunktion) ändern sich schnell – Ticket-Laufzeiten von Tagen sind unbrauchbar.
- **GUI-/Menüpfad:** Prozessdokumentation IT / Servicedesk
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Self-Service, Fachadmin oder IT-Ticket mit SLA.
- **Architekturauswirkung:** Langsame Pflege → operative Rollen in der App halten, AD nur für Grundzugang.
- **Folgefrage:** wird nur angezeigt, wenn `v => ['eigene_gruppen', 'bestehende'].includes(v('B08'))`

### B10 Service Accounts / gMSA für App-Pools und Dienste

- **Antworttyp:** single – `gmsa` gMSA verfügbar · `service_account` Klassisches Dienstkonto (Passwort) · `keins` Nur lokale Identitäten (ApplicationPoolIdentity) · `unbekannt` Unbekannt
- **Warum wichtig?** gMSA vermeidet Passwortverwaltung und erlaubt Zugriff auf Netzressourcen/DB mit integrierter Auth.
- **GUI-/Menüpfad:** AD-Verwaltungscenter → Verwaltete Dienstkonten (IT)
- **Lesender Befehl (powershell):**

```powershell
Get-KdsRootKey | Select-Object KeyId, EffectiveTime; Get-ADServiceAccount -Filter * | Select-Object Name
```

- **Erwartbare Ergebnisse:** KDS-Root-Key vorhanden = gMSA-fähig. Befehle brauchen RSAT/AD-Rechte – sonst IT fragen.
- **Architekturauswirkung:** gMSA → App-Pool und Windows-Service ohne Secrets; Keins → Secrets-Handling (J10) wird kritisch.
- **Folgefrage:** wird nur angezeigt, wenn `v => v('B01') !== 'nein'`

### B11 Darf die App-Pool-Identität auf Netzwerkressourcen (SMB, DB mit integrierter Auth) zugreifen?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Entscheidet, ob Importe von Netzlaufwerken und Auth ohne Klartext-Passwort möglich sind.
- **GUI-/Menüpfad:** IIS-Manager → Anwendungspools → Erweiterte Einstellungen → Identität
- **Lesender Befehl (powershell):**

```powershell
Get-IISAppPool | Select-Object Name, @{n='Identity';e={$_.ProcessModel.IdentityType}}, @{n='User';e={$_.ProcessModel.UserName}}
```

- **Erwartbare Ergebnisse:** ApplicationPoolIdentity greift als Computerkonto (DOMAIN\HOST$) zu – muss auf Freigaben berechtigt werden.
- **Architekturauswirkung:** Nein → Dateiimporte über Upload/Freigabe-Sync-Dienst; DB-Auth per Benutzer/Passwort.

### B12 Funktioniert Windows-SSO auch auf mobilen/verwalteten Clients (MobileIron/@Work)?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Mobile Browser können oft kein Kerberos; ohne Antwort ist SSO als Baseline nicht belastbar.
- **GUI-/Menüpfad:** Test im realen Zugriffspfad: bestehende Windows-Auth-Site vom Smartphone öffnen
- **Lesender Befehl (text):**

```
(Test am Gerät – Ergebnis dokumentieren: Login-Dialog? Fehler 401? transparent?)
```

- **Erwartbare Ergebnisse:** Transparente Anmeldung = SSO tunnelfähig. Basic-Dialog/401 = kein SSO auf Mobilgeräten.
- **Architekturauswirkung:** Nein → Auth muss Formular-Fallback oder Token-basierten Weg bieten.
- **Folgefrage:** wird nur angezeigt, wenn `v => v('B04') === 'sso_ad'`

## C – IIS (41)

_Detaillierte Bestandsaufnahme des Webservers: Rollen, Sites, Pools, Module, Limits, Delegation._ Gate: **SERVER**

### C01 IIS-Version

- **Antworttyp:** version
- **Warum wichtig?** IIS 10 (2016+) bringt HTTP/2, WebSocket, Application Initialization ohne Zusatzmodule.
- **GUI-/Menüpfad:** IIS-Manager → Hilfe → Info
- **Lesender Befehl (powershell):**

```powershell
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\InetStp' | Select-Object MajorVersion, MinorVersion, VersionString, SetupString
```

- **Erwartbare Ergebnisse:** 10.0 = 2016/2019/2022. 8.5 = 2012 R2 (EOL).
- **Architekturauswirkung:** < 8.0 kein WebSocket; < 10 kein HTTP/2.

### C02 Installierte IIS-Rollendienste

- **Antworttyp:** multi – `static` Statischer Inhalt · `default_doc` Standarddokument · `http_errors` HTTP-Fehler · `http_logging` HTTP-Protokollierung · `tracing` Ablaufverfolgung (FRT) · `static_compression` Statische Komprimierung · `dynamic_compression` Dynamische Komprimierung · `request_filtering` Anforderungsfilterung · `basic_auth` Standardauthentifizierung · `windows_auth` Windows-Authentifizierung · `client_cert` Clientzertifikat-Auth · `ip_restrictions` IP- und Domäneneinschränkungen · `url_auth` URL-Autorisierung · `aspnet45` ASP.NET 4.x · `net_ext45` .NET-Erweiterbarkeit 4.x · `isapi_ext` ISAPI-Erweiterungen · `isapi_filter` ISAPI-Filter · `cgi` CGI (FastCGI) · `websocket` WebSocket-Protokoll · `appinit` Anwendungsinitialisierung · `webdav` WebDAV-Veröffentlichung · `mgmt_console` IIS-Verwaltungskonsole · `mgmt_service` Verwaltungsdienst (Remote) · `unbekannt` Unbekannt
- **Warum wichtig?** Die Rollendienste sind die harte Grenze, was ohne Antrag nutzbar ist.
- **GUI-/Menüpfad:** Server-Manager → Rollen und Features → Webserver (IIS)
- **Lesender Befehl (powershell):**

```powershell
Get-WindowsFeature Web-* | Where-Object Installed | Select-Object Name, DisplayName
```

- **Erwartbare Ergebnisse:** Liste installierter Web-* Features. Fehlende Features sind mit Add-WindowsFeature installierbar (Admin-Aufgabe, nicht hier ausführen).
- **Architekturauswirkung:** Jeder fehlende Dienst = Antrag: WebSocket (Realtime), CGI (PHP/Python), AppInit (Warmstart), Windows-Auth (SSO).

### C03 Vorhandene Sites, Zustand, physische Pfade

- **Antworttyp:** text
- **Warum wichtig?** Zeigt Nutzungsmuster und ob Platz für eine eigene Site besteht.
- **GUI-/Menüpfad:** IIS-Manager → Sites
- **Lesender Befehl (powershell):**

```powershell
Import-Module IISAdministration; Get-IISSite | Select-Object Name, Id, State, @{n='Path';e={$_.Applications['/'].VirtualDirectories['/'].PhysicalPath}}
```

- **Erwartbare Ergebnisse:** „Default Web Site“ plus Fachanwendungen; Pfade unter C:\inetpub oder D:\Apps.
- **Architekturauswirkung:** Bestimmt Ablageort-Konvention und ob Sites/Apps von Dritten betroffen sein können.

### C04 Bindings: Hostnamen, Ports, HTTPS, SNI

- **Antworttyp:** text
- **Warum wichtig?** Hostheader-Bindings erlauben mehrere Anwendungen auf 443; SNI erlaubt mehrere Zertifikate.
- **GUI-/Menüpfad:** IIS-Manager → Site → Bindungen…
- **Lesender Befehl (powershell):**

```powershell
Get-WebBinding | Select-Object protocol, bindingInformation, sslFlags, certificateHash
```

- **Erwartbare Ergebnisse:** *:443:app.intern mit sslFlags 1 (SNI). Nur *:80:* = kein HTTPS.
- **Architekturauswirkung:** Eigenes HTTPS-Binding mit Hostnamen ist Voraussetzung für Secure Cookies, Service Worker, Clipboard-API.

### C05 Wie kann die neue Anwendung eingehängt werden?

- **Antworttyp:** single – `eigene_site_hostname` Eigene Site mit eigenem Hostnamen (HTTPS) · `eigene_site_port` Eigene Site auf eigenem Port · `app_unter_site` Als Anwendung unter bestehender Site (/app) · `unbekannt` Unbekannt
- **Warum wichtig?** Unteranwendungen erben Konfiguration, teilen Cookies/Session-Domain und schränken PWA/Routing ein.
- **GUI-/Menüpfad:** IIS-Manager → Sites → Rechtsklick → Website hinzufügen / Anwendung hinzufügen
- **Lesender Befehl (powershell):**

```powershell
Get-WebApplication | Select-Object path, applicationPool, PhysicalPath
```

- **Erwartbare Ergebnisse:** Konvention der Organisation erkennen.
- **Architekturauswirkung:** /app-Betrieb → PathBase/relative Links, keine Root-Cookies, eingeschränkte Isolation; eigener Hostname bevorzugt.

### C06 HTTPS vorhanden – Zertifikatsquelle

- **Antworttyp:** single – `interne_ca` Interne Unternehmens-CA · `oeffentliche_ca` Öffentliche CA · `selbstsigniert` Selbstsigniert · `kein_https` Kein HTTPS · `unbekannt` Unbekannt
- **Warum wichtig?** Sichere Kontexte (HTTPS) sind Voraussetzung für viele Browser-APIs; interne CAs müssen auf allen Clients (inkl. MDM) vertraut sein.
- **GUI-/Menüpfad:** IIS-Manager → Server → Serverzertifikate
- **Lesender Befehl (powershell):**

```powershell
Get-ChildItem Cert:\LocalMachine\My | Select-Object Subject, Issuer, NotAfter, HasPrivateKey, Thumbprint; netsh http show sslcert
```

- **Erwartbare Ergebnisse:** Issuer = interne CA (z. B. CN=Firma-Root-CA). NotAfter in der Zukunft.
- **Architekturauswirkung:** Interne CA → Vertrauensstellung auf MobileIron-Geräten prüfen (Kapitel L). Kein HTTPS → kein Service Worker, kein Secure Cookie.

### C07 Zertifikatsprozess: Beantragung, Laufzeit, Verlängerung, Wildcard/SAN

- **Antworttyp:** text
- **Warum wichtig?** Abgelaufene Zertifikate sind die häufigste Ausfallursache interner Webanwendungen.
- **GUI-/Menüpfad:** PKI-Prozess der IT (Zertifikatsvorlagen, Autoenrollment)
- **Lesender Befehl (powershell):**

```powershell
Get-ChildItem Cert:\LocalMachine\My | Select-Object Subject, NotAfter, @{n='DaysLeft';e={($_.NotAfter - (Get-Date)).Days}}, @{n='SAN';e={($_.Extensions | Where-Object {$_.Oid.FriendlyName -eq 'Subject Alternative Name'}).Format($false)}}
```

- **Erwartbare Ergebnisse:** Autoenrollment oder Ticket; Laufzeit 1–2 Jahre.
- **Architekturauswirkung:** Ohne Prozess → Monitoring der Ablaufdaten in die Betriebsdoku aufnehmen.
- **Folgefrage:** wird nur angezeigt, wenn `v => v('C06') !== 'kein_https'`

### C08 Application Pools: Runtime, Pipeline, Identität, Start Mode

- **Antworttyp:** text
- **Warum wichtig?** Zeigt, welche Runtimes tatsächlich produktiv laufen und wie Isolation gehandhabt wird.
- **GUI-/Menüpfad:** IIS-Manager → Anwendungspools
- **Lesender Befehl (powershell):**

```powershell
Get-IISAppPool | Select-Object Name, State, ManagedRuntimeVersion, ManagedPipelineMode, StartMode, @{n='Identity';e={$_.ProcessModel.IdentityType}}, @{n='IdleMin';e={$_.ProcessModel.IdleTimeout.TotalMinutes}}
```

- **Erwartbare Ergebnisse:** ManagedRuntimeVersion leer = „No Managed Code“ (ASP.NET Core/PHP). v4.0 = .NET Framework.
- **Architekturauswirkung:** Vorhandene No-Managed-Code-Pools deuten auf ASP.NET Core/PHP-Praxis hin.

### C09 Kann ein eigener Application Pool für die neue Anwendung angelegt werden?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Eigener Pool = Prozessisolation, eigene Identität, eigenes Recycling, unabhängige Neustarts.
- **GUI-/Menüpfad:** IIS-Manager → Anwendungspools → Anwendungspool hinzufügen (Rechte prüfen)
- **Lesender Befehl (powershell):**

```powershell
(Get-IISAppPool).Count; whoami /groups | findstr /i 'IIS_IUSRS Administrators'
```

- **Erwartbare Ergebnisse:** Organisatorische Zusage der IT dokumentieren.
- **Architekturauswirkung:** Nein → geteilter Pool mit fremden Anwendungen: Recycling/Absturz-Kopplung, Runtime-Zwang.

### C10 Verfügbare Pipeline-Modi / CLR-Versionen

- **Antworttyp:** multi – `integrated` Integrated Pipeline · `classic` Classic Pipeline · `clr4` .NET CLR v4.0 · `clr2` .NET CLR v2.0 · `no_managed` No Managed Code · `unbekannt` Unbekannt
- **Warum wichtig?** ASP.NET Core braucht „No Managed Code“ + Integrated; .NET Framework braucht CLR v4.0.
- **GUI-/Menüpfad:** IIS-Manager → Anwendungspools → Grundeinstellungen → .NET CLR-Version
- **Lesender Befehl (powershell):**

```powershell
Get-IISAppPool | Select-Object ManagedRuntimeVersion, ManagedPipelineMode | Sort-Object -Unique ManagedRuntimeVersion, ManagedPipelineMode
```

- **Erwartbare Ergebnisse:** Fehlt v4.0 → ASP.NET 4.x-Rolle nicht installiert.
- **Architekturauswirkung:** Bestimmt, ob .NET Framework und/oder ASP.NET Core gehostet werden können.

### C11 Zulässige App-Pool-Identität für die neue Anwendung

- **Antworttyp:** single – `apppool_identity` ApplicationPoolIdentity (Standard) · `gmsa` gMSA · `domain_service_account` Domänen-Dienstkonto · `network_service` NetworkService · `unbekannt` Unbekannt
- **Warum wichtig?** Identität bestimmt Zugriff auf DB (integrierte Auth), Netzfreigaben, Zertifikate, Event Log.
- **GUI-/Menüpfad:** IIS-Manager → Anwendungspools → Erweiterte Einstellungen → Identität
- **Lesender Befehl (powershell):**

```powershell
Get-IISAppPool | Select-Object Name, @{n='Identity';e={$_.ProcessModel.IdentityType}}, @{n='User';e={$_.ProcessModel.UserName}} | Sort-Object Identity
```

- **Erwartbare Ergebnisse:** Praxis in der Organisation ableiten.
- **Architekturauswirkung:** Siehe B10/B11: Identität ohne Netzrechte → Importe/Exports nur per Upload oder separatem Dienst.

### C12 Dürfen Recycling, Idle-Timeout und Start Mode für den eigenen Pool angepasst werden?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** In-Process-Hintergrundjobs (Hangfire, IHostedService) brauchen Idle-Timeout 0, StartMode AlwaysRunning, Preload – sonst schlafen Jobs ein.
- **GUI-/Menüpfad:** IIS-Manager → Anwendungspools → Erweiterte Einstellungen → Leerlaufzeitlimit / Startmodus / Wiederverwendung
- **Lesender Befehl (powershell):**

```powershell
Get-IISAppPool | Select-Object Name, StartMode, @{n='IdleMin';e={$_.ProcessModel.IdleTimeout.TotalMinutes}}, @{n='RecycleTime';e={$_.Recycling.PeriodicRestart.Time}}, @{n='RecycleSchedule';e={($_.Recycling.PeriodicRestart.Schedule | ForEach-Object Time) -join ','}}
```

- **Erwartbare Ergebnisse:** Standard: Idle 20 min, Recycle 1740 min. AlwaysRunning + Idle 0 nur bei bewusster Konfiguration.
- **Architekturauswirkung:** Nein → Hintergrundjobs zwingend außerhalb IIS (Task Scheduler/Windows Service).

### C13 Application Initialization (Preload/Warm-up) installiert?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Verhindert lange erste Antwortzeit nach Recycling/Neustart und hält Jobs am Leben.
- **GUI-/Menüpfad:** Server-Manager → Rollen → Webserver → Anwendungsentwicklung → Anwendungsinitialisierung
- **Lesender Befehl (powershell):**

```powershell
Get-WindowsFeature Web-AppInit | Select-Object Name, InstallState
```

- **Erwartbare Ergebnisse:** Installed / Available.
- **Architekturauswirkung:** Fehlt → Warmstart per Scheduled-Task-Ping oder Jobs extern.

### C14 Vorhandene Anwendungen und virtuelle Verzeichnisse

- **Antworttyp:** text
- **Warum wichtig?** Zeigt Pfadkonventionen und Kollisionsgefahr (/api, /app).
- **GUI-/Menüpfad:** IIS-Manager → Site → Inhaltsansicht
- **Lesender Befehl (powershell):**

```powershell
Get-WebApplication | Select-Object @{n='Site';e={$_.GetParentElement().Attributes['name'].Value}}, path, applicationPool, PhysicalPath; Get-WebVirtualDirectory | Select-Object path, PhysicalPath
```

- **Erwartbare Ergebnisse:** Liste der Pfade; leer = nur Root.
- **Architekturauswirkung:** Pfadnamen der Module dürfen nicht kollidieren; Reverse-Proxy-Regeln auf Pfadebene planbar.

### C15 Handler Mappings (welche Runtimes sind verdrahtet?)

- **Antworttyp:** text
- **Warum wichtig?** Handler wie aspNetCore, PHP-FastCGI, ExtensionlessUrlHandler belegen, was wirklich läuft.
- **GUI-/Menüpfad:** IIS-Manager → Server/Site → Handlerzuordnungen
- **Lesender Befehl (powershell):**

```powershell
& $env:windir\system32\inetsrv\appcmd.exe list config -section:system.webServer/handlers | Select-String 'name=|modules='
```

- **Erwartbare Ergebnisse:** „aspNetCore“ = Hosting Bundle aktiv; „PHP_via_FastCGI“ = PHP; „StaticFile“ immer vorhanden.
- **Architekturauswirkung:** Fehlende Handler → Runtime ist entweder nicht installiert oder nicht registriert.

### C16 MIME-Typen für moderne Assets vorhanden?

- **Antworttyp:** multi – `json` .json · `woff2` .woff2 · `webmanifest` .webmanifest · `svg` .svg · `wasm` .wasm · `mjs` .mjs · `unbekannt` Unbekannt
- **Warum wichtig?** Fehlende MIME-Typen liefern 404 für Fonts, Manifest (PWA) oder WebAssembly (Blazor WASM).
- **GUI-/Menüpfad:** IIS-Manager → Server → MIME-Typen
- **Lesender Befehl (powershell):**

```powershell
& $env:windir\system32\inetsrv\appcmd.exe list config -section:staticContent | Select-String 'json|woff2|webmanifest|svg|wasm|mjs'
```

- **Erwartbare Ergebnisse:** IIS 10 hat json/woff2/svg meist; webmanifest/wasm/mjs oft nicht.
- **Architekturauswirkung:** Fehlende Typen per web.config ergänzbar, wenn staticContent delegiert ist (C37) – sonst IT-Aufgabe.

### C17 Standarddokumente

- **Antworttyp:** text
- **Warum wichtig?** Relevant für statische Landingpages und Ordner-Routing.
- **GUI-/Menüpfad:** IIS-Manager → Site → Standarddokument
- **Lesender Befehl (powershell):**

```powershell
& $env:windir\system32\inetsrv\appcmd.exe list config -section:defaultDocument
```

- **Erwartbare Ergebnisse:** Default.htm, index.html, default.aspx …
- **Architekturauswirkung:** Gering; nur für statische Bereiche.

### C18 Request Filtering: Limits, Erweiterungen, Hidden Segments

- **Antworttyp:** text
- **Warum wichtig?** Blockiert unbemerkt Uploads > 30 MB, lange URLs, bestimmte Dateiendungen (z. B. .json, .webmanifest) oder Verben.
- **GUI-/Menüpfad:** IIS-Manager → Site → Anforderungsfilterung → Featureeinstellungen bearbeiten
- **Lesender Befehl (powershell):**

```powershell
& $env:windir\system32\inetsrv\appcmd.exe list config -section:requestFiltering
```

- **Erwartbare Ergebnisse:** maxAllowedContentLength 30000000 (Standard), maxUrl 4096, maxQueryString 2048, fileExtensions allowUnlisted=true.
- **Architekturauswirkung:** Muss zu Upload-Anforderungen passen; Änderung per web.config nur bei Delegation.

### C19 Erlaubte HTTP-Verben

- **Antworttyp:** multi – `get_post` GET/POST · `put` PUT · `delete` DELETE · `patch` PATCH · `options` OPTIONS · `unbekannt` Unbekannt
- **Warum wichtig?** REST-APIs brauchen PUT/DELETE/PATCH; WebDAV-Modul und Verb-Filter blockieren sie häufig mit 405.
- **GUI-/Menüpfad:** IIS-Manager → Anforderungsfilterung → HTTP-Verben
- **Lesender Befehl (powershell):**

```powershell
& $env:windir\system32\inetsrv\appcmd.exe list config -section:requestFiltering /text:verbs; & $env:windir\system32\inetsrv\appcmd.exe list module WebDAVModule
```

- **Erwartbare Ergebnisse:** Leere Verb-Liste mit allowUnlisted=true = alles erlaubt. WebDAVModule geladen = PUT/DELETE-Problem.
- **Architekturauswirkung:** Nur GET/POST → API-Design mit POST-Tunneling oder WebDAV-Modul für die App entfernen (web.config, Delegation nötig).

### C20 Komprimierung

- **Antworttyp:** multi – `static` Statisch aktiv · `dynamic` Dynamisch aktiv · `keine` Keine · `unbekannt` Unbekannt
- **Warum wichtig?** Dynamische Komprimierung puffert Antworten und bricht Server-Sent Events/Streaming; statische spart Bandbreite über Tunnel.
- **GUI-/Menüpfad:** IIS-Manager → Server → Komprimierung
- **Lesender Befehl (powershell):**

```powershell
& $env:windir\system32\inetsrv\appcmd.exe list config -section:urlCompression; & $env:windir\system32\inetsrv\appcmd.exe list config -section:httpCompression | Select-String 'mimeType|dynamicTypes|staticTypes'
```

- **Erwartbare Ergebnisse:** doStaticCompression true typisch; doDynamicCompression nur bei installierter Rolle.
- **Architekturauswirkung:** SSE erfordert Deaktivierung dynamischer Komprimierung für den Stream-Endpunkt.

### C21 Output-/Kernel-Caching aktiv?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Caching kann dynamische, benutzerabhängige Inhalte fälschlich ausliefern.
- **GUI-/Menüpfad:** IIS-Manager → Site → Ausgabezwischenspeicherung
- **Lesender Befehl (powershell):**

```powershell
& $env:windir\system32\inetsrv\appcmd.exe list config -section:caching
```

- **Erwartbare Ergebnisse:** enabled true, enableKernelCache true (Standard). Keine Regeln = kein Effekt auf dynamische Inhalte.
- **Architekturauswirkung:** Cache-Control-Header konsequent setzen; keine benutzerabhängigen Antworten cachen.

### C22 Aktive Authentifizierungsmodule an bestehenden Sites

- **Antworttyp:** multi – `anonymous` Anonym · `windows` Windows · `basic` Standard (Basic) · `forms` Formular · `client_cert` Clientzertifikat · `unbekannt` Unbekannt
- **Warum wichtig?** Zeigt, welche Modelle die Organisation produktiv einsetzt und was die Clients (MDM) bereits bewältigen.
- **GUI-/Menüpfad:** IIS-Manager → Site → Authentifizierung
- **Lesender Befehl (powershell):**

```powershell
Get-WebConfiguration -Filter 'system.webServer/security/authentication/*' -PSPath 'IIS:\' -Recurse | Select-Object PSPath, SectionPath, enabled | Where-Object enabled
```

- **Erwartbare Ergebnisse:** Anonym + Windows an internen Apps üblich.
- **Architekturauswirkung:** Praxis der Organisation als Ausgangspunkt für B04.

### C23 URL-Autorisierung (Authorization Rules) verfügbar?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Ermöglicht Gruppenschutz ganzer Pfade ohne Anwendungscode.
- **GUI-/Menüpfad:** IIS-Manager → Site → Autorisierungsregeln
- **Lesender Befehl (powershell):**

```powershell
Get-WindowsFeature Web-Url-Auth | Select-Object InstallState; & $env:windir\system32\inetsrv\appcmd.exe list config -section:system.webServer/security/authorization
```

- **Erwartbare Ergebnisse:** Installed + Regeln „Allow All Users“ (Standard).
- **Architekturauswirkung:** Sinnvoll für Admin-Bereiche/Dashboards; ersetzt keine fachliche Autorisierung.

### C24 IP-/Domäneneinschränkungen im Einsatz?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Kann Zugriffe aus VPN-/Tunnel-Segmenten unbeabsichtigt blockieren.
- **GUI-/Menüpfad:** IIS-Manager → Site → IP-Adressen- und Domäneneinschränkungen
- **Lesender Befehl (powershell):**

```powershell
& $env:windir\system32\inetsrv\appcmd.exe list config -section:ipSecurity
```

- **Erwartbare Ergebnisse:** Leer = keine Einschränkung.
- **Architekturauswirkung:** Regeln müssen Tunnel-/VPN-Quelladressen berücksichtigen (Kapitel L).

### C25 IIS-Logging: Format, Pfad, Felder, Rotation

- **Antworttyp:** text
- **Warum wichtig?** Zugriffsprotokolle für Fehleranalyse und Audit; W3C mit X-Forwarded-For nötig hinter Proxys.
- **GUI-/Menüpfad:** IIS-Manager → Server/Site → Protokollierung
- **Lesender Befehl (powershell):**

```powershell
Get-WebConfigurationProperty -Filter system.applicationHost/sites/siteDefaults/logFile -Name directory, logFormat, period, enabled, logExtFileFlags | Format-List
```

- **Erwartbare Ergebnisse:** W3C, täglich, %SystemDrive%\inetpub\logs\LogFiles.
- **Architekturauswirkung:** Aufbewahrung/Löschung klären (I05); Client-IP hinter Tunnel ggf. Gateway-IP.

### C26 Failed Request Tracing verfügbar?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Wichtigstes Werkzeug zur Diagnose von 500/401/Handler-Problemen ohne Codeänderung.
- **GUI-/Menüpfad:** IIS-Manager → Site → Ablaufverfolgungsregeln für Anforderungsfehler
- **Lesender Befehl (powershell):**

```powershell
Get-WindowsFeature Web-Http-Tracing | Select-Object InstallState
```

- **Erwartbare Ergebnisse:** Installed / Available.
- **Architekturauswirkung:** Fehlt → Diagnose nur über App-Logs; Antrag empfehlenswert.

### C27 WebSocket-Protokoll installiert?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Voraussetzung für SignalR über WebSockets, Blazor Server und Live-Dashboards ohne Polling.
- **GUI-/Menüpfad:** Server-Manager → Rollen → Webserver → Anwendungsentwicklung → WebSocket-Protokoll
- **Lesender Befehl (powershell):**

```powershell
Get-WindowsFeature Web-WebSockets | Select-Object InstallState; & $env:windir\system32\inetsrv\appcmd.exe list config -section:system.webServer/webSocket
```

- **Erwartbare Ergebnisse:** Installed + enabled=true.
- **Architekturauswirkung:** Serverseitig ja ≠ Ende-zu-Ende ja: Tunnel/MDM müssen WebSockets ebenfalls durchlassen (Client-Test).

### C28 URL Rewrite Modul installiert?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Für HTTPS-Redirects, saubere URLs, SPA-Fallback und Header-Manipulation.
- **GUI-/Menüpfad:** IIS-Manager → Site → URL Rewrite (Symbol vorhanden?)
- **Lesender Befehl (powershell):**

```powershell
Get-WebGlobalModule | Where-Object Name -like '*Rewrite*' | Select-Object Name, Image
```

- **Erwartbare Ergebnisse:** RewriteModule mit Pfad rewrite.dll.
- **Architekturauswirkung:** Fehlt → Redirects/Routing in der Anwendung lösen; Antrag (kostenloses Microsoft-Modul, Installer nötig).

### C29 Application Request Routing (ARR) / Reverse Proxy

- **Antworttyp:** single – `installiert_proxy_an` Installiert, Proxy aktiviert · `installiert_proxy_aus` Installiert, Proxy deaktiviert · `nicht_installiert` Nicht installiert · `unbekannt` Unbekannt
- **Warum wichtig?** ARR erlaubt, Kestrel/Node/andere Dienste hinter IIS auf 443 zu betreiben.
- **GUI-/Menüpfad:** IIS-Manager → Server → Application Request Routing Cache → Server Proxy Settings
- **Lesender Befehl (powershell):**

```powershell
Get-WebGlobalModule | Where-Object Name -like '*ApplicationRequestRouting*'; & $env:windir\system32\inetsrv\appcmd.exe list config -section:system.webServer/proxy
```

- **Erwartbare Ergebnisse:** Modul vorhanden + proxy enabled=true.
- **Architekturauswirkung:** Aktiv → Reverse-Proxy-Architekturen (Out-of-Process, Node, Python) möglich; sonst nur In-Process-Hosting.

### C30 Ist ein Reverse Proxy auf lokale Dienste (Kestrel/Node/Python) organisatorisch erlaubt?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Technische Verfügbarkeit von ARR heißt nicht, dass zusätzliche lokale Listener zugelassen sind.
- **GUI-/Menüpfad:** Abstimmung IT-Betrieb/Security
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Ja / Nein / nur für bestimmte Dienste.
- **Architekturauswirkung:** Nein → Stack auf IIS-native Hosting-Modelle beschränken (ASP.NET Core In-Process, .NET Framework, PHP-FastCGI).
- **Folgefrage:** wird nur angezeigt, wenn `v => v('C29') !== 'nicht_installiert'`

### C31 FastCGI-Konfiguration

- **Antworttyp:** text
- **Warum wichtig?** PHP und Python (wfastcgi) laufen unter IIS über FastCGI; die Einträge zeigen Versionen und Limits.
- **GUI-/Menüpfad:** IIS-Manager → Server → FastCGI-Einstellungen
- **Lesender Befehl (powershell):**

```powershell
& $env:windir\system32\inetsrv\appcmd.exe list config -section:system.webServer/fastCgi
```

- **Erwartbare Ergebnisse:** fullPath zu php-cgi.exe/python.exe, instanceMaxRequests, activityTimeout.
- **Architekturauswirkung:** Leer → Runtime zwar installiert, aber nicht an IIS angebunden (Admin-Aufgabe).
- **Folgefrage:** wird nur angezeigt, wenn `v => present(v, 'D_php') || present(v, 'D_python')`

### C32 ISAPI- und CGI-Einschränkungen

- **Antworttyp:** text
- **Warum wichtig?** Nicht freigegebene Erweiterungen (php-cgi, ASP.NET) liefern 404.2.
- **GUI-/Menüpfad:** IIS-Manager → Server → ISAPI- und CGI-Einschränkungen
- **Lesender Befehl (powershell):**

```powershell
& $env:windir\system32\inetsrv\appcmd.exe list config -section:isapiCgiRestriction
```

- **Erwartbare Ergebnisse:** allowed="true" für benötigte Pfade; notListedCgisAllowed false (Standard).
- **Architekturauswirkung:** Serverweite Freigabe = Admin-Aufgabe; Delegation nicht möglich.

### C33 WebDAV

- **Antworttyp:** single – `installiert_aktiv` Installiert und aktiv · `installiert_inaktiv` Installiert, nicht aktiv · `nicht` Nicht installiert · `unbekannt` Unbekannt
- **Warum wichtig?** Das WebDAV-Modul beantwortet PUT/DELETE mit 405 und bricht REST-APIs.
- **GUI-/Menüpfad:** IIS-Manager → Module → WebDAVModule
- **Lesender Befehl (powershell):**

```powershell
Get-WindowsFeature Web-DAV-Publishing | Select-Object InstallState; & $env:windir\system32\inetsrv\appcmd.exe list module WebDAVModule
```

- **Erwartbare Ergebnisse:** Nicht installiert ideal.
- **Architekturauswirkung:** Installiert → in web.config der App Modul/Handler entfernen (nur bei Delegation) oder Verben auf POST beschränken.

### C34 Rolle „Statischer Inhalt“ installiert?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Ohne diese Rolle liefert IIS keine CSS/JS/Bilder aus.
- **GUI-/Menüpfad:** Server-Manager → Rollen → Webserver → Allgemeine HTTP-Features → Statischer Inhalt
- **Lesender Befehl (powershell):**

```powershell
Get-WindowsFeature Web-Static-Content | Select-Object InstallState
```

- **Erwartbare Ergebnisse:** Installed (fast immer).
- **Architekturauswirkung:** Fehlt → Blocker für jede Webanwendung.

### C35 Upload-/Request-Limits (maxAllowedContentLength, maxRequestLength, uploadReadAheadSize)

- **Antworttyp:** text
- **Warum wichtig?** Bestimmt maximale Upload-Größe (Fotos, Excel-Importe) und Verhalten bei Client-Zertifikaten.
- **GUI-/Menüpfad:** IIS-Manager → Anforderungsfilterung → Featureeinstellungen; Konfigurations-Editor → system.webServer/serverRuntime
- **Lesender Befehl (powershell):**

```powershell
& $env:windir\system32\inetsrv\appcmd.exe list config -section:requestFiltering /text:requestLimits.maxAllowedContentLength; & $env:windir\system32\inetsrv\appcmd.exe list config -section:serverRuntime /text:uploadReadAheadSize
```

- **Erwartbare Ergebnisse:** 30000000 Byte (≈28,6 MB) und 49152 (Standard).
- **Architekturauswirkung:** Größere Uploads → Chunked Upload im Client oder Limit-Erhöhung (Delegation/Admin).

### C36 Timeouts: connectionTimeout, executionTimeout, activityTimeout

- **Antworttyp:** text
- **Warum wichtig?** Lange Berichte, Importe, SSE-Streams und Downloads über Tunnel brechen bei knappen Timeouts ab.
- **GUI-/Menüpfad:** IIS-Manager → Site → Erweiterte Einstellungen → Grenzwerte → Verbindungstimeout
- **Lesender Befehl (powershell):**

```powershell
Get-WebConfigurationProperty -Filter system.applicationHost/sites/siteDefaults/limits -Name connectionTimeout; & $env:windir\system32\inetsrv\appcmd.exe list config -section:system.applicationHost/webLimits
```

- **Erwartbare Ergebnisse:** connectionTimeout 00:02:00 (Standard).
- **Architekturauswirkung:** Lange Operationen asynchron (Job + Statusabfrage) statt langer Requests planen.

### C37 Feature-Delegation: Welche Sektionen darf die web.config überschreiben?

- **Antworttyp:** text
- **Warum wichtig?** Entscheidet, ob das App-Team Handler, Module, Auth, Header, MIME und Limits selbst deployen kann – oder jede Änderung ein IT-Ticket ist.
- **GUI-/Menüpfad:** IIS-Manager → Server → Featuredelegierung
- **Lesender Befehl (powershell):**

```powershell
foreach ($s in 'system.webServer/handlers','system.webServer/modules','system.webServer/security/authentication/windowsAuthentication','system.webServer/security/authentication/anonymousAuthentication','system.webServer/security/requestFiltering','system.webServer/httpProtocol','system.webServer/staticContent','system.webServer/webSocket','system.webServer/urlCompression','system.webServer/rewrite/rules') { [pscustomobject]@{Section=$s; OverrideMode=(Get-WebConfiguration -Filter $s -PSPath 'IIS:\' -Metadata).OverrideMode} }
```

- **Erwartbare Ergebnisse:** Allow = per web.config änderbar; Deny = gesperrt (Standard für Auth-Sektionen).
- **Architekturauswirkung:** Viele Deny → jede Konfiguration zentral beantragen; Deployment-Paket muss ohne web.config-Sonderlocken auskommen.

### C38 Schreibrechte auf Site-Ordner und web.config für das Deployment

- **Antworttyp:** single – `deployer` Deploy-Konto/Team hat Schreibrechte · `nur_admin` Nur Administratoren · `unbekannt` Unbekannt
- **Warum wichtig?** Bestimmt, ob Deployments ohne IT durchführbar sind.
- **GUI-/Menüpfad:** Explorer → Ordner → Eigenschaften → Sicherheit
- **Lesender Befehl (cmd):**

```
icacls C:\inetpub\wwwroot
```

- **Erwartbare Ergebnisse:** Gruppen mit (M)/(F) neben Administratoren.
- **Architekturauswirkung:** Nur Admin → Deployment-Übergabe (ZIP + Anleitung) an IT; Release-Frequenz sinkt.

### C39 Dürfen eigene HTTP-Header (CSP, HSTS, X-Frame-Options) gesetzt werden?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Security-Header sind Teil der Freigabe; CSP beeinflusst Inline-Skripte und externe Ressourcen.
- **GUI-/Menüpfad:** IIS-Manager → Site → HTTP-Antwortheader
- **Lesender Befehl (powershell):**

```powershell
& $env:windir\system32\inetsrv\appcmd.exe list config -section:httpProtocol
```

- **Erwartbare Ergebnisse:** customHeaders-Liste; Delegation von httpProtocol (C37) entscheidend.
- **Architekturauswirkung:** Header in der Anwendung (Middleware) setzen, dann unabhängig von IIS-Delegation.

### C40 Zugriff des App-Teams auf den IIS-Manager

- **Antworttyp:** single – `voll` Lokaler/voller Zugriff · `delegiert` Delegierter Remote-Zugriff auf eigene Site · `keiner` Kein Zugriff · `unbekannt` Unbekannt
- **Warum wichtig?** Delegierte Verwaltung beschleunigt Betrieb ohne Adminrechte.
- **GUI-/Menüpfad:** IIS-Manager → Server → Verwaltungsdienst / IIS-Manager-Berechtigungen
- **Lesender Befehl (powershell):**

```powershell
Get-WindowsFeature Web-Mgmt-Service | Select-Object InstallState; Get-Service WMSVC -ErrorAction SilentlyContinue | Select-Object Status, StartType
```

- **Erwartbare Ergebnisse:** WMSVC Running = Remote-Verwaltung möglich.
- **Architekturauswirkung:** Keiner → Betriebsdiagnose ausschließlich über App-Logs und IT.

### C41 HTTP/2 und TLS-Protokolle am Server

- **Antworttyp:** text
- **Warum wichtig?** HTTP/2 verbessert viele kleine Requests über Tunnel; TLS 1.2+ ist Pflicht.
- **GUI-/Menüpfad:** Browser-Devtools → Netzwerk → Protokoll-Spalte (h2)
- **Lesender Befehl (powershell):**

```powershell
Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Services\HTTP\Parameters' -ErrorAction SilentlyContinue | Select-Object EnableHttp2Tls, EnableHttp2Cleartext; Get-ChildItem 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols' -Recurse -ErrorAction SilentlyContinue | Get-ItemProperty | Select-Object PSPath, Enabled, DisabledByDefault
```

- **Erwartbare Ergebnisse:** Keine Registry-Werte = Betriebssystem-Standard (2016+: TLS 1.2 an, HTTP/2 an).
- **Architekturauswirkung:** TLS 1.0/1.1 aktiv → Security-Finding; HTTP/2 aus → Asset-Bundling wichtiger.

## D – Laufzeiten (29)

_Immer unterscheiden: technisch vorhanden / installierbar / administrativ erlaubt / produktiv freigegeben / unbekannt._ Gate: **SERVER**

### D_netfx_tech .NET Framework: technischer Status

- **Antworttyp:** single – `installiert` Technisch vorhanden (installiert) · `installierbar` Nicht installiert, aber technisch installierbar · `nicht_installierbar` Nicht installierbar (Technik/Plattform) · `unbekannt` Unbekannt
- **Warum wichtig?** Basis für klassisches ASP.NET (MVC 5, Web Forms) und viele Bestandsanwendungen.
- **GUI-/Menüpfad:** Systemsteuerung → Programme → Windows-Features
- **Lesender Befehl (powershell):**

```powershell
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' | Select-Object Version, Release
```

- **Erwartbare Ergebnisse:** Release ≥ 528040 = 4.8; ≥ 533320 = 4.8.1.
- **Architekturauswirkung:** Vorhanden auf jedem Server 2016+; konservativer Stack (ASP.NET MVC 5) möglich.

### D_netfx_org .NET Framework: organisatorischer Status

- **Antworttyp:** single – `prod_freigegeben` Produktiv freigegeben · `erlaubt` Administrativ erlaubt, Produktivfreigabe offen · `verboten` Organisatorisch nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Technisch vorhanden heißt nicht produktiv zugelassen. Freigabe entscheidet über die Architektur.
- **GUI-/Menüpfad:** Software-Whitelist / Betriebshandbuch / Anfrage an IT-Betrieb
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Produktiv freigegeben / erlaubt / verboten.
- **Architekturauswirkung:** Nur bei Freigabe als tragende Komponente einplanen.
- **Folgefrage:** wird nur angezeigt, wenn `v => v(base + '_tech') !== 'nicht_installierbar'`

### D_netfx_ver .NET Framework: Version

- **Antworttyp:** version
- **Warum wichtig?** 4.8 ist die letzte Version; ältere Stände sind Sicherheitsrisiko.
- **GUI-/Menüpfad:** wie oben
- **Lesender Befehl (powershell):**

```powershell
(Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full').Release
```

- **Erwartbare Ergebnisse:** 528040+ → 4.8.
- **Architekturauswirkung:** < 4.7.2 → kein .NET Standard 2.0 → Bibliotheksauswahl eingeschränkt.
- **Folgefrage:** wird nur angezeigt, wenn `v => v(base + '_tech') === 'installiert'`

### D_dotnet_tech Moderne .NET Runtime (8/9/10): technischer Status

- **Antworttyp:** single – `installiert` Technisch vorhanden (installiert) · `installierbar` Nicht installiert, aber technisch installierbar · `nicht_installierbar` Nicht installierbar (Technik/Plattform) · `unbekannt` Unbekannt
- **Warum wichtig?** Grundlage für ASP.NET Core; LTS-Version entscheidet Supportzeitraum.
- **GUI-/Menüpfad:** Systemsteuerung → Programme → „Microsoft .NET Runtime“
- **Lesender Befehl (cmd):**

```
dotnet --list-runtimes
```

- **Erwartbare Ergebnisse:** Microsoft.AspNetCore.App 8.0.x / 10.0.x (LTS). Fehlt „dotnet“ → nicht installiert.
- **Architekturauswirkung:** Ohne Runtime: Self-Contained-Publish möglich, aber Sicherheitsupdates liegen dann beim App-Team.

### D_dotnet_org Moderne .NET Runtime (8/9/10): organisatorischer Status

- **Antworttyp:** single – `prod_freigegeben` Produktiv freigegeben · `erlaubt` Administrativ erlaubt, Produktivfreigabe offen · `verboten` Organisatorisch nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Technisch vorhanden heißt nicht produktiv zugelassen. Freigabe entscheidet über die Architektur.
- **GUI-/Menüpfad:** Software-Whitelist / Betriebshandbuch / Anfrage an IT-Betrieb
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Produktiv freigegeben / erlaubt / verboten.
- **Architekturauswirkung:** Nur bei Freigabe als tragende Komponente einplanen.
- **Folgefrage:** wird nur angezeigt, wenn `v => v(base + '_tech') !== 'nicht_installierbar'`

### D_dotnet_ver Moderne .NET Runtime (8/9/10): Version

- **Antworttyp:** version
- **Warum wichtig?** LTS (8, 10) bevorzugt.
- **GUI-/Menüpfad:** wie oben
- **Lesender Befehl (cmd):**

```
dotnet --list-runtimes
```

- **Erwartbare Ergebnisse:** z. B. Microsoft.AspNetCore.App 8.0.12
- **Architekturauswirkung:** Bestimmt Zielframework.
- **Folgefrage:** wird nur angezeigt, wenn `v => v(base + '_tech') === 'installiert'`

### D_hosting_tech ASP.NET Core Hosting Bundle (ANCM): technischer Status

- **Antworttyp:** single – `installiert` Technisch vorhanden (installiert) · `installierbar` Nicht installiert, aber technisch installierbar · `nicht_installierbar` Nicht installierbar (Technik/Plattform) · `unbekannt` Unbekannt
- **Warum wichtig?** Ohne Hosting Bundle kann IIS keine ASP.NET-Core-Anwendung In-Process starten.
- **GUI-/Menüpfad:** Systemsteuerung → Programme → „Microsoft ASP.NET Core … Hosting Bundle“; IIS-Manager → Module → AspNetCoreModuleV2
- **Lesender Befehl (powershell):**

```powershell
Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object DisplayName -like '*ASP.NET Core*Hosting*' | Select-Object DisplayName, DisplayVersion; Get-WebGlobalModule | Where-Object Name -like 'AspNetCoreModule*'
```

- **Erwartbare Ergebnisse:** AspNetCoreModuleV2 + Hosting Bundle Version.
- **Architekturauswirkung:** Vorhanden → bevorzugter Stack ASP.NET Core In-Process. Fehlt → wichtigster Antrag („Box erweitern“).

### D_hosting_org ASP.NET Core Hosting Bundle (ANCM): organisatorischer Status

- **Antworttyp:** single – `prod_freigegeben` Produktiv freigegeben · `erlaubt` Administrativ erlaubt, Produktivfreigabe offen · `verboten` Organisatorisch nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Technisch vorhanden heißt nicht produktiv zugelassen. Freigabe entscheidet über die Architektur.
- **GUI-/Menüpfad:** Software-Whitelist / Betriebshandbuch / Anfrage an IT-Betrieb
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Produktiv freigegeben / erlaubt / verboten.
- **Architekturauswirkung:** Nur bei Freigabe als tragende Komponente einplanen.
- **Folgefrage:** wird nur angezeigt, wenn `v => v(base + '_tech') !== 'nicht_installierbar'`

### D_hosting_ver ASP.NET Core Hosting Bundle (ANCM): Version

- **Antworttyp:** version
- **Warum wichtig?** Modul-Version muss zur Runtime passen.
- **GUI-/Menüpfad:** wie oben
- **Lesender Befehl (powershell):**

```powershell
Get-WebGlobalModule | Where-Object Name -like 'AspNetCoreModule*' | Select-Object Name, Image
```

- **Erwartbare Ergebnisse:** V2
- **Architekturauswirkung:** Nur V2 unterstützt In-Process-Hosting.
- **Folgefrage:** wird nur angezeigt, wenn `v => v(base + '_tech') === 'installiert'`

### D_hosting_inproc Laufen bereits ASP.NET-Core-Anwendungen (In-Process) produktiv auf diesem IIS?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Belegt, dass Betrieb, Updates und Deployment für Core bereits eingespielt sind.
- **GUI-/Menüpfad:** IIS-Manager → Anwendungspools (No Managed Code) + web.config der App (aspNetCore hostingModel)
- **Lesender Befehl (powershell):**

```powershell
Get-ChildItem C:\inetpub -Recurse -Filter web.config -ErrorAction SilentlyContinue | Select-String 'aspNetCore' | Select-Object Path, Line
```

- **Erwartbare Ergebnisse:** Treffer mit hostingModel="inprocess".
- **Architekturauswirkung:** Ja → geringes Betriebsrisiko für den bevorzugten Stack.
- **Folgefrage:** wird nur angezeigt, wenn `v => v('D_hosting_tech') === 'installiert'`

### D_sdk_tech .NET SDK (auf Server oder Buildrechner): technischer Status

- **Antworttyp:** single – `installiert` Technisch vorhanden (installiert) · `installierbar` Nicht installiert, aber technisch installierbar · `nicht_installierbar` Nicht installierbar (Technik/Plattform) · `unbekannt` Unbekannt
- **Warum wichtig?** Builds gehören auf Entwicklungs-/Build-Rechner; SDK auf dem Server ist nicht nötig.
- **GUI-/Menüpfad:** Eingabeaufforderung
- **Lesender Befehl (cmd):**

```
dotnet --list-sdks
```

- **Erwartbare Ergebnisse:** Auf PROD-Server idealerweise leer.
- **Architekturauswirkung:** SDK nur auf Buildrechnern → Deployment = publizierter Ordner.

### D_sdk_org .NET SDK (auf Server oder Buildrechner): organisatorischer Status

- **Antworttyp:** single – `prod_freigegeben` Produktiv freigegeben · `erlaubt` Administrativ erlaubt, Produktivfreigabe offen · `verboten` Organisatorisch nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Technisch vorhanden heißt nicht produktiv zugelassen. Freigabe entscheidet über die Architektur.
- **GUI-/Menüpfad:** Software-Whitelist / Betriebshandbuch / Anfrage an IT-Betrieb
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Produktiv freigegeben / erlaubt / verboten.
- **Architekturauswirkung:** Nur bei Freigabe als tragende Komponente einplanen.
- **Folgefrage:** wird nur angezeigt, wenn `v => v(base + '_tech') !== 'nicht_installierbar'`

### D_ps_tech PowerShell: technischer Status

- **Antworttyp:** single – `installiert` Technisch vorhanden (installiert) · `installierbar` Nicht installiert, aber technisch installierbar · `nicht_installierbar` Nicht installierbar (Technik/Plattform) · `unbekannt` Unbekannt
- **Warum wichtig?** Für Deployment-Skripte, Scheduled Tasks, Importe und Diagnose.
- **GUI-/Menüpfad:** PowerShell-Fenster
- **Lesender Befehl (powershell):**

```powershell
$PSVersionTable.PSVersion; Get-ExecutionPolicy -List; Get-Command pwsh -ErrorAction SilentlyContinue | Select-Object Version
```

- **Erwartbare Ergebnisse:** 5.1 immer; pwsh 7.x optional. ExecutionPolicy Restricted/AllSigned = Skripte nur signiert.
- **Architekturauswirkung:** Signaturpflicht → Skripte durch IT signieren lassen oder Jobs als kompilierte Programme.

### D_ps_org PowerShell: organisatorischer Status

- **Antworttyp:** single – `prod_freigegeben` Produktiv freigegeben · `erlaubt` Administrativ erlaubt, Produktivfreigabe offen · `verboten` Organisatorisch nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Technisch vorhanden heißt nicht produktiv zugelassen. Freigabe entscheidet über die Architektur.
- **GUI-/Menüpfad:** Software-Whitelist / Betriebshandbuch / Anfrage an IT-Betrieb
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Produktiv freigegeben / erlaubt / verboten.
- **Architekturauswirkung:** Nur bei Freigabe als tragende Komponente einplanen.
- **Folgefrage:** wird nur angezeigt, wenn `v => v(base + '_tech') !== 'nicht_installierbar'`

### D_ps_ver PowerShell: Version

- **Antworttyp:** version
- **Warum wichtig?** PS 7 für moderne Module; 5.1 als Baseline.
- **GUI-/Menüpfad:** wie oben
- **Lesender Befehl (powershell):**

```powershell
$PSVersionTable.PSVersion
```

- **Erwartbare Ergebnisse:** 5.1 / 7.x
- **Architekturauswirkung:** Skripte auf 5.1-Kompatibilität halten, solange pwsh fehlt.
- **Folgefrage:** wird nur angezeigt, wenn `v => v(base + '_tech') === 'installiert'`

### D_php_tech PHP: technischer Status

- **Antworttyp:** single – `installiert` Technisch vorhanden (installiert) · `installierbar` Nicht installiert, aber technisch installierbar · `nicht_installierbar` Nicht installierbar (Technik/Plattform) · `unbekannt` Unbekannt
- **Warum wichtig?** Alternative Runtime unter IIS (FastCGI). Nur relevant, wenn vorhanden oder zulässig.
- **GUI-/Menüpfad:** IIS-Manager → Handlerzuordnungen (PHP_via_FastCGI); Explorer C:\PHP
- **Lesender Befehl (powershell):**

```powershell
php -v; Get-ChildItem C:\PHP*, 'C:\Program Files\PHP*' -ErrorAction SilentlyContinue | Select-Object FullName
```

- **Erwartbare Ergebnisse:** Version oder „nicht gefunden“.
- **Architekturauswirkung:** Vorhanden + erlaubt → PHP-Stack als Alternative; sonst PHP-Fragen ausgeblendet.

### D_php_org PHP: organisatorischer Status

- **Antworttyp:** single – `prod_freigegeben` Produktiv freigegeben · `erlaubt` Administrativ erlaubt, Produktivfreigabe offen · `verboten` Organisatorisch nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Technisch vorhanden heißt nicht produktiv zugelassen. Freigabe entscheidet über die Architektur.
- **GUI-/Menüpfad:** Software-Whitelist / Betriebshandbuch / Anfrage an IT-Betrieb
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Produktiv freigegeben / erlaubt / verboten.
- **Architekturauswirkung:** Verboten → alle PHP-Folgefragen entfallen.
- **Folgefrage:** wird nur angezeigt, wenn `v => v(base + '_tech') !== 'nicht_installierbar'`

### D_php_ver PHP: Version

- **Antworttyp:** version
- **Warum wichtig?** PHP < 8.1 ohne Sicherheitsupdates.
- **GUI-/Menüpfad:** wie oben
- **Lesender Befehl (cmd):**

```
php -v
```

- **Erwartbare Ergebnisse:** 8.2+/8.3+.
- **Architekturauswirkung:** EOL-Version = Blocker.
- **Folgefrage:** wird nur angezeigt, wenn `v => v(base + '_tech') === 'installiert'`

### D_php_ext PHP: Extensions (mysqli/pdo_mysql, openssl, mbstring, intl, gd/imagick) und Einschränkungen (disable_functions, open_basedir)

- **Antworttyp:** text
- **Warum wichtig?** Ohne pdo_mysql keine DB, ohne openssl kein TLS zur DB.
- **GUI-/Menüpfad:** php.ini im PHP-Ordner
- **Lesender Befehl (cmd):**

```
php -m; php -i | findstr /i "disable_functions open_basedir upload_max_filesize post_max_size memory_limit"
```

- **Erwartbare Ergebnisse:** Modul-Liste; Limits typ. upload 2M/post 8M (zu klein für Fotos).
- **Architekturauswirkung:** Bestimmt Machbarkeit PHP-Stack und Upload-Limits.
- **Folgefrage:** wird nur angezeigt, wenn `v => v('D_php_tech') === 'installiert' && notForbidden(v, 'D_php')`

### D_python_tech Python: technischer Status

- **Antworttyp:** single – `installiert` Technisch vorhanden (installiert) · `installierbar` Nicht installiert, aber technisch installierbar · `nicht_installierbar` Nicht installierbar (Technik/Plattform) · `unbekannt` Unbekannt
- **Warum wichtig?** Für Importskripte/Jobs oder Web (wfastcgi/Waitress hinter ARR).
- **GUI-/Menüpfad:** Systemsteuerung → Programme
- **Lesender Befehl (cmd):**

```
python --version; py -0p
```

- **Erwartbare Ergebnisse:** Version oder Fehler. Beachte Store-Alias „python“ ohne Installation.
- **Architekturauswirkung:** Web-Betrieb unter IIS nur über FastCGI/ARR – meist nicht Erstwahl; für Jobs nutzbar.

### D_python_org Python: organisatorischer Status

- **Antworttyp:** single – `prod_freigegeben` Produktiv freigegeben · `erlaubt` Administrativ erlaubt, Produktivfreigabe offen · `verboten` Organisatorisch nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Technisch vorhanden heißt nicht produktiv zugelassen. Freigabe entscheidet über die Architektur.
- **GUI-/Menüpfad:** Software-Whitelist / Betriebshandbuch / Anfrage an IT-Betrieb
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Produktiv freigegeben / erlaubt / verboten.
- **Architekturauswirkung:** Nur bei Freigabe als tragende Komponente einplanen.
- **Folgefrage:** wird nur angezeigt, wenn `v => v(base + '_tech') !== 'nicht_installierbar'`

### D_python_ver Python: Version

- **Antworttyp:** version
- **Warum wichtig?** 3.10+ empfohlen.
- **GUI-/Menüpfad:** wie oben
- **Lesender Befehl (cmd):**

```
python --version
```

- **Erwartbare Ergebnisse:** 3.x
- **Architekturauswirkung:** Nur unterstützte 3.x-Versionen für Jobs einplanen.
- **Folgefrage:** wird nur angezeigt, wenn `v => v(base + '_tech') === 'installiert'`

### D_node_tech Node.js: technischer Status

- **Antworttyp:** single – `installiert` Technisch vorhanden (installiert) · `installierbar` Nicht installiert, aber technisch installierbar · `nicht_installierbar` Nicht installierbar (Technik/Plattform) · `unbekannt` Unbekannt
- **Warum wichtig?** Produktiv nur hinter ARR/iisnode relevant; im Build (Tailwind, Bundler) auf Entwicklungsrechnern wichtiger.
- **GUI-/Menüpfad:** Systemsteuerung → Programme
- **Lesender Befehl (powershell):**

```powershell
node -v; npm -v; Get-WebGlobalModule | Where-Object Name -like '*iisnode*'
```

- **Erwartbare Ergebnisse:** Version oder Fehler; iisnode selten.
- **Architekturauswirkung:** Auf Server nicht nötig, wenn Assets zur Build-Zeit kompiliert werden (L6).

### D_node_org Node.js: organisatorischer Status

- **Antworttyp:** single – `prod_freigegeben` Produktiv freigegeben · `erlaubt` Administrativ erlaubt, Produktivfreigabe offen · `verboten` Organisatorisch nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Technisch vorhanden heißt nicht produktiv zugelassen. Freigabe entscheidet über die Architektur.
- **GUI-/Menüpfad:** Software-Whitelist / Betriebshandbuch / Anfrage an IT-Betrieb
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Produktiv freigegeben / erlaubt / verboten.
- **Architekturauswirkung:** Nur bei Freigabe als tragende Komponente einplanen.
- **Folgefrage:** wird nur angezeigt, wenn `v => v(base + '_tech') !== 'nicht_installierbar'`

### D_node_ver Node.js: Version

- **Antworttyp:** version
- **Warum wichtig?** LTS (20/22) für Build-Tooling.
- **GUI-/Menüpfad:** wie oben
- **Lesender Befehl (cmd):**

```
node -v
```

- **Erwartbare Ergebnisse:** v20+/v22+
- **Architekturauswirkung:** Build-Toolchain auf LTS festlegen.
- **Folgefrage:** wird nur angezeigt, wenn `v => v(base + '_tech') === 'installiert'`

### D_java_tech Java / Tomcat: technischer Status

- **Antworttyp:** single – `installiert` Technisch vorhanden (installiert) · `installierbar` Nicht installiert, aber technisch installierbar · `nicht_installierbar` Nicht installierbar (Technik/Plattform) · `unbekannt` Unbekannt
- **Warum wichtig?** Nur relevant, wenn bereits Java-Anwendungen betrieben werden.
- **GUI-/Menüpfad:** Systemsteuerung → Programme; Dienste (Tomcat)
- **Lesender Befehl (powershell):**

```powershell
java -version; Get-Service | Where-Object Name -like '*Tomcat*' | Select-Object Name, Status
```

- **Erwartbare Ergebnisse:** Meist nicht vorhanden.
- **Architekturauswirkung:** Ohne Bestand kein Java-Stack einplanen.

### D_java_org Java / Tomcat: organisatorischer Status

- **Antworttyp:** single – `prod_freigegeben` Produktiv freigegeben · `erlaubt` Administrativ erlaubt, Produktivfreigabe offen · `verboten` Organisatorisch nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Technisch vorhanden heißt nicht produktiv zugelassen. Freigabe entscheidet über die Architektur.
- **GUI-/Menüpfad:** Software-Whitelist / Betriebshandbuch / Anfrage an IT-Betrieb
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Produktiv freigegeben / erlaubt / verboten.
- **Architekturauswirkung:** Nur bei Freigabe als tragende Komponente einplanen.
- **Folgefrage:** wird nur angezeigt, wenn `v => v(base + '_tech') !== 'nicht_installierbar'`

### D_pkg Paketquellen (NuGet/npm/pip): Zugriff von Entwicklungs-/Buildrechnern

- **Antworttyp:** single – `frei` Öffentliche Feeds erreichbar · `intern_feed` Nur interner Feed/Proxy (Artifactory, Nexus, Azure Artifacts) · `keiner` Kein Zugriff · `unbekannt` Unbekannt
- **Warum wichtig?** Ohne Paketquellen sind moderne Stacks (ASP.NET Core, Tailwind) praktisch nicht baubar.
- **GUI-/Menüpfad:** Auf dem Entwicklungsrechner: Browser https://api.nuget.org/v3/index.json
- **Lesender Befehl (powershell):**

```powershell
Test-NetConnection api.nuget.org -Port 443 | Select-Object TcpTestSucceeded; Test-NetConnection registry.npmjs.org -Port 443 | Select-Object TcpTestSucceeded; dotnet nuget list source
```

- **Erwartbare Ergebnisse:** True/True oder interner Feed konfiguriert.
- **Architekturauswirkung:** Keiner → Vendoring/Offline-Feeds; Stack mit minimalen Abhängigkeiten bevorzugen.

### D_devtools Auf Entwicklungsrechnern erlaubte Werkzeuge

- **Antworttyp:** multi – `vs` Visual Studio · `vscode` VS Code · `dotnet_sdk` .NET SDK · `node` Node.js/npm · `git` Git-Client · `docker` Docker Desktop · `mysql_client` MySQL Workbench/CLI · `keine_lokale_installation` Keine lokale Installation erlaubt · `unbekannt` Unbekannt
- **Warum wichtig?** Build-Time-Tooling (Tailwind, Bundling, dotnet publish) muss irgendwo erlaubt sein.
- **GUI-/Menüpfad:** Software-Katalog/Whitelist der IT
- **Lesender Befehl (cmd):**

```
dotnet --list-sdks; node -v; git --version
```

- **Erwartbare Ergebnisse:** Versionen auf dem Entwicklungsrechner.
- **Architekturauswirkung:** Keine lokale Installation → Build-Server oder CI zwingend (H03).

## E – Datenbanken (21)

_MySQL im Detail, andere Systeme nur feststellen. MySQL nicht ohne fachlichen Grund ersetzen._ Gate: **DATABASE**

### E01 MySQL: genaue Version (oder MariaDB?)

- **Antworttyp:** version
- **Warum wichtig?** Bestimmt JSON-Funktionen, CTE/Window Functions (8.0+), Auth-Plugins, Connector-Kompatibilität und Support.
- **GUI-/Menüpfad:** MySQL Workbench → Server Status
- **Lesender Befehl (sql):**

```sql
SELECT VERSION(), @@version_comment;
```

- **Erwartbare Ergebnisse:** 8.0.x / 8.4 LTS (gut). 5.7 = EOL Okt 2023 (Blocker für Neuentwicklung). „MariaDB“ im Kommentar = anderes Produkt, Connector beachten.
- **Architekturauswirkung:** ≥ 8.0 → CTEs, Window Functions, JSON, Check Constraints nutzbar; 5.7 → Upgrade als Voraussetzung.

### E02 MySQL: Host, Port, Standort (gleicher Server? DB-Segment?)

- **Antworttyp:** text
- **Warum wichtig?** Netzpfad IIS → DB muss offen sein; Latenz beeinflusst Antwortzeiten.
- **GUI-/Menüpfad:** Workbench → Verbindungseinstellungen
- **Lesender Befehl (sql):**

```sql
SHOW VARIABLES WHERE Variable_name IN ('hostname','port','bind_address');
```

- **Erwartbare Ergebnisse:** Hostname + 3306; bind_address 127.0.0.1 = nur lokal.
- **Architekturauswirkung:** Nur lokal erreichbar → App muss auf demselben Server laufen oder Firewall-/Bind-Änderung beantragen.

### E03 MySQL: TLS-Verschlüsselung

- **Antworttyp:** single – `tls_erzwungen` TLS erzwungen · `tls_optional` TLS verfügbar, optional · `kein_tls` Kein TLS · `unbekannt` Unbekannt
- **Warum wichtig?** Personenbezogene Daten über das Netz brauchen Transportverschlüsselung.
- **GUI-/Menüpfad:** Workbench → Server Status → SSL
- **Lesender Befehl (sql):**

```sql
SHOW VARIABLES WHERE Variable_name IN ('have_ssl','require_secure_transport','tls_version'); SHOW STATUS LIKE 'Ssl_cipher';
```

- **Erwartbare Ergebnisse:** have_ssl YES; Ssl_cipher nicht leer = aktuelle Verbindung verschlüsselt.
- **Architekturauswirkung:** Kein TLS + DB auf anderem Host → Security-Finding; Connection String SslMode=Required einplanen.

### E04 MySQL: Authentifizierungs-Plugin des App-Kontos

- **Antworttyp:** single – `caching_sha2` caching_sha2_password · `mysql_native` mysql_native_password · `ldap_pam` LDAP/PAM/Windows-Auth-Plugin · `unbekannt` Unbekannt
- **Warum wichtig?** Alte Connectoren (ODBC 5.x, PHP < 7.4) scheitern an caching_sha2_password.
- **GUI-/Menüpfad:** Workbench → Users and Privileges
- **Lesender Befehl (sql):**

```sql
SELECT user, host, plugin FROM mysql.user WHERE user = SUBSTRING_INDEX(CURRENT_USER(),'@',1);
```

- **Erwartbare Ergebnisse:** caching_sha2_password (8.0-Standard).
- **Architekturauswirkung:** Connector-Version muss passen (MySqlConnector/Pomelo ok; ODBC 8.x ok).

### E05 MySQL: Rechte des vorgesehenen App-Kontos

- **Antworttyp:** multi – `select` SELECT · `dml` INSERT/UPDATE/DELETE · `create_table` CREATE/ALTER/DROP TABLE · `create_db` CREATE DATABASE · `create_view` CREATE VIEW · `trigger` TRIGGER · `routine` CREATE ROUTINE · `execute` EXECUTE · `event` EVENT · `index` INDEX · `lock` LOCK TABLES · `grant` GRANT OPTION · `unbekannt` Unbekannt
- **Warum wichtig?** Migrationen (EF Core, Flyway) brauchen DDL-Rechte; Historisierung per Trigger braucht TRIGGER.
- **GUI-/Menüpfad:** Workbench → Users and Privileges → Schema Privileges
- **Lesender Befehl (sql):**

```sql
SHOW GRANTS FOR CURRENT_USER();
```

- **Erwartbare Ergebnisse:** GRANT ALL ON appdb.* = komfortabel; nur SELECT/DML = Migrationen durch DBA.
- **Architekturauswirkung:** Ohne DDL → Migrations-Skripte als IT-Aufgabe; ohne TRIGGER → Historisierung in der App-Schicht.

### E06 Eigenes Schema/Datenbank je Modul anlegbar?

- **Antworttyp:** single – `selbst` Ja, durch das App-Team · `per_antrag` Per Antrag durch DBA · `nein` Nein, ein Schema für alles · `unbekannt` Unbekannt
- **Warum wichtig?** Modulgrenzen und Single Source of Truth lassen sich mit eigenen Schemas sauber abbilden.
- **GUI-/Menüpfad:** Abstimmung DBA
- **Lesender Befehl (sql):**

```sql
SHOW DATABASES;
```

- **Erwartbare Ergebnisse:** Sichtbare Schemas zeigen die Konvention (z. B. app_<modul>).
- **Architekturauswirkung:** Ein Schema für alles → Modultrennung per Tabellenpräfix und klaren Ownership-Regeln.

### E07 Wer verwaltet DB-Konten/Rechte und wie lange dauert es?

- **Antworttyp:** text
- **Warum wichtig?** Rollout je Modul braucht Konten; lange Laufzeiten bremsen vertikale Lieferungen.
- **GUI-/Menüpfad:** Prozessdoku DBA/IT
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Name/Rolle, SLA.
- **Architekturauswirkung:** Konten früh für alle geplanten Module beantragen.

### E08 Storage Engine / Transaktionen

- **Antworttyp:** single – `innodb` InnoDB Standard · `myisam` MyISAM Standard · `unbekannt` Unbekannt
- **Warum wichtig?** Nur InnoDB bietet Transaktionen, Fremdschlüssel und Zeilensperren – Pflicht für auditierbare Daten.
- **GUI-/Menüpfad:** Workbench → Server Status
- **Lesender Befehl (sql):**

```sql
SHOW ENGINES; SHOW VARIABLES LIKE 'default_storage_engine';
```

- **Erwartbare Ergebnisse:** InnoDB DEFAULT.
- **Architekturauswirkung:** MyISAM → Engine je Tabelle explizit auf InnoDB setzen.

### E09 Charset/Collation

- **Antworttyp:** single – `utf8mb4` utf8mb4 · `utf8` utf8 (3-Byte) · `latin1` latin1 · `unbekannt` Unbekannt
- **Warum wichtig?** utf8mb4 ist Voraussetzung für vollständiges Unicode (Namen, Emojis, Sonderzeichen).
- **GUI-/Menüpfad:** Workbench → Server Status
- **Lesender Befehl (sql):**

```sql
SHOW VARIABLES WHERE Variable_name IN ('character_set_server','collation_server');
```

- **Erwartbare Ergebnisse:** utf8mb4 / utf8mb4_0900_ai_ci (8.0).
- **Architekturauswirkung:** Anders → Charset je Schema/Tabelle explizit setzen.

### E10 Event Scheduler aktiv (zeitgesteuerte DB-Jobs)?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Ermöglicht Aufräum-/Archivierungsjobs ohne externen Scheduler.
- **GUI-/Menüpfad:** Workbench → Server Status
- **Lesender Befehl (sql):**

```sql
SHOW VARIABLES LIKE 'event_scheduler';
```

- **Erwartbare Ergebnisse:** ON/OFF.
- **Architekturauswirkung:** Nur Ergänzung; fachliche Jobs gehören in die Anwendung (reproduzierbar, versioniert).

### E11 MySQL: Backup/Restore-Verfahren

- **Antworttyp:** single – `dump_regelmaessig` Regelmäßiger mysqldump/Enterprise Backup · `vm_snapshot` Nur VM-Snapshot · `keins` Kein Backup · `unbekannt` Unbekannt
- **Warum wichtig?** Point-in-Time-Restore braucht Binlog; VM-Snapshots allein sind für Datenbanken riskant.
- **GUI-/Menüpfad:** Backup-Konsole/DBA
- **Lesender Befehl (sql):**

```sql
SHOW VARIABLES WHERE Variable_name IN ('log_bin','binlog_expire_logs_seconds','datadir');
```

- **Erwartbare Ergebnisse:** log_bin ON = PITR möglich.
- **Architekturauswirkung:** Kein belastbares Backup → Produktionsfreigabe blockiert.

### E12 Restore auf Test-Datenbank / Kopie möglich?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Für Migrationstests und reproduzierbare Berechnungen mit Echtdaten (pseudonymisiert).
- **GUI-/Menüpfad:** Abstimmung DBA
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Ja/Nein.
- **Architekturauswirkung:** Nein → Testdaten synthetisch erzeugen.

### E13 max_connections und aktuelle Auslastung

- **Antworttyp:** number
- **Warum wichtig?** Connection Pooling der App darf das Limit nicht sprengen (mehrere Pools/Module!).
- **GUI-/Menüpfad:** Workbench → Server Status
- **Lesender Befehl (sql):**

```sql
SHOW VARIABLES LIKE 'max_connections'; SHOW STATUS WHERE Variable_name IN ('Threads_connected','Max_used_connections');
```

- **Erwartbare Ergebnisse:** 151 Standard.
- **Architekturauswirkung:** Pool-Größe je Modul begrenzen (z. B. 10–20).

### E14 MySQL vom IIS-Server erreichbar?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Grundvoraussetzung.
- **GUI-/Menüpfad:** Auf dem IIS-Server ausführen
- **Lesender Befehl (powershell):**

```powershell
Test-NetConnection <mysql-host> -Port 3306 | Select-Object ComputerName, TcpTestSucceeded
```

- **Erwartbare Ergebnisse:** True.
- **Architekturauswirkung:** False → Firewall-Antrag (Blocker).

### E15 MySQL von Entwicklungsrechnern erreichbar?

- **Antworttyp:** single – `direkt` Direkt · `vpn` Über VPN · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Entwicklung gegen eine Test-DB braucht Zugriff; sonst lokale DB (Docker/MySQL lokal).
- **GUI-/Menüpfad:** Vom Entwicklungsrechner
- **Lesender Befehl (powershell):**

```powershell
Test-NetConnection <mysql-host> -Port 3306 | Select-Object TcpTestSucceeded
```

- **Erwartbare Ergebnisse:** True/False.
- **Architekturauswirkung:** Nein → lokale MySQL-Instanz je Entwickler; Migrationen versioniert.

### E16 Verfügbare Connectoren/Treiber

- **Antworttyp:** multi – `odbc` MySQL ODBC (Server) · `mysqlconnector_nuget` MySqlConnector/Pomelo (NuGet) · `oracle_connector_net` MySQL Connector/NET · `php_pdo` PHP pdo_mysql/mysqli · `python_driver` Python mysql-connector/PyMySQL · `node_driver` Node mysql2 · `unbekannt` Unbekannt
- **Warum wichtig?** NuGet-basierte Treiber brauchen keine Serverinstallation; ODBC muss der Admin installieren.
- **GUI-/Menüpfad:** ODBC-Datenquellen (64-Bit) → Treiber
- **Lesender Befehl (powershell):**

```powershell
Get-OdbcDriver | Where-Object Name -like '*MySQL*' | Select-Object Name, Platform
```

- **Erwartbare Ergebnisse:** MySQL ODBC 8.x Unicode Driver oder leer.
- **Architekturauswirkung:** .NET: MySqlConnector via NuGet (keine Serverinstallation nötig).

### E17 MySQL: Logging/Audit

- **Antworttyp:** multi – `general_log` General Log · `slow_log` Slow Query Log · `audit_plugin` Audit-Plugin · `binlog` Binlog · `keins` Keins · `unbekannt` Unbekannt
- **Warum wichtig?** DB-seitiges Audit ergänzt, ersetzt aber nicht die fachliche Historisierung.
- **GUI-/Menüpfad:** Workbench → Server Status
- **Lesender Befehl (sql):**

```sql
SHOW VARIABLES WHERE Variable_name IN ('general_log','slow_query_log','log_bin'); SHOW PLUGINS;
```

- **Erwartbare Ergebnisse:** slow_query_log ON sinnvoll.
- **Architekturauswirkung:** Fachliche Historie (alt/neu/Benutzer/Zeit/Quelle) in Anwendungstabellen realisieren.

### E18 SQL Server vorhanden/zulässig?

- **Antworttyp:** single – `vorhanden_nutzbar` Vorhanden und nutzbar · `vorhanden_nicht_freigegeben` Vorhanden, nicht freigegeben · `nicht_vorhanden` Nicht vorhanden · `unbekannt` Unbekannt
- **Warum wichtig?** Nur feststellen – MySQL wird nicht ohne fachlichen Grund ersetzt.
- **GUI-/Menüpfad:** Dienste → SQL Server (…)
- **Lesender Befehl (powershell):**

```powershell
Get-Service | Where-Object Name -like 'MSSQL*' | Select-Object Name, Status
```

- **Erwartbare Ergebnisse:** Dienst vorhanden oder leer.
- **Architekturauswirkung:** Nur als Alternativvariante dokumentieren.

### E19 PostgreSQL vorhanden/zulässig?

- **Antworttyp:** single – `vorhanden_nutzbar` Vorhanden und nutzbar · `vorhanden_nicht_freigegeben` Vorhanden, nicht freigegeben · `nicht_vorhanden` Nicht vorhanden · `unbekannt` Unbekannt
- **Warum wichtig?** Nur feststellen.
- **GUI-/Menüpfad:** Dienste → postgresql-x64-…
- **Lesender Befehl (powershell):**

```powershell
Get-Service | Where-Object Name -like 'postgres*' | Select-Object Name, Status
```

- **Erwartbare Ergebnisse:** Meist leer.
- **Architekturauswirkung:** Nur „Außerhalb der Box“-Variante.

### E20 Weitere Datenhaltung: SQLite-Dateien, LocalDB, Access, Dateien?

- **Antworttyp:** text
- **Warum wichtig?** Zeigt Praxis und ob dateibasierte Speicherung für kleine Module toleriert wird.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage bei IT/Fachbereich)
```

- **Erwartbare Ergebnisse:** Freitext.
- **Architekturauswirkung:** SQLite kann für Prototypen dienen, nicht für Single Source of Truth mit Mehrbenutzer-Schreibzugriff.

### E21 Zeitzone von DB und Server

- **Antworttyp:** text
- **Warum wichtig?** Audit-Zeitstempel müssen eindeutig sein (UTC speichern, lokal anzeigen).
- **GUI-/Menüpfad:** Datum/Uhrzeit-Einstellungen
- **Lesender Befehl (sql):**

```sql
SHOW VARIABLES LIKE '%time_zone%'; -- PowerShell: (Get-TimeZone).Id
```

- **Erwartbare Ergebnisse:** SYSTEM / Europe/Berlin.
- **Architekturauswirkung:** Konvention: UTC in DB, Umrechnung in der Anwendung.

## F – Schnittstellen (24)

_Je Schnittstelle: vorhanden, erreichbar, erlaubt, Authentifizierung, Verantwortlicher, Dokumentation._ Gate: **NETWORK**

### F01 Interne REST/HTTPS-APIs anderer Fachsysteme

- **Antworttyp:** single – `verfuegbar_erlaubt` Vorhanden, erreichbar und erlaubt · `verfuegbar_ungeklaert` Vorhanden/erreichbar, Nutzung organisatorisch ungeklärt · `nicht_erreichbar` Vorhanden, aber vom Webserver nicht erreichbar · `nicht_vorhanden` Nicht vorhanden / nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Datenquellen für Importe (Stammdaten, Personal, Fahrzeuge).
- **GUI-/Menüpfad:** Schnittstellenkatalog der IT
- **Lesender Befehl (powershell):**

```powershell
Invoke-WebRequest https://<api-host>/ -UseBasicParsing -Method Head | Select-Object StatusCode
```

- **Erwartbare Ergebnisse:** 200/401 = erreichbar; Timeout = Netz.
- **Architekturauswirkung:** Vorhanden → Importe als Hintergrundjob über HTTPS statt Dateiaustausch.

### F01_det Interne REST/HTTPS-APIs anderer Fachsysteme: Authentifizierung, Verantwortlicher, Dokumentation

- **Antworttyp:** text
- **Warum wichtig?** Ohne Ansprechpartner und Doku ist eine Schnittstelle nicht betriebsfähig.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage)
```

- **Erwartbare Ergebnisse:** Auth-Verfahren, Name/Team, Link zur Doku.
- **Architekturauswirkung:** Verantwortlicher = Freigabeinstanz für Datenkonsum anderer Module.
- **Folgefrage:** wird nur angezeigt, wenn `v => ['verfuegbar_erlaubt', 'verfuegbar_ungeklaert', 'nicht_erreichbar'].includes(v(id))`

### F02 Zentraler Reverse Proxy / WAF / Gateway vor dem IIS

- **Antworttyp:** single – `verfuegbar_erlaubt` Vorhanden, erreichbar und erlaubt · `verfuegbar_ungeklaert` Vorhanden/erreichbar, Nutzung organisatorisch ungeklärt · `nicht_erreichbar` Vorhanden, aber vom Webserver nicht erreichbar · `nicht_vorhanden` Nicht vorhanden / nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Beeinflusst Header (X-Forwarded-*), Timeouts, WebSockets, Client-IP, Auth-Durchleitung.
- **GUI-/Menüpfad:** Netzwerkdoku/IT
- **Lesender Befehl (powershell):**

```powershell
Invoke-WebRequest https://<app-host>/ -UseBasicParsing -Method Head | Select-Object -ExpandProperty Headers
```

- **Erwartbare Ergebnisse:** Server-/Via-Header zeigen Proxy.
- **Architekturauswirkung:** Vorhanden → Forwarded Headers Middleware; WebSocket/SSE am Gateway prüfen (Client-Test).

### F02_det Zentraler Reverse Proxy / WAF / Gateway vor dem IIS: Authentifizierung, Verantwortlicher, Dokumentation

- **Antworttyp:** text
- **Warum wichtig?** Ohne Ansprechpartner und Doku ist eine Schnittstelle nicht betriebsfähig.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage)
```

- **Erwartbare Ergebnisse:** Auth-Verfahren, Name/Team, Link zur Doku.
- **Architekturauswirkung:** Verantwortlicher = Freigabeinstanz für Datenkonsum anderer Module.
- **Folgefrage:** wird nur angezeigt, wenn `v => ['verfuegbar_erlaubt', 'verfuegbar_ungeklaert', 'nicht_erreichbar'].includes(v(id))`

### F03 LDAP/LDAPS (aus der Anwendung)

- **Antworttyp:** single – `verfuegbar_erlaubt` Vorhanden, erreichbar und erlaubt · `verfuegbar_ungeklaert` Vorhanden/erreichbar, Nutzung organisatorisch ungeklärt · `nicht_erreichbar` Vorhanden, aber vom Webserver nicht erreichbar · `nicht_vorhanden` Nicht vorhanden / nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Benutzersuche, Gruppenauflösung.
- **GUI-/Menüpfad:** siehe B07
- **Lesender Befehl (powershell):**

```powershell
Test-NetConnection <dc> -Port 636 | Select-Object TcpTestSucceeded
```

- **Erwartbare Ergebnisse:** True.
- **Architekturauswirkung:** Siehe B07.

### F03_det LDAP/LDAPS (aus der Anwendung): Authentifizierung, Verantwortlicher, Dokumentation

- **Antworttyp:** text
- **Warum wichtig?** Ohne Ansprechpartner und Doku ist eine Schnittstelle nicht betriebsfähig.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage)
```

- **Erwartbare Ergebnisse:** Auth-Verfahren, Name/Team, Link zur Doku.
- **Architekturauswirkung:** Verantwortlicher = Freigabeinstanz für Datenkonsum anderer Module.
- **Folgefrage:** wird nur angezeigt, wenn `v => ['verfuegbar_erlaubt', 'verfuegbar_ungeklaert', 'nicht_erreichbar'].includes(v(id))`

### F04 SMB/Netzlaufwerke (Import/Export-Ablagen)

- **Antworttyp:** single – `verfuegbar_erlaubt` Vorhanden, erreichbar und erlaubt · `verfuegbar_ungeklaert` Vorhanden/erreichbar, Nutzung organisatorisch ungeklärt · `nicht_erreichbar` Vorhanden, aber vom Webserver nicht erreichbar · `nicht_vorhanden` Nicht vorhanden / nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Häufigster Austauschweg für CSV/Excel aus Fachsystemen.
- **GUI-/Menüpfad:** Explorer → Netzlaufwerke
- **Lesender Befehl (powershell):**

```powershell
Get-SmbMapping; net use; Test-NetConnection <fileserver> -Port 445 | Select-Object TcpTestSucceeded
```

- **Erwartbare Ergebnisse:** Freigaben und Erreichbarkeit; Zugriff der App-Pool-Identität separat (B11).
- **Architekturauswirkung:** Import-Jobs lesen aus Freigabe; UNC-Pfade statt Laufwerksbuchstaben.

### F04_det SMB/Netzlaufwerke (Import/Export-Ablagen): Authentifizierung, Verantwortlicher, Dokumentation

- **Antworttyp:** text
- **Warum wichtig?** Ohne Ansprechpartner und Doku ist eine Schnittstelle nicht betriebsfähig.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage)
```

- **Erwartbare Ergebnisse:** Auth-Verfahren, Name/Team, Link zur Doku.
- **Architekturauswirkung:** Verantwortlicher = Freigabeinstanz für Datenkonsum anderer Module.
- **Folgefrage:** wird nur angezeigt, wenn `v => ['verfuegbar_erlaubt', 'verfuegbar_ungeklaert', 'nicht_erreichbar'].includes(v(id))`

### F05 SMTP/Exchange (Mailversand)

- **Antworttyp:** single – `verfuegbar_erlaubt` Vorhanden, erreichbar und erlaubt · `verfuegbar_ungeklaert` Vorhanden/erreichbar, Nutzung organisatorisch ungeklärt · `nicht_erreichbar` Vorhanden, aber vom Webserver nicht erreichbar · `nicht_vorhanden` Nicht vorhanden / nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Benachrichtigungen, Berichte.
- **GUI-/Menüpfad:** Exchange-Admin/IT
- **Lesender Befehl (powershell):**

```powershell
Test-NetConnection <smtp-host> -Port 25 | Select-Object TcpTestSucceeded; Test-NetConnection <smtp-host> -Port 587 | Select-Object TcpTestSucceeded
```

- **Erwartbare Ergebnisse:** Relay-Erlaubnis für Server-IP/Konto klären.
- **Architekturauswirkung:** Vorhanden → E-Mail als Benachrichtigungskanal; sonst Teams-Webhook/In-App.

### F05_det SMTP/Exchange (Mailversand): Authentifizierung, Verantwortlicher, Dokumentation

- **Antworttyp:** text
- **Warum wichtig?** Ohne Ansprechpartner und Doku ist eine Schnittstelle nicht betriebsfähig.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage)
```

- **Erwartbare Ergebnisse:** Auth-Verfahren, Name/Team, Link zur Doku.
- **Architekturauswirkung:** Verantwortlicher = Freigabeinstanz für Datenkonsum anderer Module.
- **Folgefrage:** wird nur angezeigt, wenn `v => ['verfuegbar_erlaubt', 'verfuegbar_ungeklaert', 'nicht_erreichbar'].includes(v(id))`

### F06 Microsoft Graph / Microsoft 365

- **Antworttyp:** single – `verfuegbar_erlaubt` Vorhanden, erreichbar und erlaubt · `verfuegbar_ungeklaert` Vorhanden/erreichbar, Nutzung organisatorisch ungeklärt · `nicht_erreichbar` Vorhanden, aber vom Webserver nicht erreichbar · `nicht_vorhanden` Nicht vorhanden / nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Nur relevant bei Entra-ID-Umgebung (Kalender, Teams, Mail).
- **GUI-/Menüpfad:** Entra-Admin-Center (IT)
- **Lesender Befehl (powershell):**

```powershell
Test-NetConnection graph.microsoft.com -Port 443 | Select-Object TcpTestSucceeded
```

- **Erwartbare Ergebnisse:** Erreichbar + App-Registrierung möglich?
- **Architekturauswirkung:** Optional; keine Abhängigkeit im Kern.

### F06_det Microsoft Graph / Microsoft 365: Authentifizierung, Verantwortlicher, Dokumentation

- **Antworttyp:** text
- **Warum wichtig?** Ohne Ansprechpartner und Doku ist eine Schnittstelle nicht betriebsfähig.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage)
```

- **Erwartbare Ergebnisse:** Auth-Verfahren, Name/Team, Link zur Doku.
- **Architekturauswirkung:** Verantwortlicher = Freigabeinstanz für Datenkonsum anderer Module.
- **Folgefrage:** wird nur angezeigt, wenn `v => ['verfuegbar_erlaubt', 'verfuegbar_ungeklaert', 'nicht_erreichbar'].includes(v(id))`

### F07 Webhooks (eingehend/ausgehend, z. B. Teams)

- **Antworttyp:** single – `verfuegbar_erlaubt` Vorhanden, erreichbar und erlaubt · `verfuegbar_ungeklaert` Vorhanden/erreichbar, Nutzung organisatorisch ungeklärt · `nicht_erreichbar` Vorhanden, aber vom Webserver nicht erreichbar · `nicht_vorhanden` Nicht vorhanden / nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Leichtgewichtige Benachrichtigung/Integration.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (powershell):**

```powershell
Test-NetConnection <webhook-host> -Port 443 | Select-Object TcpTestSucceeded
```

- **Erwartbare Ergebnisse:** Ausgehend erlaubt?
- **Architekturauswirkung:** Ausgehende Webhooks als Job (Retry), eingehende nur mit Signaturprüfung.

### F07_det Webhooks (eingehend/ausgehend, z. B. Teams): Authentifizierung, Verantwortlicher, Dokumentation

- **Antworttyp:** text
- **Warum wichtig?** Ohne Ansprechpartner und Doku ist eine Schnittstelle nicht betriebsfähig.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage)
```

- **Erwartbare Ergebnisse:** Auth-Verfahren, Name/Team, Link zur Doku.
- **Architekturauswirkung:** Verantwortlicher = Freigabeinstanz für Datenkonsum anderer Module.
- **Folgefrage:** wird nur angezeigt, wenn `v => ['verfuegbar_erlaubt', 'verfuegbar_ungeklaert', 'nicht_erreichbar'].includes(v(id))`

### F08 WebSockets Ende-zu-Ende (Client → Gateway/Tunnel → IIS)

- **Antworttyp:** single – `verfuegbar_erlaubt` Vorhanden, erreichbar und erlaubt · `verfuegbar_ungeklaert` Vorhanden/erreichbar, Nutzung organisatorisch ungeklärt · `nicht_erreichbar` Vorhanden, aber vom Webserver nicht erreichbar · `nicht_vorhanden` Nicht vorhanden / nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Realtime-Dashboards; serverseitige Rolle (C27) allein reicht nicht.
- **GUI-/Menüpfad:** Client Capability Test im realen Zugriffspfad
- **Lesender Befehl (text):**

```
(siehe Client-Test „WebSocket“)
```

- **Erwartbare Ergebnisse:** Test-Ergebnis je Clientprofil.
- **Architekturauswirkung:** Nicht Ende-zu-Ende → SSE oder Polling.

### F08_det WebSockets Ende-zu-Ende (Client → Gateway/Tunnel → IIS): Authentifizierung, Verantwortlicher, Dokumentation

- **Antworttyp:** text
- **Warum wichtig?** Ohne Ansprechpartner und Doku ist eine Schnittstelle nicht betriebsfähig.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage)
```

- **Erwartbare Ergebnisse:** Auth-Verfahren, Name/Team, Link zur Doku.
- **Architekturauswirkung:** Verantwortlicher = Freigabeinstanz für Datenkonsum anderer Module.
- **Folgefrage:** wird nur angezeigt, wenn `v => ['verfuegbar_erlaubt', 'verfuegbar_ungeklaert', 'nicht_erreichbar'].includes(v(id))`

### F09 Server-Sent Events Ende-zu-Ende

- **Antworttyp:** single – `verfuegbar_erlaubt` Vorhanden, erreichbar und erlaubt · `verfuegbar_ungeklaert` Vorhanden/erreichbar, Nutzung organisatorisch ungeklärt · `nicht_erreichbar` Vorhanden, aber vom Webserver nicht erreichbar · `nicht_vorhanden` Nicht vorhanden / nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Einfachster Push-Kanal (HTTP-Stream), oft tunnelverträglicher als WebSockets.
- **GUI-/Menüpfad:** Client Capability Test
- **Lesender Befehl (text):**

```
(siehe Client-Test „SSE“)
```

- **Erwartbare Ergebnisse:** Test-Ergebnis je Clientprofil.
- **Architekturauswirkung:** SSE ok → Live-Updates ohne WebSocket; Puffer-Proxys brechen SSE.

### F09_det Server-Sent Events Ende-zu-Ende: Authentifizierung, Verantwortlicher, Dokumentation

- **Antworttyp:** text
- **Warum wichtig?** Ohne Ansprechpartner und Doku ist eine Schnittstelle nicht betriebsfähig.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage)
```

- **Erwartbare Ergebnisse:** Auth-Verfahren, Name/Team, Link zur Doku.
- **Architekturauswirkung:** Verantwortlicher = Freigabeinstanz für Datenkonsum anderer Module.
- **Folgefrage:** wird nur angezeigt, wenn `v => ['verfuegbar_erlaubt', 'verfuegbar_ungeklaert', 'nicht_erreichbar'].includes(v(id))`

### F10 Redis

- **Antworttyp:** single – `verfuegbar_erlaubt` Vorhanden, erreichbar und erlaubt · `verfuegbar_ungeklaert` Vorhanden/erreichbar, Nutzung organisatorisch ungeklärt · `nicht_erreichbar` Vorhanden, aber vom Webserver nicht erreichbar · `nicht_vorhanden` Nicht vorhanden / nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Verteilter Cache/Session-Store – meist nicht vorhanden.
- **GUI-/Menüpfad:** Dienste
- **Lesender Befehl (powershell):**

```powershell
Test-NetConnection <redis-host> -Port 6379 | Select-Object TcpTestSucceeded
```

- **Erwartbare Ergebnisse:** Meist nicht vorhanden.
- **Architekturauswirkung:** Nicht vorhanden → In-Memory-Cache je Prozess, Sessions in DB/Cookie.

### F10_det Redis: Authentifizierung, Verantwortlicher, Dokumentation

- **Antworttyp:** text
- **Warum wichtig?** Ohne Ansprechpartner und Doku ist eine Schnittstelle nicht betriebsfähig.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage)
```

- **Erwartbare Ergebnisse:** Auth-Verfahren, Name/Team, Link zur Doku.
- **Architekturauswirkung:** Verantwortlicher = Freigabeinstanz für Datenkonsum anderer Module.
- **Folgefrage:** wird nur angezeigt, wenn `v => ['verfuegbar_erlaubt', 'verfuegbar_ungeklaert', 'nicht_erreichbar'].includes(v(id))`

### F11 RabbitMQ / Message Broker / MSMQ

- **Antworttyp:** single – `verfuegbar_erlaubt` Vorhanden, erreichbar und erlaubt · `verfuegbar_ungeklaert` Vorhanden/erreichbar, Nutzung organisatorisch ungeklärt · `nicht_erreichbar` Vorhanden, aber vom Webserver nicht erreichbar · `nicht_vorhanden` Nicht vorhanden / nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Entkopplung zwischen Modulen; in kleinen Umgebungen meist Outbox-Tabelle in MySQL ausreichend.
- **GUI-/Menüpfad:** Dienste
- **Lesender Befehl (powershell):**

```powershell
Test-NetConnection <broker-host> -Port 5672 | Select-Object TcpTestSucceeded; Get-WindowsFeature MSMQ-Server | Select-Object InstallState
```

- **Erwartbare Ergebnisse:** Meist nicht vorhanden.
- **Architekturauswirkung:** Nicht vorhanden → Outbox/Polling-Muster über DB.

### F11_det RabbitMQ / Message Broker / MSMQ: Authentifizierung, Verantwortlicher, Dokumentation

- **Antworttyp:** text
- **Warum wichtig?** Ohne Ansprechpartner und Doku ist eine Schnittstelle nicht betriebsfähig.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage)
```

- **Erwartbare Ergebnisse:** Auth-Verfahren, Name/Team, Link zur Doku.
- **Architekturauswirkung:** Verantwortlicher = Freigabeinstanz für Datenkonsum anderer Module.
- **Folgefrage:** wird nur angezeigt, wenn `v => ['verfuegbar_erlaubt', 'verfuegbar_ungeklaert', 'nicht_erreichbar'].includes(v(id))`

### F12 Datenaustausch per Datei: Formate und Quellen (Import/Export)

- **Antworttyp:** multi – `csv` CSV · `excel` Excel (xlsx) · `xml` XML · `json` JSON · `pdf_export` PDF-Export gefordert · `unbekannt` Unbekannt
- **Warum wichtig?** Bestimmt Bibliotheken (ClosedXML, CsvHelper) und Validierungsaufwand.
- **GUI-/Menüpfad:** Fachbereich
- **Lesender Befehl (text):**

```
(Nachfrage)
```

- **Erwartbare Ergebnisse:** Liste mit Quelle, Rhythmus, Verantwortlichem.
- **Architekturauswirkung:** Import als idempotenter Job mit Protokoll (Quelle, Zeit, Zeilen, Fehler).

### F13 Darf die Anwendung ausgehende HTTP-Aufrufe machen?

- **Antworttyp:** single – `intern_und_extern` Intern und extern · `nur_intern` Nur intern · `keine` Keine · `unbekannt` Unbekannt
- **Warum wichtig?** Grenze für Integrationen, Webhooks, Kartendienste, Lizenzprüfungen.
- **GUI-/Menüpfad:** IT-Security-Richtlinie
- **Lesender Befehl (powershell):**

```powershell
Test-NetConnection www.microsoft.com -Port 443 | Select-Object TcpTestSucceeded
```

- **Erwartbare Ergebnisse:** Vom App-Pool-Kontext prüfen (Proxy!).
- **Architekturauswirkung:** Keine → rein interne Architektur, alle Assets lokal.

## G – Hintergrundverarbeitung (8)

_Belastbarer Weg für automatische Importe, Berechnungen und Benachrichtigungen._ Gate: **SERVER**

### G01 Windows Task Scheduler für Anwendungs-Jobs nutzbar?

- **Antworttyp:** single – `eigene_tasks` Ja, App-Team darf Tasks anlegen · `nur_it` Nur IT legt Tasks an · `nein` Nicht zulässig · `unbekannt` Unbekannt
- **Warum wichtig?** Einfachster belastbarer Weg für zeitgesteuerte Importe/Berechnungen (Konsolenprogramm + Task).
- **GUI-/Menüpfad:** Aufgabenplanung → Aufgabenplanungsbibliothek
- **Lesender Befehl (powershell):**

```powershell
Get-ScheduledTask | Where-Object { $_.TaskPath -notlike '\Microsoft*' -and $_.State -ne 'Disabled' } | Select-Object TaskName, TaskPath, State, @{n='User';e={$_.Principal.UserId}}
```

- **Erwartbare Ergebnisse:** Vorhandene Fach-Tasks zeigen Praxis und Konten.
- **Architekturauswirkung:** Nutzbar → Jobs als Konsolen-App (dotnet) mit Task; sonst Windows Service oder In-Process.

### G02 Eigener Windows Service installierbar?

- **Antworttyp:** single – `ja` Ja · `per_antrag` Per Antrag durch IT · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Worker Service = robuster Weg für dauerhafte Verarbeitung (Queues, Benachrichtigungen, Berechnungen).
- **GUI-/Menüpfad:** Dienste (services.msc)
- **Lesender Befehl (powershell):**

```powershell
Get-CimInstance Win32_Service | Where-Object { $_.PathName -notlike '*\Windows\*' } | Select-Object Name, StartMode, State, StartName, PathName
```

- **Erwartbare Ergebnisse:** Fremd-Dienste mit Konten zeigen Praxis.
- **Architekturauswirkung:** Nein → Task Scheduler (kurz laufende Jobs) oder In-Process mit AlwaysRunning (C12).

### G03 Unter welchem Konto dürfen Jobs/Dienste laufen?

- **Antworttyp:** single – `gmsa` gMSA · `service_account` Dienstkonto · `apppool` App-Pool-Identität · `lokales_system` Lokales System/NetworkService · `unbekannt` Unbekannt
- **Warum wichtig?** Bestimmt Zugriff auf DB, Freigaben, SMTP.
- **GUI-/Menüpfad:** Aufgabenplanung → Task → Sicherheitsoptionen
- **Lesender Befehl (powershell):**

```powershell
Get-ScheduledTask | Select-Object TaskName, @{n='User';e={$_.Principal.UserId}}, @{n='LogonType';e={$_.Principal.LogonType}} | Where-Object User
```

- **Erwartbare Ergebnisse:** gMSA („DOMAIN\svc$“) ideal.
- **Architekturauswirkung:** Siehe B10.

### G04 Sind In-Process-Jobs im IIS (Hangfire, IHostedService) zulässig?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Bequem, aber abhängig von Recycling/Idle-Timeout (C12/C13).
- **GUI-/Menüpfad:** Abstimmung IT
- **Lesender Befehl (text):**

```
(organisatorische Frage; technisch siehe C12/C13)
```

- **Erwartbare Ergebnisse:** Ja nur mit AlwaysRunning + Preload + Idle 0.
- **Architekturauswirkung:** Sonst Jobs extern; In-Process nur für unkritische Aufgaben (Cache-Refresh).

### G05 Vorgaben zu Laufzeit, Zeitfenstern und Ressourcenlimits für Jobs

- **Antworttyp:** text
- **Warum wichtig?** Nächtliche Importe dürfen Backups/Updates nicht kollidieren.
- **GUI-/Menüpfad:** Betriebshandbuch
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** z. B. „nicht 01–03 Uhr (Backup)“.
- **Architekturauswirkung:** Job-Zeitplan; Idempotenz und Wiederaufnahme nach Abbruch.

### G06 Neustart-/Wiederherstellungsverhalten von Diensten und Tasks

- **Antworttyp:** text
- **Warum wichtig?** Nach Reboot/Patch müssen Jobs selbst wieder anlaufen.
- **GUI-/Menüpfad:** Dienste → Eigenschaften → Wiederherstellung
- **Lesender Befehl (cmd):**

```
sc qfailure <dienstname>
```

- **Erwartbare Ergebnisse:** Restart-Aktionen konfiguriert.
- **Architekturauswirkung:** Recovery-Optionen in Installationsdoku aufnehmen (Admin-Aufgabe).

### G07 Monitoring/Alarmierung für Hintergrundjobs

- **Antworttyp:** single – `zentral` Zentrales Monitoring (PRTG, Zabbix, checkmk, …) · `eventlog` Nur Event Log · `keins` Keins · `unbekannt` Unbekannt
- **Warum wichtig?** Stille Job-Ausfälle sind das größte Betriebsrisiko für Importe/Berechnungen.
- **GUI-/Menüpfad:** Monitoring-Konsole IT
- **Lesender Befehl (powershell):**

```powershell
Get-Service | Where-Object DisplayName -match 'PRTG|Zabbix|checkmk|SCOM|Nagios|Datadog' | Select-Object Name, Status
```

- **Erwartbare Ergebnisse:** Agent vorhanden → Health-Endpunkt/Heartbeat anbindbar.
- **Architekturauswirkung:** Keins → Job-Heartbeat-Tabelle + Dashboard-Hinweis „letzter erfolgreicher Lauf“.

### G08 Benachrichtigungswege für Nutzer

- **Antworttyp:** multi – `smtp` E-Mail · `teams_webhook` Teams/Chat-Webhook · `sms` SMS-Gateway · `push_mdm` Push über MDM/App · `inapp` Nur In-App · `keine` Keine · `unbekannt` Unbekannt
- **Warum wichtig?** Benachrichtigungen sind ein Kernnutzen operativer Module.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(siehe F05/F07)
```

- **Erwartbare Ergebnisse:** Liste.
- **Architekturauswirkung:** Kanäle als austauschbare Provider hinter einer Schnittstelle.

## H – Deployment (12)

_Veröffentlichungsweg, Test, Freigabe, Rollback, Rechte, Wartungsfenster._ Gate: **SERVER**

### H01 Aktueller Veröffentlichungsweg

- **Antworttyp:** multi – `manuell_kopie` Manuelles Kopieren · `web_deploy` Web Deploy (MSDeploy) · `zip_powershell` ZIP + PowerShell-Skript · `dateifreigabe` Dateifreigabe/Drop-Ordner · `cicd` CI/CD-Pipeline · `git_pull` Git pull auf dem Server · `anderes` Anderes · `unbekannt` Unbekannt
- **Warum wichtig?** Bestimmt Release-Frequenz, Reproduzierbarkeit und Fehlerrisiko.
- **GUI-/Menüpfad:** IT-Betriebshandbuch
- **Lesender Befehl (powershell):**

```powershell
Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object DisplayName -like '*Web Deploy*' | Select-Object DisplayName, DisplayVersion; Get-Service MsDepSvc, WMSVC -ErrorAction SilentlyContinue | Select-Object Name, Status
```

- **Erwartbare Ergebnisse:** Web Deploy 4.0 + WMSVC running = Remote-Publish möglich.
- **Architekturauswirkung:** Manuell → Release-Paket (ZIP, versioniert) + Checkliste; Web Deploy/CI → automatisierte Pipeline.

### H02 Git / Quellcodeverwaltung

- **Antworttyp:** single – `internes_git` Internes Git (GitLab, Gitea, Azure DevOps Server) · `extern` GitHub/GitLab.com/Azure DevOps Cloud · `kein_git` Keine Versionsverwaltung · `unbekannt` Unbekannt
- **Warum wichtig?** Ohne Versionsverwaltung keine Reproduzierbarkeit, kein Rollback auf Codeebene.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (cmd):**

```
git --version; git remote -v
```

- **Erwartbare Ergebnisse:** Remote-URL zeigt System.
- **Architekturauswirkung:** Kein Git → Blocker für Teamentwicklung; internes Git als „Box erweitern“.

### H03 CI/CD-System vorhanden?

- **Antworttyp:** single – `azure_devops` Azure DevOps · `gitlab_ci` GitLab CI · `jenkins` Jenkins · `github_actions` GitHub Actions · `keins` Keins · `unbekannt` Unbekannt
- **Warum wichtig?** Build-Time-Assets (Tailwind) und reproduzierbare Releases brauchen einen Build-Ort.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage IT)
```

- **Erwartbare Ergebnisse:** System + Agent-Standort (Zugriff auf IIS?).
- **Architekturauswirkung:** Keins → Build auf Entwicklungsrechner mit Skript, Artefakt versioniert ablegen.

### H04 Testumgebung für Webanwendungen

- **Antworttyp:** single – `eigener_server` Eigener Test-Server · `eigene_site` Test-Site auf demselben Server · `keine` Keine · `unbekannt` Unbekannt
- **Warum wichtig?** Siehe A12 – hier konkret für Web/DB.
- **GUI-/Menüpfad:** IIS-Manager → Sites
- **Lesender Befehl (powershell):**

```powershell
Get-IISSite | Select-Object Name, State
```

- **Erwartbare Ergebnisse:** Test-Site/-Server.
- **Architekturauswirkung:** Keine → Test-Site beantragen („Box erweitern“, geringer Aufwand).

### H05 Freigabeprozess für Produktion

- **Antworttyp:** text
- **Warum wichtig?** Change-Management, Security-Review, Fachfreigabe – Dauer und Beteiligte.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Schritte, Dauer, Formulare.
- **Architekturauswirkung:** Release-Kadenz der Module.

### H06 Rollback-Verfahren

- **Antworttyp:** single – `vorherige_version_ordner` Vorherige Version als Ordner/Paket · `vm_snapshot` VM-Snapshot · `keins` Keins · `unbekannt` Unbekannt
- **Warum wichtig?** Ohne Rollback jede Änderung riskant; DB-Migrationen müssen rückwärtskompatibel sein.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Verfahren.
- **Architekturauswirkung:** Versionierte Release-Ordner + Expand/Contract-Migrationen.

### H07 Versionierung/Release-Nummerierung

- **Antworttyp:** text
- **Warum wichtig?** Nachvollziehbarkeit im Betrieb und im Audit (welche Version hat welchen Wert berechnet?).
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** SemVer, Build-Nummer.
- **Architekturauswirkung:** Version in UI, Logs und Berechnungsprotokollen ausgeben.

### H08 Wer darf deployen?

- **Antworttyp:** single – `app_team` App-Team · `nur_it` Nur IT · `gemeinsam` Gemeinsam/4-Augen · `unbekannt` Unbekannt
- **Warum wichtig?** Siehe C38.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Nur IT → Deployment-Paket mit Anleitung, seltene Releases.

### H09 Akzeptable Downtime / Wartungsfenster für Deployments

- **Antworttyp:** text
- **Warum wichtig?** App_offline.htm-Deployments dauern Sekunden bis Minuten.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Zero-Downtime nur mit zwei Sites/ARR.

### H10 Build-Tooling (Node/npm, .NET SDK) auf Entwicklungsrechnern erlaubt?

- **Antworttyp:** single – `ja` Ja · `eingeschraenkt` Eingeschränkt (Whitelist) · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Tailwind/Bundler laufen ausschließlich zur Build-Zeit – irgendwo muss das erlaubt sein.
- **GUI-/Menüpfad:** Software-Whitelist
- **Lesender Befehl (cmd):**

```
node -v; dotnet --version
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Nein → CI-Server oder vorgefertigtes CSS ohne Tailwind (plain CSS).

### H11 AppLocker / Software Restriction / Signaturpflicht auf dem Server?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Blockiert unsignierte Executables (Kestrel-exe, node.exe, Skripte).
- **GUI-/Menüpfad:** Lokale Sicherheitsrichtlinie → Anwendungssteuerungsrichtlinien
- **Lesender Befehl (powershell):**

```powershell
Get-AppLockerPolicy -Effective -ErrorAction SilentlyContinue | Select-Object -ExpandProperty RuleCollections | Select-Object RuleCollectionType, EnforcementMode
```

- **Erwartbare Ergebnisse:** Leer = keine AppLocker-Richtlinie.
- **Architekturauswirkung:** Ja → Deployment-Pfade freigeben oder signieren lassen (IT).

### H12 Antivirus-Ausnahmen für Anwendungs-/Upload-Ordner möglich?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Echtzeitscanner verzögern Deployments und Uploads, sperren Dateien.
- **GUI-/Menüpfad:** AV-Konsole IT
- **Lesender Befehl (powershell):**

```powershell
Get-MpPreference -ErrorAction SilentlyContinue | Select-Object -ExpandProperty ExclusionPath
```

- **Erwartbare Ergebnisse:** Ausnahmen für inetpub/Apps.
- **Architekturauswirkung:** Keine → Uploads scannen lassen, Retry-Logik.

## I – Logging / Monitoring / Audit (9)

_Nachvollziehbarkeit im Betrieb und revisionsnahe Speicherung operativer Daten._ Gate: **SERVER**

### I01 Zugriff des App-Teams auf IIS-Logs

- **Antworttyp:** single – `lesend` Lesend · `per_anfrage` Per Anfrage · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Fehleranalyse ohne Logs ist Raten.
- **GUI-/Menüpfad:** Explorer → inetpub\logs\LogFiles → Sicherheit
- **Lesender Befehl (cmd):**

```
icacls C:\inetpub\logs\LogFiles
```

- **Erwartbare Ergebnisse:** Leserechte-Gruppe.
- **Architekturauswirkung:** Nein → eigenes Request-Logging in der App.

### I02 Darf die Anwendung ins Windows Event Log schreiben (eigene Quelle)?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Standard-Kanal für Betriebsereignisse, von Monitoring auswertbar; Quelle anlegen braucht einmalig Adminrechte.
- **GUI-/Menüpfad:** Ereignisanzeige → Windows-Protokolle → Anwendung
- **Lesender Befehl (powershell):**

```powershell
Get-WinEvent -ListLog Application | Select-Object LogName, MaximumSizeInBytes, LogMode, RecordCount
```

- **Erwartbare Ergebnisse:** LogMode Circular, Größe 20 MB Standard (schnell voll).
- **Architekturauswirkung:** Ja → kritische Ereignisse ins Event Log; Detail-Logs in Datei/DB.

### I03 Zentrales Logging

- **Antworttyp:** single – `splunk` Splunk · `elk` Elastic/OpenSearch · `graylog` Graylog · `sentinel` Microsoft Sentinel/Log Analytics · `seq` Seq · `keins` Keins · `unbekannt` Unbekannt
- **Warum wichtig?** Zentrale Logs vereinfachen Korrelation über Module hinweg.
- **GUI-/Menüpfad:** IT
- **Lesender Befehl (powershell):**

```powershell
Get-Service | Where-Object DisplayName -match 'Splunk|Elastic|Beats|Graylog|Monitoring Agent' | Select-Object Name, Status
```

- **Erwartbare Ergebnisse:** Agent vorhanden?
- **Architekturauswirkung:** Keins → strukturierte Datei-Logs (JSON) mit Rotation; später Anbindung möglich.

### I04 Monitoring/Health Checks/Alarmierung

- **Antworttyp:** single – `prtg` PRTG · `zabbix` Zabbix · `checkmk` checkmk · `scom` SCOM · `anderes` Anderes · `keins` Keins · `unbekannt` Unbekannt
- **Warum wichtig?** Health-Endpunkt (/health) kann direkt überwacht werden.
- **GUI-/Menüpfad:** IT
- **Lesender Befehl (text):**

```
(siehe G07)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Health-Endpunkt in jedem Modul; Alarmierungsweg abstimmen.

### I05 Aufbewahrungsdauer für Logs (Tage)

- **Antworttyp:** number
- **Warum wichtig?** Datenschutz (Minimierung) vs. Nachvollziehbarkeit.
- **GUI-/Menüpfad:** Löschkonzept
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** z. B. 90.
- **Architekturauswirkung:** Rotation und Löschjob entsprechend konfigurieren.

### I06 Darf die Anwendung Logdateien im eigenen Ordner schreiben?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Serilog/NLog-Datei-Logs sind die einfachste Baseline.
- **GUI-/Menüpfad:** Ordner-Sicherheit
- **Lesender Befehl (cmd):**

```
icacls <app-ordner>\logs
```

- **Erwartbare Ergebnisse:** Schreibrecht für App-Pool-Identität.
- **Architekturauswirkung:** Nein → DB-Logging oder Event Log.

### I07 Audit-Anforderungen an operative Daten

- **Antworttyp:** multi – `user_id` Benutzer-ID je Änderung · `timestamp` Zeitstempel · `alt_neu` Alter/neuer Wert · `quelle` Quelle (UI/Import/Job) · `korrektur` Korrekturen nachvollziehbar (kein Überschreiben) · `unveraenderbar` Unveränderbarkeit/Signatur · `unbekannt` Unbekannt
- **Warum wichtig?** Bestimmt Datenmodell: Historientabellen/Event-Log statt Update-in-Place.
- **GUI-/Menüpfad:** Fachbereich/Datenschutz
- **Lesender Befehl (text):**

```
(fachliche Frage)
```

- **Erwartbare Ergebnisse:** Liste.
- **Architekturauswirkung:** Historisierung im Modell (Append-only, gültig-von/bis), keine Geschäftslogik im Dashboard.

### I08 Zeitquelle synchron (NTP) auf Server und DB?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Audit-Zeitstempel müssen vergleichbar sein.
- **GUI-/Menüpfad:** Datum/Uhrzeit
- **Lesender Befehl (cmd):**

```
w32tm /query /status
```

- **Erwartbare Ergebnisse:** Quelle = DC/NTP, Abweichung klein.
- **Architekturauswirkung:** Zeitstempel serverseitig setzen, nie vom Client übernehmen.

### I09 Wer darf personenbezogene Logs/Audit-Daten einsehen?

- **Antworttyp:** text
- **Warum wichtig?** Zugriff auf Audit-Trails ist selbst datenschutzrelevant.
- **GUI-/Menüpfad:** Datenschutzkonzept
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Rollen.
- **Architekturauswirkung:** Rollenabhängige Ansichten; Audit-Zugriff protokollieren.

## J – Sicherheit / Datenschutz (12)

_Netz, Zugriff, MFA, TLS, personenbezogene Daten, Freigaben. Keine Sicherheitsmechanismen umgehen._ Gate: **SECURITY**

### J01 Netzsegmentierung: Segment des Webservers, der DB, der Clients

- **Antworttyp:** text
- **Warum wichtig?** Bestimmt Firewall-Anträge und ob Clients den IIS direkt erreichen.
- **GUI-/Menüpfad:** Netzplan IT
- **Lesender Befehl (powershell):**

```powershell
Get-NetIPConfiguration | Select-Object InterfaceAlias, IPv4Address, IPv4DefaultGateway
```

- **Erwartbare Ergebnisse:** Server-VLAN, DB-VLAN.
- **Architekturauswirkung:** Alle Pfade Client→IIS→DB in Kapitel L testen.

### J02 Zugriffswege zur Anwendung

- **Antworttyp:** multi – `nur_intern` Nur internes LAN · `vpn` VPN-Client · `mdm_tunnel` MDM-App-Tunnel (MobileIron) · `extern_reverse_proxy` Extern über Reverse Proxy/WAF · `unbekannt` Unbekannt
- **Warum wichtig?** Jeder Weg ist ein eigenes Clientprofil mit eigenen Einschränkungen.
- **GUI-/Menüpfad:** IT-Security
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Liste.
- **Architekturauswirkung:** Pro Weg ein Profil im Client Capability Test.

### J03 MFA-Anforderung

- **Antworttyp:** single – `ad_sso_reicht` AD-SSO/Gerätevertrauen reicht · `mfa_zusaetzlich` Zusätzliche MFA gefordert · `nein` Keine · `unbekannt` Unbekannt
- **Warum wichtig?** MFA in Eigenbau ist unzulässig; muss über IdP (Entra/ADFS) oder VPN/MDM geleistet werden.
- **GUI-/Menüpfad:** IT-Security
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** MFA gefordert → OIDC gegen IdP oder MFA am Tunnel/VPN.

### J04 TLS-/Zertifikatsvorgaben

- **Antworttyp:** multi – `tls12_min` Mind. TLS 1.2 · `tls13` TLS 1.3 gefordert · `interne_ca` Interne CA Pflicht · `hsts` HSTS gefordert · `unbekannt` Unbekannt
- **Warum wichtig?** Siehe C41.
- **GUI-/Menüpfad:** IT-Security-Richtlinie
- **Lesender Befehl (text):**

```
(siehe C41)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Header/Redirects in App; Zertifikatsvertrauen auf MDM-Geräten prüfen.

### J05 Verarbeitete personenbezogene Daten

- **Antworttyp:** multi – `namen` Namen/Kontakt · `funktionen` Funktionen/Rollen · `anwesenheit` Anwesenheit/Zeiten · `gesundheit` Gesundheitsdaten · `standort` Standortdaten · `keine` Keine · `unbekannt` Unbekannt
- **Warum wichtig?** Bestimmt DSFA-Bedarf, Verschlüsselung, Zugriffsbeschränkung, Löschkonzept.
- **GUI-/Menüpfad:** Datenschutzbeauftragter
- **Lesender Befehl (text):**

```
(fachliche Frage)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Besondere Kategorien → Verschlüsselung at rest, strenge Rollen, Audit-Zugriff.

### J06 Vorgaben zum Rollen-/Rechtemodell

- **Antworttyp:** text
- **Warum wichtig?** Rollenabhängige Dashboards ohne Logik im Dashboard.
- **GUI-/Menüpfad:** Fachbereich
- **Lesender Befehl (text):**

```
(fachliche Frage)
```

- **Erwartbare Ergebnisse:** Rollenliste, Datenhoheit.
- **Architekturauswirkung:** Autorisierung serverseitig, Rollen aus AD oder App-DB (B08).

### J07 Aufbewahrungs-/Löschkonzept

- **Antworttyp:** text
- **Warum wichtig?** Operative Daten (Besetzungen) sind personenbezogen und zeitlich befristet aufzubewahren.
- **GUI-/Menüpfad:** Datenschutzkonzept
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Fristen je Datenart.
- **Architekturauswirkung:** Löschjobs + Archivierungsstrategie (Historie anonymisieren).

### J08 Security-Test/Freigabeprozess

- **Antworttyp:** single – `pentest` Pentest Pflicht · `review` Code-/Konfig-Review · `keins` Keins · `unbekannt` Unbekannt
- **Warum wichtig?** Planbar als Meilenstein; beeinflusst Wahl bewährter Frameworks.
- **GUI-/Menüpfad:** IT-Security
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Bewährte Framework-Sicherheitsfunktionen (Anti-Forgery, Auth-Middleware) nutzen.

### J09 Gibt es Vorgaben zu CSP/Security-Headern?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Strikte CSP verbietet Inline-Skripte – relevant für HTMX/Alpine/Tailwind-Setups.
- **GUI-/Menüpfad:** IT-Security
- **Lesender Befehl (powershell):**

```powershell
Invoke-WebRequest https://<bestehende-app>/ -UseBasicParsing | Select-Object -ExpandProperty Headers
```

- **Erwartbare Ergebnisse:** CSP-Header bestehender Apps als Muster.
- **Architekturauswirkung:** Nonce-basierte CSP einplanen; keine Inline-Handler.

### J10 Secrets-Management (Connection Strings, API-Keys)

- **Antworttyp:** single – `config_verschluesselt` Verschlüsselte Konfig (DPAPI/aspnet_regiis) · `env_vars` Umgebungsvariablen am App-Pool · `vault` Vault/Key Vault · `klartext` Klartext in Konfig · `unbekannt` Unbekannt
- **Warum wichtig?** Klartext-Secrets sind Security-Finding; gMSA + integrierte Auth vermeidet Secrets.
- **GUI-/Menüpfad:** IIS → Konfigurations-Editor / Umgebungsvariablen
- **Lesender Befehl (powershell):**

```powershell
Get-ChildItem C:\inetpub -Recurse -Filter appsettings*.json -ErrorAction SilentlyContinue | Select-Object FullName
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Konvention festlegen, vor erstem Release.

### J11 Web-Filter/Proxy/Security-Gateway zwischen Client und IIS?

- **Antworttyp:** single – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Filter können Skripte, WebSockets, große Antworten oder bestimmte MIME-Typen blockieren.
- **GUI-/Menüpfad:** IT-Security
- **Lesender Befehl (text):**

```
(Client-Test im realen Pfad)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Ja → Client Capability Test zwingend über diesen Pfad.

### J12 Explizit verbotene Techniken

- **Antworttyp:** multi – `keine_cdn` Externe CDN-Ressourcen · `kein_websocket` WebSockets · `kein_local_storage` Lokale Speicherung (LocalStorage/IndexedDB) · `kein_pwa` PWA/Service Worker · `keine_kamera` Kamera/Geolocation · `kein_inline_js` Inline-JavaScript · `keine` Keine Verbote bekannt · `unbekannt` Unbekannt
- **Warum wichtig?** Organisatorische Verbote gelten unabhängig von technischer Machbarkeit.
- **GUI-/Menüpfad:** IT-Security-Richtlinie
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Verbote setzen Capability-Status auf ROT (organisatorisch).

## K – Clients (12)

_Browser, Geräte, Richtlinien, Netzabdeckung, Druck._ Gate: **CLIENT**

### K01 Unterstützte Browser

- **Antworttyp:** multi – `edge` Edge (Chromium) · `chrome` Chrome · `firefox` Firefox · `safari_ios` Safari/iOS-WebView · `mdm_browser` MDM-Browser (Web@Work/verwaltet) · `ie11` IE11/IE-Modus · `unbekannt` Unbekannt
- **Warum wichtig?** IE-Modus oder alte WebViews schließen moderne JavaScript-Features aus.
- **GUI-/Menüpfad:** Browser → Hilfe → Info; edge://version
- **Lesender Befehl (cmd):**

```
gpresult /r | findstr /i browser
rem Auf Client: edge://policy und chrome://policy im Browser öffnen
```

- **Erwartbare Ergebnisse:** Liste + Versionen.
- **Architekturauswirkung:** IE11 → nur serverseitiges HTML; sonst Baseline per Client-Test.

### K02 Browser-Versionsstand

- **Antworttyp:** single – `evergreen` Automatisch aktuell (Evergreen) · `eingefroren` Eingefrorene/alte Versionen · `unbekannt` Unbekannt
- **Warum wichtig?** Eingefrorene Versionen begrenzen CSS/JS-Features dauerhaft.
- **GUI-/Menüpfad:** edge://version
- **Lesender Befehl (cmd):**

```
reg query "HKLM\SOFTWARE\Microsoft\Edge\BLBeacon" /v version
```

- **Erwartbare Ergebnisse:** Aktuelle Major-Version.
- **Architekturauswirkung:** Baseline auf ältesten Pflichtbrowser festlegen.

### K03 Zentrale Browserverwaltung (GPO/MDM-Richtlinien)?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Richtlinien können JavaScript, Cookies, Storage, Downloads, Kamera pro Site steuern.
- **GUI-/Menüpfad:** edge://policy
- **Lesender Befehl (cmd):**

```
reg query HKLM\SOFTWARE\Policies\Microsoft\Edge /s
```

- **Erwartbare Ergebnisse:** Richtlinienliste.
- **Architekturauswirkung:** Site-Allowlist für die App beantragen (JavaScriptAllowedForUrls, CookiesAllowedForUrls).

### K04 JavaScript per Richtlinie eingeschränkt?

- **Antworttyp:** single – `erlaubt` Erlaubt · `allowlist` Nur Allowlist · `blockiert` Blockiert · `unbekannt` Unbekannt
- **Warum wichtig?** Kernfrage für Progressive Enhancement.
- **GUI-/Menüpfad:** edge://policy → DefaultJavaScriptSetting / JavaScriptAllowedForUrls
- **Lesender Befehl (cmd):**

```
reg query HKLM\SOFTWARE\Policies\Microsoft\Edge /v DefaultJavaScriptSetting
```

- **Erwartbare Ergebnisse:** 1 = erlaubt, 2 = blockiert.
- **Architekturauswirkung:** Allowlist/blockiert → No-JS-Baseline zwingend (L7).

### K05 Richtlinien zu Cookies, Local Storage, Downloads, Zwischenablage

- **Antworttyp:** text
- **Warum wichtig?** Sessions brauchen Cookies; Downloads/Exports können blockiert sein.
- **GUI-/Menüpfad:** edge://policy
- **Lesender Befehl (cmd):**

```
reg query HKLM\SOFTWARE\Policies\Microsoft\Edge /s | findstr /i "Cookie Download Clipboard"
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Cookie-Blockade → URL-Token/Windows-Auth statt Cookie-Session.

### K06 PWA-Installation erlaubt/gewünscht?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** PWA nur mit HTTPS + Service Worker + Richtlinie.
- **GUI-/Menüpfad:** edge://policy → WebAppInstallForceList
- **Lesender Befehl (text):**

```
(Richtlinie prüfen)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Nein → keine Offline-Annahmen.

### K07 Gerätetypen im Einsatz

- **Antworttyp:** multi – `desktop` Desktop · `notebook` Notebook · `tablet` Tablet · `smartphone` Smartphone · `dashboard_monitor` Großer Dashboard-Monitor · `unbekannt` Unbekannt
- **Warum wichtig?** Jeder Typ = Clientprofil + Layoutanforderung.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Responsive, Touch-Ziele ≥ 44 px, Dashboard-Ansicht ohne Interaktion.

### K08 Dashboard-Monitore: Gerät, Browser/Kiosk, Auflösung, Auto-Login, Neustartverhalten

- **Antworttyp:** text
- **Warum wichtig?** Kiosk-Geräte brauchen automatische Anmeldung und Auto-Refresh ohne Nutzerinteraktion.
- **GUI-/Menüpfad:** Gerät vor Ort
- **Lesender Befehl (text):**

```
(Gerät prüfen)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Dashboard-Rolle mit Lesezugriff, Auto-Refresh per Meta-Refresh/Polling als Fallback.
- **Folgefrage:** wird nur angezeigt, wenn `v => has(v, 'K07', 'dashboard_monitor')`

### K09 Auflösungen, Touch, Bildschirmgrößen

- **Antworttyp:** text
- **Warum wichtig?** Layout-Baseline.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Mobile-first Layout, Tabellen mit horizontalem Scroll.

### K10 Netzabdeckung/Verbindungsabbrüche im Einsatzumfeld

- **Antworttyp:** single – `stabil` Stabil · `teilweise` Teilweise Lücken · `haeufig` Häufige Abbrüche · `unbekannt` Unbekannt
- **Warum wichtig?** Bestimmt Bedarf an Wiederholungslogik, Zwischenspeicherung und Offline-Konzept.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage; Client-Test „Verbindungsabbruch“)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Häufig → kleine Requests, idempotente POSTs, Statusanzeige; Offline nur bei nachgewiesener Storage-Fähigkeit.

### K11 Druck/PDF

- **Antworttyp:** single – `druck_und_pdf` Drucken und PDF-Anzeige · `nur_pdf` Nur PDF-Anzeige · `nichts` Weder noch · `unbekannt` Unbekannt
- **Warum wichtig?** Berichte/Aushänge.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Client-Test „PDF-Anzeige“)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** PDF serverseitig erzeugen; Druck-CSS.

### K12 Benutzergruppen und ihre typischen Clients

- **Antworttyp:** text
- **Warum wichtig?** Bestimmt Pflichtclients für den kleinsten gemeinsamen Nenner.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage)
```

- **Erwartbare Ergebnisse:** z. B. „Führung: Notebook VPN; Einsatzkräfte: iPhone MobileIron“.
- **Architekturauswirkung:** Pflichtprofile im Client-Test markieren.

## L – Zugriffspfad / MobileIron / Tunnel (18)

_Die Ende-zu-Ende-Kette Client → MDM → VPN/Tunnel → Netz → IIS ist eine gleichwertige Systemgrenze. Ergänzt durch den realen Client Capability Test._ Gate: **NETWORK**

### L01 Reale Zugriffspfade (Ende-zu-Ende)

- **Antworttyp:** multi – `intern_lan` Desktop/Notebook intern (LAN/WLAN) · `vpn_client` Notebook über VPN-Client · `mdm_tunnel` Smartphone/Tablet über MobileIron/Ivanti-Tunnel · `atwork_browser` Web@Work / verwalteter Browser · `extern` Extern über Gateway · `unbekannt` Unbekannt
- **Warum wichtig?** Jeder Pfad ist ein Clientprofil, das real getestet werden muss.
- **GUI-/Menüpfad:** MDM-Konsole (Ivanti EPMM) → Konfigurationen
- **Lesender Befehl (text):**

```
(Nachfrage IT/MDM-Admin)
```

- **Erwartbare Ergebnisse:** Liste.
- **Architekturauswirkung:** Für jeden Pfad ein Profil im Client Capability Test anlegen.

### L02 MobileIron/Ivanti-Version (Core/EPMM, Mobile@Work, Web@Work, Tunnel)

- **Antworttyp:** text
- **Warum wichtig?** Alte Web@Work-Versionen nutzen eingeschränkte WebViews; Tunnel-Versionen unterscheiden sich bei WebSocket-Unterstützung.
- **GUI-/Menüpfad:** Gerät: Mobile@Work-App → Einstellungen → Über; iOS: Einstellungen → Allgemein → VPN & Geräteverwaltung; MDM-Admin: EPMM-Konsole → Einstellungen → Info
- **Lesender Befehl (text):**

```
(am Gerät ablesen)
```

- **Erwartbare Ergebnisse:** Versionen.
- **Architekturauswirkung:** Ergebnis nur zusammen mit realem Test belastbar.
- **Folgefrage:** wird nur angezeigt, wenn `v => has(v, 'L01', 'mdm_tunnel') || has(v, 'L01', 'atwork_browser') || has(v, 'J02', 'mdm_tunnel')`

### L03 Browser innerhalb der MDM-Umgebung

- **Antworttyp:** single – `web_at_work` Web@Work (eigener Browser) · `managed_edge` Verwalteter Edge · `managed_chrome` Verwalteter Chrome · `safari_per_app_vpn` Safari mit Per-App-VPN · `unbekannt` Unbekannt
- **Warum wichtig?** Web@Work ist eine WebView mit eigenen Regeln (kein Service Worker, eingeschränkte Downloads möglich).
- **GUI-/Menüpfad:** Gerät: App-Liste; MDM-Admin: App-Katalog
- **Lesender Befehl (text):**

```
(am Gerät ablesen; User-Agent im Client-Test)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Baseline nur nach Test in genau diesem Browser.
- **Folgefrage:** wird nur angezeigt, wenn `v => has(v, 'L01', 'mdm_tunnel') || has(v, 'L01', 'atwork_browser')`

### L04 Tunnel-Art auf Mobilgeräten

- **Antworttyp:** single – `per_app_vpn` Per-App-VPN · `device_vpn` Geräte-VPN · `app_tunnel_proxy` AppTunnel/HTTP-Proxy (Sentry) · `unbekannt` Unbekannt
- **Warum wichtig?** HTTP-Proxy-Tunnel (Sentry/AppTunnel) unterstützen WebSockets/SSE oft nicht oder mit Timeouts.
- **GUI-/Menüpfad:** MDM-Konsole → Tunnel-/Sentry-Konfiguration
- **Lesender Befehl (text):**

```
(Nachfrage MDM-Admin)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Proxy-Tunnel → Realtime nur nach Test; Polling als Fallback.
- **Folgefrage:** wird nur angezeigt, wenn `v => has(v, 'L01', 'mdm_tunnel') || has(v, 'L01', 'atwork_browser')`

### L05 Unterschiede Desktop / Notebook / Tablet / Smartphone im Zugriff

- **Antworttyp:** text
- **Warum wichtig?** Verschiedene Auth, Proxys, Filter je Gerät.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Profile im Client-Test.

### L06 Clientprofile je Benutzergruppe (welche Gruppe nutzt welchen Pfad?) und Pflichtclients

- **Antworttyp:** text
- **Warum wichtig?** Der kleinste gemeinsame Nenner wird über Pflichtclients gebildet.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(Nachfrage)
```

- **Erwartbare Ergebnisse:** Tabelle Gruppe → Profil → Pflicht ja/nein.
- **Architekturauswirkung:** Pflicht-Profile im Client-Test markieren.

### L07 JavaScript-Einschränkungen durch MDM-/Browser-Richtlinien

- **Antworttyp:** single – `keine` Keine bekannt · `teilweise` Teilweise (Allowlist/Filter) · `blockiert` Blockiert · `unbekannt` Unbekannt
- **Warum wichtig?** Kernfrage für die Frontend-Baseline.
- **GUI-/Menüpfad:** MDM-Konsole → Web@Work-/Browser-Konfiguration
- **Lesender Befehl (text):**

```
(Client-Test „JavaScript“)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Unbekannt → Client-Test zwingend vor Frontend-Entscheidung.

### L08 Einschränkungen: Downloads, Uploads, Kamera, Zwischenablage, lokale Speicherung

- **Antworttyp:** multi – `download_block` Downloads blockiert · `upload_block` Uploads blockiert · `kamera_block` Kamera blockiert · `clipboard_block` Zwischenablage eingeschränkt · `storage_block` Lokale Speicherung eingeschränkt · `keine` Keine bekannt · `unbekannt` Unbekannt
- **Warum wichtig?** DLP-Richtlinien in MDM greifen unabhängig vom Browser-Feature-Support.
- **GUI-/Menüpfad:** MDM-Konsole → Sicherheitsrichtlinien/DLP
- **Lesender Befehl (text):**

```
(Client-Test + Nachfrage)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Blockiert → Funktionen serverseitig lösen (PDF per Mail statt Download).

### L09 Externe Ressourcen, Proxys, Webfilter, CSP, Security-Gateways im Pfad

- **Antworttyp:** multi – `webfilter` Webfilter/Proxy · `kein_extern` Kein Zugriff auf externe Hosts · `gateway_csp` Gateway setzt/ändert Header (CSP) · `tls_inspection` TLS-Inspektion · `keine` Keine bekannt · `unbekannt` Unbekannt
- **Warum wichtig?** TLS-Inspektion bricht Zertifikats-Pinning/Ws; Header-Manipulation bricht Skripte.
- **GUI-/Menüpfad:** IT-Security
- **Lesender Befehl (text):**

```
(Client-Test „externe Ressourcen“, „CDN“)
```

- **Erwartbare Ergebnisse:** —
- **Architekturauswirkung:** Self-hosted Assets; keine CDN-Abhängigkeit.

### L10 Wer stellt Testgeräte je Profil bereit und wann?

- **Antworttyp:** text
- **Warum wichtig?** Ohne reale Tests bleibt das CLIENT-Gate GRAU und die Frontend-Entscheidung unzulässig.
- **GUI-/Menüpfad:** —
- **Lesender Befehl (text):**

```
(organisatorische Frage)
```

- **Erwartbare Ergebnisse:** Name, Termin.
- **Architekturauswirkung:** Blocker für Gate CLIENT.

### L11 Vertraut die MDM-Umgebung dem Zertifikat des Webservers (interne CA)?

- **Antworttyp:** ynu – `ja` Ja · `nein` Nein · `unbekannt` Unbekannt
- **Warum wichtig?** Nicht vertraute Zertifikate blockieren in WebViews jede Verbindung ohne Dialog.
- **GUI-/Menüpfad:** Gerät: HTTPS-Site öffnen; MDM: Zertifikatsprofil
- **Lesender Befehl (text):**

```
(Client-Test öffnet Seite über HTTPS)
```

- **Erwartbare Ergebnisse:** Seite lädt ohne Warnung.
- **Architekturauswirkung:** Nein → Root-CA per MDM verteilen (IT-Aufgabe) vor Rollout.
- **Folgefrage:** wird nur angezeigt, wenn `v => v('C06') === 'interne_ca' || v('C06') === 'selbstsigniert'`

### L20 No-JS-Baseline: Navigation möglich?

- **Antworttyp:** single – `ja` Ja, ohne JavaScript nutzbar · `eingeschraenkt` Eingeschränkt · `nein` Nein · `unbekannt` Nicht geprüft
- **Warum wichtig?** Links und Menüs müssen ohne Skript funktionieren.
- **GUI-/Menüpfad:** Testmodus: /clienttest/nojs.html öffnen (JavaScript im Browser deaktivieren oder Seite ohne Skripte bewerten)
- **Lesender Befehl (text):**

```
(manueller Test)
```

- **Erwartbare Ergebnisse:** Bewertung anhand der No-JS-Testseite und der geplanten Kernoberfläche.
- **Architekturauswirkung:** Server-Routing, keine JS-Router.

### L21 No-JS-Baseline: Anmeldung möglich?

- **Antworttyp:** single – `ja` Ja, ohne JavaScript nutzbar · `eingeschraenkt` Eingeschränkt · `nein` Nein · `unbekannt` Nicht geprüft
- **Warum wichtig?** Login als klassisches POST-Formular oder Windows-Auth.
- **GUI-/Menüpfad:** Testmodus: /clienttest/nojs.html öffnen (JavaScript im Browser deaktivieren oder Seite ohne Skripte bewerten)
- **Lesender Befehl (text):**

```
(manueller Test)
```

- **Erwartbare Ergebnisse:** Bewertung anhand der No-JS-Testseite und der geplanten Kernoberfläche.
- **Architekturauswirkung:** Kein JS-only-Login (kein SPA-Token-Flow ohne Fallback).

### L22 No-JS-Baseline: Formulare nutzbar (Erfassen/Ändern)?

- **Antworttyp:** single – `ja` Ja, ohne JavaScript nutzbar · `eingeschraenkt` Eingeschränkt · `nein` Nein · `unbekannt` Nicht geprüft
- **Warum wichtig?** Kernfunktion: Besetzung bestätigen.
- **GUI-/Menüpfad:** Testmodus: /clienttest/nojs.html öffnen (JavaScript im Browser deaktivieren oder Seite ohne Skripte bewerten)
- **Lesender Befehl (text):**

```
(manueller Test)
```

- **Erwartbare Ergebnisse:** Bewertung anhand der No-JS-Testseite und der geplanten Kernoberfläche.
- **Architekturauswirkung:** GET/POST-Formulare mit serverseitiger Validierung.

### L23 No-JS-Baseline: Daten speichern möglich?

- **Antworttyp:** single – `ja` Ja, ohne JavaScript nutzbar · `eingeschraenkt` Eingeschränkt · `nein` Nein · `unbekannt` Nicht geprüft
- **Warum wichtig?** POST → Redirect → GET.
- **GUI-/Menüpfad:** Testmodus: /clienttest/nojs.html öffnen (JavaScript im Browser deaktivieren oder Seite ohne Skripte bewerten)
- **Lesender Befehl (text):**

```
(manueller Test)
```

- **Erwartbare Ergebnisse:** Bewertung anhand der No-JS-Testseite und der geplanten Kernoberfläche.
- **Architekturauswirkung:** PRG-Muster; keine Fetch-Pflicht.

### L24 No-JS-Baseline: Tabellen/Listen lesbar?

- **Antworttyp:** single – `ja` Ja, ohne JavaScript nutzbar · `eingeschraenkt` Eingeschränkt · `nein` Nein · `unbekannt` Nicht geprüft
- **Warum wichtig?** Serverseitig gerenderte Tabellen, Paginierung per Link.
- **GUI-/Menüpfad:** Testmodus: /clienttest/nojs.html öffnen (JavaScript im Browser deaktivieren oder Seite ohne Skripte bewerten)
- **Lesender Befehl (text):**

```
(manueller Test)
```

- **Erwartbare Ergebnisse:** Bewertung anhand der No-JS-Testseite und der geplanten Kernoberfläche.
- **Architekturauswirkung:** Keine JS-Tabellenbibliothek im Kern.

### L25 No-JS-Baseline: Fehler verständlich?

- **Antworttyp:** single – `ja` Ja, ohne JavaScript nutzbar · `eingeschraenkt` Eingeschränkt · `nein` Nein · `unbekannt` Nicht geprüft
- **Warum wichtig?** Serverseitige Fehlermeldungen im HTML.
- **GUI-/Menüpfad:** Testmodus: /clienttest/nojs.html öffnen (JavaScript im Browser deaktivieren oder Seite ohne Skripte bewerten)
- **Lesender Befehl (text):**

```
(manueller Test)
```

- **Erwartbare Ergebnisse:** Bewertung anhand der No-JS-Testseite und der geplanten Kernoberfläche.
- **Architekturauswirkung:** Validierungs-Summary im Markup.

### L26 No-JS-Baseline: Wesentliche operative Informationen abrufbar?

- **Antworttyp:** single – `ja` Ja, ohne JavaScript nutzbar · `eingeschraenkt` Eingeschränkt · `nein` Nein · `unbekannt` Nicht geprüft
- **Warum wichtig?** Dashboard-Grundansicht muss ohne Skript lesbar sein (Meta-Refresh).
- **GUI-/Menüpfad:** Testmodus: /clienttest/nojs.html öffnen (JavaScript im Browser deaktivieren oder Seite ohne Skripte bewerten)
- **Lesender Befehl (text):**

```
(manueller Test)
```

- **Erwartbare Ergebnisse:** Bewertung anhand der No-JS-Testseite und der geplanten Kernoberfläche.
- **Architekturauswirkung:** Dashboard als statisches HTML mit Auto-Refresh, JS nur Komfort.

## Client Capability Tests (L2)

| ID | Test | Gruppe |
|---|---|---|
| html5 | HTML5-Grundfunktionen | Basis |
| css_local | CSS / lokales Stylesheet | Basis |
| font_local | Lokale Fonts | Basis |
| icon_local | Lokale Icons (SVG) | Basis |
| js_basic | JavaScript grundsätzlich | JavaScript |
| es_modern | Moderne JS-Sprachfeatures (ES2020+) | JavaScript |
| dom | DOM-Manipulation | JavaScript |
| secure_context | Sicherer Kontext (HTTPS) | Basis |
| form_get | Klassisches GET-Formular | Formulare |
| form_post | Klassisches POST-Formular | Formulare |
| xhr | XMLHttpRequest | Netzwerk |
| fetch | Fetch API | Netzwerk |
| fetch_post | API-/Fetch-POST (JSON) | Netzwerk |
| internal_api | Interner API-Aufruf | Netzwerk |
| cookie | Cookies (JS + Session-Cookie) | Speicher |
| cookie_samesite | SameSite-Verhalten | Speicher |
| localstorage | LocalStorage | Speicher |
| sessionstorage | SessionStorage | Speicher |
| indexeddb | IndexedDB | Speicher |
| websocket | WebSockets | Realtime |
| sse | Server-Sent Events | Realtime |
| serviceworker | Service Worker | PWA |
| pwa | PWA-Funktionen (Manifest) | PWA |
| upload | Datei-Upload | Dateien |
| upload_multi | Mehrfach-Upload | Dateien |
| download | Download | Dateien |
| pdf | PDF-Anzeige | Dateien |
| clipboard | Clipboard API | Geräte-APIs |
| camera | Kamera / MediaDevices | Geräte-APIs |
| geolocation | Geolocation | Geräte-APIs |
| webcrypto | WebCrypto | Geräte-APIs |
| cors | CORS (Cross-Origin-Request) | Extern |
| external_https | Externe HTTPS-Ressource | Extern |
| cdn | CDN-Ressource | Extern |
| long_request | Langer Request / Timeout | Netz/Tunnel |
| big_response | Größere Antwort (2 MB) | Netz/Tunnel |
| connection_drop | Verhalten bei Verbindungsabbruch | Netz/Tunnel |
| session_lifetime | Session-Lebensdauer | Netz/Tunnel |
