Howto: NLA (Network Level Authentication) pentru RDP
Scop: Înțelegerea și configurarea NLA pentru conexiuni RDP sigure și funcționalitate "Remember me".
Ce este NLA?
Network Level Authentication (NLA) este un mecanism de securitate pentru RDP care autentifică utilizatorul ÎNAINTE de a crea sesiunea grafică pe server.
NLA folosește CredSSP (Credential Security Support Provider) pentru a transmite credențialele securizat înainte de stabilirea sesiunii RDP complete.
Fără NLA vs Cu NLA
Fără NLA (vechi, nesigur)
┌─────────────┐ ┌─────────────┐
│ Client │ │ Server │
│ Windows │ │ RDP │
└──────┬──────┘ └──────┬──────┘
│ │
│ 1. Conectare TCP port 3389 │
│───────────────────────────────────────►│
│ │
│ 2. Server trimite ecran de login │ ← Sesiune grafică
│◄───────────────────────────────────────│ creată ÎNAINTE
│ │ de autentificare
│ 3. Utilizator introduce user/pass │
│───────────────────────────────────────►│
│ │
│ 4. Server verifică credențialele │
│◄───────────────────────────────────────│
│ │
│ 5. Acces acordat sau refuzat │
│◄───────────────────────────────────────│
Probleme:
- Serverul alocă resurse (memorie, CPU) ÎNAINTE să știe cine ești
- Ecranul de login Windows e expus în rețea
- Vulnerabil la atacuri DoS (Denial of Service)
- Vulnerabil la atacuri de tip "man-in-the-middle"
Cu NLA (modern, sigur)
┌─────────────┐ ┌─────────────┐
│ Client │ │ Server │
│ Windows │ │ RDP │
└──────┬──────┘ └──────┬──────┘
│ │
│ 1. Conectare TCP port 3389 │
│───────────────────────────────────────►│
│ │
│ 2. Negociere CredSSP │
│◄──────────────────────────────────────►│
│ │
│ 3. Client cere credențiale LOCAL │
│ ┌─────────────────────────────┐ │
│ │ Windows Security │ │
│ │ ┌─────────────────────┐ │ │
│ │ │ Username: █ │ │ │
│ │ │ Password: **** │ │ │
│ │ │ ☑ Remember me │ │ │
│ │ └─────────────────────┘ │ │
│ └─────────────────────────────┘ │
│ │
│ 4. Credențiale criptate via CredSSP │
│───────────────────────────────────────►│
│ │
│ 5. Server validează (AD/local) │
│◄───────────────────────────────────────│
│ │
│ 6. DOAR ACUM se creează sesiunea │ ← Sesiune după
│◄───────────────────────────────────────│ autentificare
Avantaje:
- Fără credențiale valide = fără acces la nimic
- Resurse server alocate doar utilizatorilor autentificați
- Dialogul apare LOCAL → poate salva parola în Credential Manager
- Protecție împotriva DoS și MITM
Tabel comparativ
| Aspect | Fără NLA | Cu NLA |
|---|---|---|
| Autentificare | După conectare | Înainte de conectare |
| Dialog login | Pe server (grafic RDP) | Pe client (local) |
| Consum resurse server | De la început | Doar după auth |
| "Remember me" funcționează | ❌ Nu | ✅ Da |
| Credential Manager | ❌ Nu poate salva | ✅ Salvează parola |
| Protecție DoS | ❌ Vulnerabil | ✅ Protejat |
| Protecție MITM | ❌ Slab | ✅ CredSSP/TLS |
| Cerință minimă client | Windows XP | Windows XP SP3+ |
| Recomandat | ❌ Nu | ✅ Da |
De ce contează NLA pentru "Remember me"?
Cu NLA, dialogul de autentificare apare pe clientul local (Windows-ul utilizatorului), nu pe server:
┌─────────────────────────────────────┐
│ Windows Security │
├─────────────────────────────────────┤
│ │
│ Enter your credentials │
│ │
│ ┌───────────────────────────────┐ │
│ │ MISAVAN\ion.popescu │ │
│ └───────────────────────────────┘ │
│ │
│ ┌───────────────────────────────┐ │
│ │ ●●●●●●●●●●●● │ │
│ └───────────────────────────────┘ │
│ │
│ ☑ Remember me │ ← Checkbox local!
│ │
│ ┌─────────┐ ┌──────────────┐ │
│ │ OK │ │ Cancel │ │
│ └─────────┘ └──────────────┘ │
└─────────────────────────────────────┘
Când bifează "Remember me":
- Windows salvează credențialele în Credential Manager
- La următoarea conectare, nu mai cere parola
- Parola e stocată securizat, criptat local
Verificare Credential Manager
Control Panel → Credential Manager → Windows Credentials
Sau PowerShell:
cmdkey /list | findstr "TERMSRV"
Va afișa ceva de genul:
Target: TERMSRV/192.168.254.232
Type: Domain Password
User: MISAVAN\ion.popescu
Configurare NLA pe Server
Windows Server (GUI)
- Deschide System Properties (
sysdm.cpl) - Tab Remote
- Bifează:
☑ Allow connections only from computers running Remote Desktop with Network Level Authentication
Windows Server (PowerShell)
Verificare stare actuală:
Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name UserAuthentication
# UserAuthentication = 1 → NLA activat
# UserAuthentication = 0 → NLA dezactivat
Activare NLA:
Set-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name UserAuthentication -Value 1
Dezactivare NLA (nu se recomandă):
Set-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name UserAuthentication -Value 0
Via Group Policy
Computer Configuration
→ Administrative Templates
→ Windows Components
→ Remote Desktop Services
→ Remote Desktop Session Host
→ Security
→ "Require user authentication for remote connections by using NLA"
→ Enabled
Parametri RDP relevanți
authentication level
Controlează comportamentul clientului când NLA nu e disponibil:
authentication level:i:2
| Valoare | Comportament |
|---|---|
| 0 | Conectare chiar dacă autentificarea serverului eșuează (nesigur) |
| 1 | Warning dacă autentificarea serverului eșuează, utilizatorul decide |
| 2 | Nu te conecta dacă serverul nu poate fi autentificat (recomandat) |
enablecredsspsupport
Activează/dezactivează CredSSP (necesar pentru NLA):
enablecredsspsupport:i:1
| Valoare | Comportament |
|---|---|
| 0 | CredSSP dezactivat (NLA nu funcționează) |
| 1 | CredSSP activat (recomandat) |
prompt for credentials
Controlează când se cer credențialele:
prompt for credentials:i:1
| Valoare | Comportament |
|---|---|
| 0 | Nu cere credențiale (folosește SSO/Kerberos) |
| 1 | Cere credențiale (dialog local cu "Remember me") |
Combinații recomandate
Pentru "Remember me" (salvare parolă)
prompt for credentials:i:1
authentication level:i:2
enablecredsspsupport:i:1
Utilizatorul:
- Introduce user/pass la prima conectare
- Bifează "Remember me"
- Conectările ulterioare sunt automate
Pentru SSO (Single Sign-On)
prompt for credentials:i:0
authentication level:i:2
enablecredsspsupport:i:1
Plus GPO pe clienți pentru Credentials Delegation.
Utilizatorul nu introduce nicio parolă - se folosesc credențialele de logon Windows.
Troubleshooting NLA
Eroare: "The remote computer requires Network Level Authentication"
Cauză: Clientul nu suportă NLA sau CredSSP e dezactivat.
Soluții:
# Verifică CredSSP pe client
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters' -Name AllowEncryptionOracle -ErrorAction SilentlyContinue
# Dacă e setat pe 2 (Vulnerable), schimbă în 0 sau 1
Eroare: "An authentication error has occurred" / "CredSSP encryption oracle remediation"
Cauză: Mismatch între politicile CredSSP pe client și server după patch-uri de securitate.
Soluție temporară (nu se recomandă pentru producție):
Computer Configuration
→ Administrative Templates
→ System
→ Credentials Delegation
→ "Encryption Oracle Remediation"
→ Enabled → "Vulnerable"
Soluție corectă: Aplică patch-urile de securitate pe ambele (client și server).
Eroare: "Your credentials did not work"
Cauze posibile:
- Parolă greșită
- Username greșit (verifică formatul:
DOMAIN\usersauuser@domain.local) - Cont blocat în AD
- Serverul nu e în domeniu sau nu poate contacta DC
Verificare:
# Pe server, verifică dacă poate contacta DC
nltest /dsgetdc:MISAVAN
# Verifică dacă contul e blocat
Get-ADUser username -Properties LockedOut
"Remember me" nu apare
Cauze:
- NLA dezactivat pe server
- GPO blochează salvarea parolelor
Verificare GPO:
Computer Configuration
→ Administrative Templates
→ Windows Components
→ Remote Desktop Services
→ Remote Desktop Connection Client
→ "Do not allow passwords to be saved"
→ Trebuie să fie "Disabled" sau "Not Configured"
Parola salvată, dar tot cere la conectare
Cauze:
- Certificatul serverului s-a schimbat
- Adresa s-a schimbat (IP vs hostname)
- Credential Manager corupt
Soluție:
# Șterge credențialele vechi
cmdkey /delete:TERMSRV/192.168.254.232
# La următoarea conectare, salvează din nou
Cerințe sistem pentru NLA
Client
| OS | Suport NLA |
|---|---|
| Windows XP SP3+ | ✅ Da (cu update KB951608) |
| Windows Vista+ | ✅ Da (nativ) |
| Windows 7/8/10/11 | ✅ Da (nativ) |
| Linux (Remmina, xfreerdp) | ✅ Da |
| macOS (Microsoft RD Client) | ✅ Da |
Server
| OS | Suport NLA |
|---|---|
| Windows Server 2008+ | ✅ Da |
| Windows Server 2012+ | ✅ Da (implicit activat) |
| Windows Server 2016+ | ✅ Da (implicit activat) |
| Windows Server 2019/2022/2025 | ✅ Da (implicit activat) |
Best Practices
- Întotdeauna activează NLA pe servere - e implicit pe versiuni noi
- Folosește
authentication level:i:2în fișierele RDP - Nu dezactiva CredSSP decât pentru troubleshooting temporar
- Aplică patch-urile de securitate pe toate sistemele
- Folosește hostname în loc de IP când e posibil (pentru Kerberos)
- Nu bloca salvarea parolelor prin GPO dacă vrei "Remember me"