Il dominio «Secure Windows Server infrastructure» pesa il 10-15% di AZ-802, ed è il dominio in cui l’esame smette di chiedere che cos’è un controllo e comincia a chiedere in quale modalità, con quale parametro e a quale livello lo configuri. Sapere che Credential Guard esiste non basta: serve sapere che cosa rompe quando si accende da solo, e che cosa si fa al posto di spegnerlo.
Exploit protection: prima si misura, poi si forza
Exploit protection è l’erede di EMET e applica process mitigation a livello di sistema o per singolo eseguibile. DEP, SEHOP (a 64 bit) e validate heap integrity sono già attive di default; le altre si aggiungono a mano. Le mitigazioni più invasive — prima fra tutte Arbitrary Code Guard (ACG), che impedisce al processo di generare o modificare codice dinamico — rompono facilmente le applicazioni line-of-business, quindi il percorso documentato è sempre audit mode prima, enforcement dopo:
Set-ProcessMitigation -Name C:\Apps\LOB.exe -Enable AuditDynamicCode
Ogni mitigazione ha un parametro di audit dedicato, e non è il nome della mitigazione:
| Mitigazione | Parametro di audit |
|---|---|
| Arbitrary Code Guard (ACG) | AuditDynamicCode |
| Block low integrity images | AuditImageLoad |
| Block untrusted fonts | AuditFont, FontAuditOnly |
| Code integrity guard | AuditMicrosoftSigned, AuditStoreSigned |
| Disable Win32k system calls | AuditSystemCall |
| Don’t allow child processes | AuditChildProcess |
Gli eventi finiscono nel log Security-Mitigations (Kernel Mode/User Mode): ID 1 per l’audit di ACG, 3 per i processi figli, 5 per le low integrity images, 7 per le remote images, 9 per le chiamate win32k, 11 per code integrity guard. Per passare da un server pilota al parco intero si esporta la configurazione in XML con Get-ProcessMitigation -RegistryConfigFilePath e la si distribuisce con la Group Policy Use a common set of exploit protection settings, che punta al file XML. Due dettagli che l’esame ama: i servizi (di sistema e di rete) sono fuori scope per exploit protection, e le vecchie mitigazioni EAF, IAF, SimExec, CallerCheck e StackPivot sono deprecate — ACG le sostituisce.
App Control for Business: la domanda vera è il rule level
AppLocker e WDAC sono confluiti in App Control for Business. Generando una policy da un reference server con New-CIPolicy, la scelta che conta è -Level (con -Fallback per ciò che il livello primario non riesce a fidarsi).
| Livello | Ancora la fiducia a | Costo di manutenzione |
|---|---|---|
Hash |
hash Authenticode del singolo binario | altissimo: ogni patch invalida la regola |
FileName |
nome originale del file | basso, ma sicurezza debole |
FilePublisher |
publisher + nome file + versione minima | medio |
Publisher |
PCA certificate + CN del certificato leaf | basso: sopravvive agli aggiornamenti |
LeafCertificate |
certificato di firma finale | medio: i leaf scadono presto |
PcaCertificate |
certificato più alto della catena raccolta | basso, molto permissivo |
WHQL, WHQLPublisher |
firma Windows Hardware Qualification Lab | per i binari kernel |
Lo scenario classico — agent firmati da pochi vendor e aggiornati ogni mese, più un’applicazione interna non firmata — si risolve con -Level Publisher -Fallback Hash: il publisher resta lo stesso dopo ogni patch, quindi la policy non va rifatta, mentre l’hash copre l’unico binario senza firma. L’opzione di policy 3 Enabled:Audit Mode è presente di default: l’enforcement non si «attiva», si ottiene rimuovendo quell’opzione (Set-RuleOption -Option 3 -Delete) e convertendo l’XML in binario con ConvertFrom-CIPolicy. Gli eventi sono nel log CodeIntegrity: 3076 in audit, 3077 in blocco. Attenzione anche alle regole FilePath: valgono solo per il codice user-mode e, di default, solo per percorsi scrivibili dai soli amministratori.
Credential Guard e LSA protection: due cose diverse
Su Windows Server 2025 Credential Guard è abilitato per impostazione predefinita su tutti i server domain-joined che non sono domain controller, a meno che non sia stato esplicitamente disabilitato prima dell’upgrade. Da qui il guasto più citato: dopo l’aggiornamento di due host Hyper-V standalone, la live migration smette di funzionare. La causa non è Hyper-V: fino a Windows Server 2022 la live migration senza cluster usa CredSSP, e con Credential Guard attivo CredSSP non può più usare credenziali salvate o SSO. La soluzione documentata è configurare la Kerberos constrained delegation (o la resource-based constrained delegation) fra i due host, non disabilitare Credential Guard. Nella stessa famiglia di rotture: unconstrained delegation, DES, NTLMv1 e MS-CHAP in SSO, WDigest.
La LSA protection (LSASS come Protected Process Light) è un controllo complementare, non un’alternativa. Su Windows Server 2022 la policy ADMX «Configures LSASS to run as a protected process» non è disponibile (arriva con Windows 11 22H2), quindi il modo per farlo con un solo GPO è una Group Policy Preference di registro su HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa, valore RunAsPPL di tipo REG_DWORD: 1 memorizza la configurazione in una variabile UEFI (UEFI lock: non si disfa più dal registro, serve il tool di opt-out), 2 la abilita senza variabile UEFI ed è applicato solo da Windows 11 22H2 in avanti. Si verifica con l’evento WinInit 12 nel log System: LSASS.exe was started as a protected process with level: 4. Prima di forzarla, l’audit si accende con AuditLevel = 8 sotto Image File Execution Options per lsass.exe e produce gli eventi CodeIntegrity 3065 e 3066 per i plug-in non firmati Microsoft.
OSConfig: baseline con drift control, ma solo su Windows Server 2025
OSConfig non supporta versioni precedenti a Windows Server 2025. È questo il discrimine quando il parco è misto: sui 2019 e 2022 restano Security Compliance Toolkit e GPO. Si installa il modulo con Install-Module -Name Microsoft.OSConfig -Scope AllUsers e si applica lo scenario che corrisponde al ruolo della macchina:
| Ruolo | Scenario |
|---|---|
| Domain controller | SecurityBaseline/WindowsServer/2025/DomainController |
| Member server (domain-joined) | SecurityBaseline/WindowsServer/2025/MemberServer |
| Workgroup member | SecurityBaseline/WindowsServer/2025/WorkgroupMember |
Set-OSConfigDesiredConfiguration -Scenario SecurityBaseline/WindowsServer/2025/MemberServer -Default
Il valore aggiunto rispetto a una GPO è il drift control: dopo l’applicazione OSConfig riporta da solo le impostazioni deviate al valore desiderato, senza che tu configuri niente d’altro. Si verifica con Get-OSConfigDesiredConfiguration, si personalizza con -Setting e -Value mantenendo il drift control, si rimuove con Remove-OSConfigDesiredConfiguration; applicazione e rimozione richiedono il riavvio. Esistono scenari companion indipendenti: SecuredCore, Defender/Antivirus/WindowsServer/2025 e LAPS/WindowsServer/2025/MemberServer. Conseguenza operativa da ricordare: se la stessa impostazione arriva da OSConfig e da una GPO, i due valori si rincorrono — una delle due sorgenti va tolta.
Windows LAPS e Group Policy
Windows LAPS è in-box: nativo su Windows Server 2025 e disponibile su 2019 e 2022 a partire dall’aggiornamento dell’11 aprile 2023; il vecchio prodotto Microsoft LAPS (MSI separato) è deprecato. Ruota la password dell’amministratore locale e la salva o in AD DS o in Microsoft Entra ID — mai in entrambi — e sui domain controller può gestire la password DSRM. La legacy emulation mode legge le vecchie GPO, ma scrive la password in AD in chiaro: niente cifratura, niente password history.
Le impostazioni di sistema di questo dominio restano quasi tutte Group Policy: l’XML di exploit protection, il valore RunAsPPL, il deploy delle policy App Control e SmartScreen, che si configura in Windows Components > Windows Defender SmartScreen > Explorer > Configure Windows Defender SmartScreen scegliendo fra avviso semplice e Warn and prevent bypass (l’utente non può ignorare il blocco), più le voci corrispondenti sotto Microsoft Edge > SmartScreen settings. SmartScreen valuta la reputazione di contenuti provenienti da Internet: non protegge file su share UNC o SMB interne.
Firewall e connection security rules
Una firewall rule decide chi passa; una connection security rule decide come i due peer si autenticano (IPsec) e da sola non consente né blocca nulla. Per la domain isolation la coppia di parametri è tutta la risposta:
New-NetIPsecRule -DisplayName "Domain Isolation" -InboundSecurity Require -OutboundSecurity Request -PolicyStore contoso.com\Domain_Isolation
Require in ingresso scarta le connessioni da peer che non autenticano con IPsec; Request in uscita tenta l’autenticazione ma lascia riuscire il traffico verso dispositivi che non la supportano. Sulla precedenza: un allow esplicito batte il blocco di default, un block esplicito batte qualsiasi allow in conflitto, e fra regole non in conflitto vince la più specifica. Windows Firewall non supporta un ordinamento pesato assegnato dall’amministratore.
Trappole tipiche d’esame
- ACG da validare su un’app LOB prima di forzarla:
Set-ProcessMitigation -Name <percorso> -Enable AuditDynamicCodee eventi Security-Mitigations ID 1. La trappola è cercare-Auditcome parametro, o-Enable DynamicCode, che invece la applica subito. - Policy App Control da un reference server con software firmato e patchato ogni mese:
-Level Publisher(con-Fallback Hashper l’app interna non firmata).HasheFilePublisherobbligano a rigenerare la policy a ogni aggiornamento. - Live migration rotta dopo l’upgrade a Windows Server 2025: è Credential Guard abilitato di default che blocca CredSSP; si configura la Kerberos constrained delegation, non si disattiva Credential Guard e non si tocca il virtual switch.
- LSASS come protected process con un solo GPO su Server 2022 con UEFI e Secure Boot: GPP di registro
RunAsPPL= 1 (con UEFI lock). Il valore 2 non è applicato su quel sistema, e la policy ADMX «Configures LSASS to run as a protected process» lì non c’è. - Baseline Microsoft per ruolo con correzione automatica delle deviazioni: OSConfig con lo scenario del ruolo e
-Default— ma solo sui Windows Server 2025; per i 2019/2022 della stessa foresta serve un’altra strada. - Mantenere l’EDR di Defender for Endpoint su alcune VM senza il Plan 2 della subscription: si configura Plan 1 a livello di risorsa (REST API
pricingsconsubPlanP1, script o Azure Policy «granular pricing» su tag). A livello di risorsa si può abilitare solo il Plan 1; il Plan 2 si può solo disabilitare. E ricorda che JIT VM access richiede il Plan 2, e che Defender for Servers non si appoggia più al Log Analytics agent né all’Azure Monitor Agent per la maggior parte delle funzioni. - Inbound solo da peer autenticati ma outbound libero:
-InboundSecurity Require -OutboundSecurity Request. Invertirli, o mettereRequiresu entrambi, è l’errore che l’esame propone come distrattore plausibile.