Détecter et bloquer les tentatives de connexion échouées (4625) sur RD Web Windows Server 2016

Constater un déluge d’événements 4625 sur RD Web n’est pas anodin : derrière un simple échec d’authentification peut se cacher un balayage massif ou une attaque ciblée. Cet article détaille comment tracer l’adresse IP fautive, la bloquer proprement et vérifier que vos comptes RDS restent sains.

Sommaire

Pourquoi « IIS APPPOOL\RDWebAccess » génère‑t‑il autant d’événements 4625 ?

RD Web repose sur un pool d’applications IIS dédié (RDWebAccess) qui sert la page rdweb et relaie les requêtes d’authentification à l’Active Directory. Quand un robot teste des identifiants inexistants (Status 0xC0000064) ou mauvais mots de passe (0xC000006A), IIS déclenche la chaîne d’auth qui, in fine, consigne l’échec dans le journal Sécurité : l’utilisateur enregistré est IIS APPPOOL\RDWebAccess. Faute d’IP dans l’événement, l’enquêteur doit croiser plusieurs sources.

Activer l’audit avancé pour enrichir les journaux

Avant toute investigation, activez l’ensemble des sous‑catégories suivantes via GPO ou ligne de commande :

  • Audit Logon/Logoff ▸ Audit LogonSuccès & Échecs
  • Audit Logon/Logoff ▸ Audit Other Logon/Logoff EventsSuccès & Échecs
  • Account Lockout et Account Logon pour surveiller les comptes AD

Cette granularité produit :

  • événements 4624 (logon réussi) et 4625 (échec) pour la partie Kerberos/NTLM ;
  • événement 1149 dans le canal TerminalServices‑RemoteConnectionManager/Operational dès qu’un client RDP présente des identifiants.

Tracer l’adresse IP source : trois méthodes complémentaires

1. Analyser les journaux IIS

Par défaut, IIS conserve un fichier journal par site dans C:\inetpub\logs\LogFiles\W3SVC…. Le champ c-ip inscrit l’IP cliente, même si la requête aboutit à un 401 ou 403. Filtrez les lignes dont l’URI contient /RDWeb/Pages/en-US/login.aspx (ou la culture locale) à l’horodatage d’un 4625 ; vous verrez l’IP fautive.

Get-ChildItem "C:\inetpub\logs\LogFiles" -Recurse |
  Select-String "/RDWeb/Pages" |
  Where-Object { $_.Line -match "2025-09-03 12:4[0-5]" } |
  Select Line

2. Exploiter l’événement 1149

Lorsqu’un client passe l’étape NLA, le Remote Connection Manager déclenche 1149, qui inclut :

  • Client Address : l’IP source
  • User : le compte entré
  • Port et Protocol (RDP‑TCP ou UDP)

Positionnez un filtre personnalisé dans Observateur d’événements pour 1149 + 4625, exportez au format CSV puis corrélez.

3. Interroger le Duo Admin Panel

Si Duo MFA protège RD Web, chaque tentative invalide figure dans les Authentication Logs avec :

  • Adresse IP et géolocalisation approximative ;
  • Signature navigateur/Bibliothèque RDP (utile pour détecter une headless browser) ;
  • Résultat (FAIL, INVALID USER, etc.).

Utilisez le Duo CSV export pour agréger les tentatives et cibler les plages d’attaque.

Corréler les journaux : script PowerShell prêt à l’emploi

Le snippet ci‑dessous extrait en 30 secondes les échecs récents et affiche l’IP dominante :

$Since = (Get-Date).AddHours(-24)
$Sec = Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=$Since}
$Tsv = @()

foreach (\$evt in \$Sec) {
\$Time = \$evt.TimeCreated
\$User = (\$evt | Select-Xml -XPath "//Data\[@Name='TargetUserName']").Node.'#text'
\# Va chercher l'IP correspondante dans IIS
\$Pattern = \$Time.ToString("yyyy-MM-dd HH\:mm")
\$Ip = Select-String -Path "C:\inetpub\logs\LogFiles\W3SVC\*\u\_ex\*.log" -Pattern \$Pattern |
Select-Object -First 1 |
ForEach-Object {
($\_ -split " ")\[8] # position du champ c-ip
}
\$Tsv += \[pscustomobject]@{Time=\$Time;User=\$User;IP=\$Ip}
}

\$Tsv | Group-Object IP | Sort-Object Count -Descending | Select -First 10

