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.
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 Logon
→ Succès & ÉchecsAudit Logon/Logoff ▸ Audit Other Logon/Logoff Events
→ Succès & ÉchecsAccount Lockout
etAccount 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 :
- Créez une tâche planifiée toutes les 5 min qui exécute le script précédent ;
- Si un IP dépasse le seuil (Count ≥ 5), alimentez une liste noire (
netsh advfirewall firewall add rule … -RemoteAddress $Ip
). - 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ôle | Commande | Interprétation |
---|---|---|
Réinitialiser mots de passe expirés | Get-ADUser -Filter * -Properties PasswordExpired | ? PasswordExpired | Les comptes expirés attirent les attaquants ; forcer un reset. |
Dernier logon anormal | Get-ADUser <user> -Properties lastLogonDate | Heure inattendue ? Correlate avec 4625/4624 pour détecter l’usurpation. |
Push Duo suspect | Audit Push Denied | Un 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
Étape | Objectif | Durée | |
---|---|---|---|
✅ | Activer audit avancé | Log détaillé | 10 min |
✅ | Extraire IP via IIS + 1149 | Identifier attaquant | 15 min |
✅ | Bloquer IP sur pare‑feu | Stopper attaque | 5 min |
⬜ | Mettre en place auto‑ban | Prévention | 1 h |
⬜ | Revue comptes et MFA | Détection compromission | 30 min |
⬜ | Déployer RD Gateway | Hardening + logs | 2 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.