En production, programmez ce rapport dans le Planificateur et poussez‑le vers votre SIEM pour alertes temps réel.

Réduire ou bloquer les tentatives malveillantes

Pare‑feu Windows – approche « zéro confidence »

Appliquez une règle Inbound conditionnée :

  • Service World Wide Web Services (HTTP) port 443 ;
  • Adresse distante autorisée : vos sous‑réseaux VPN ou partenaires.

En PowerShell :

New-NetFirewallRule -DisplayName "RDWeb Allow VPN"
    -Direction Inbound -Protocol TCP -LocalPort 443
    -RemoteAddress 10.10.0.0/16,192.168.50.0/24
    -Action Allow

Auto‑ban dynamique façon « fail2ban »

Pour bloquer n échecs sur t minutes :

  1. Créez une tâche planifiée toutes les 5 min qui exécute le script précédent ;
  2. Si un IP dépasse le seuil (Count ≥ 5), alimentez une liste noire (netsh advfirewall firewall add rule … -RemoteAddress $Ip).
  3. Purgez les IP après 24 h pour éviter les faux positifs.

Des solutions tierces (WAF, reverse proxy, Cloudflare Access) offrent un rate limiting natif si vous préférez l’externaliser.

Mettre un RD Gateway en frontal

Le rôle RD Gateway déporte l’écoute 443 vers un composant spécialisé ; la passerelle assure :

  • NLA obligatoire + MFA + stratégie NPS ;
  • Journal Connection History lisible (IP, périphérique, application) ;
  • Blocage par adresse ou par type de client.

Certes, il faut une VM supplémentaire, mais le gain de visibilité et de contrôle justifie l’effort.

Valider l’intégrité des comptes RDS

ContrôleCommandeInterprétation
Réinitialiser mots de passe expirésGet-ADUser -Filter * -Properties PasswordExpired | ? PasswordExpiredLes comptes expirés attirent les attaquants ; forcer un reset.
Dernier logon anormalGet-ADUser <user> -Properties lastLogonDateHeure inattendue ? Correlate avec 4625/4624 pour détecter l’usurpation.
Push Duo suspectAudit Push DeniedUn employé reçoit une demande non sollicitée : probable attaque MFA fatigue.

Durcir définitivement RD Web

  • NLA obligatoire : décochez « Autoriser les connexions sans NLA ».
  • Account Lockout Policy : 10 échecs / 15 minutes, réinitialisation après 30 min.
  • Désactivez TLS 1.0/1.1 et les suites RC4 ; vérifiez via un scanner TLS externe.
  • FQDN non évident : évitez rdweb.mondomaine.tld public ; préférez un sous‑domaine obscur et un en‑tête Host obligeant le reverse proxy.
  • Renommez/désactivez le compte « Administrator » ; automatisez un mot de passe aléatoire enregistré dans un coffre‑fort.
  • Protégez l’accès à web.config et aux binaires RDS via NTFS ACL minimales.

Surveillance continue : de l’Observateur d’événements au SIEM

Créez une Custom View combinant 4625, 1149 et 31007/31008 (journal RDMS) puis souscrivez une alert task qui envoie un mail SMTP. Sur un SIEM (Microsoft Sentinel, Splunk, ELK) :

// Sentinel KQL
SecurityEvent
| where EventID in (4625,1149)
| summarize count() by bin(TimeGenerated, 5m), Computer
| where count_ > 20

Déclenchez un Logic App : ajout de l’IP dans Azure Firewall + notification Teams.

Checklist d’intervention rapide

ÉtapeObjectifDurée
Activer audit avancéLog détaillé10 min
Extraire IP via IIS + 1149Identifier attaquant15 min
Bloquer IP sur pare‑feuStopper attaque5 min
Mettre en place auto‑banPrévention1 h
Revue comptes et MFADétection compromission30 min
Déployer RD GatewayHardening + logs2 h

Conclusion

La combinaison des journaux IIS, de l’événement 1149 et des logs Duo permet d’attribuer chaque 4625 à une adresse IP précise. Bloquez‑la, automatisez la détection, puis réduisez la surface d’attaque : VPN ou RD Gateway en frontal, MFA partout, verrouillage de comptes et chiffrement TLS à jour. Vous transformerez ainsi votre serveur Windows Server 2016 RDS d’une cible facile en bastion résilient.

Sommaire