Vous gérez un VPS Windows exposé sur Internet et vous découvrez dans l'Observateur d'événements des milliers de tentatives de connexion RDP échouées par jour. C'est normal : tout VPS Windows avec le port 3389 ouvert est scanné en permanence par des botnets. Sans protection, une seule mauvaise configuration suffit pour qu'un attaquant entre.
Ce guide explique comment bloquer les brute-force RDP à 3 niveaux : (1) hygiène RDP de base, (2) ban automatique des IP attaquantes, (3) architecture VPN/Gateway pour éliminer l'exposition. Vous repartez avec une solution complète testée, gratuite, et adaptable à n'importe quel VPS Windows Server 2019, 2022 ou 2025.
Résumé rapide - Le minimum vital en 5 minutes
- Activer NLA (Network Level Authentication) : Système → Bureau à distance → Avancé → exiger NLA
- Politique de verrouillage de compte : 5 échecs = blocage 30 min (via
secpol.msc) - Installer IPBan (1 commande PowerShell, ban auto des IP malveillantes) :
iex (irm https://raw.githubusercontent.com/DigitalRuby/IPBan/master/IPBanCore/Windows/Scripts/install-latest.ps1)
- Changer le port RDP 3389 → 49xxx via
regedit(ralentit les scans automatisés).
Détails et options avancées ci-dessous.
Pourquoi RDP est la cible n°1 des botnets
Le Remote Desktop Protocol est exposé sur le port 3389/TCP, et ce port est scanné en continu sur l'intégralité de l'IPv4 par des botnets automatisés. Un VPS Windows neuf, mis en ligne aujourd'hui sans aucune autre action, recevra typiquement :
- 5 000 à 50 000 tentatives de connexion par jour dès les premières heures.
- Des essais sur les comptes par défaut :
Administrator,admin,user,test,sql,backup. - Des essais sur les comptes Windows standard découverts via énumération SMB / NetBIOS.
- Des essais avec des listes de mots de passe (
rockyou.txtet dérivés), au rythme de 1 essai toutes les 1 à 5 secondes par IP.
Si l'attaquant trouve un mot de passe faible, il :
- Crée un nouveau compte administrateur "discret" (ex :
Helpdesk$,IUSR_X). - Désactive Windows Defender.
- Installe un mineur de cryptomonnaie, un bot de spam ou un ransomware.
- Vend l'accès sur les marchés noirs (ex : xDedic historique).
Le délai moyen entre compromission et premier impact malveillant : 15 minutes.
D'où l'objectif de ce guide : rendre votre VPS inintéressant pour les bots et bloquer les IP qui essaient quand même.
Diagnostiquer une attaque brute-force en cours
Compter les tentatives échouées
Ouvrez PowerShell en administrateur et exécutez :
# Nombre d'échecs de connexion sur les dernières 24h
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625; StartTime=(Get-Date).AddDays(-1)} |
Measure-Object | Select-Object -ExpandProperty Count
L'Event ID 4625 est l'identifiant Windows d'un échec d'authentification. Si vous voyez plus de quelques dizaines par jour, vous êtes ciblé.
Voir les IP attaquantes en clair
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} -MaxEvents 1000 |
ForEach-Object {
$xml = [xml]$_.ToXml()
$xml.Event.EventData.Data | Where-Object { $_.Name -eq 'IpAddress' } | Select-Object -ExpandProperty '#text'
} |
Where-Object { $_ -and $_ -ne '-' } |
Group-Object | Sort-Object Count -Descending | Select-Object -First 20
Vous obtiendrez le top 20 des IP attaquantes avec leur nombre de tentatives. Si une IP cumule plus de 50 essais, elle est clairement malveillante - il faut la bannir.
Identifier les comptes ciblés
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} -MaxEvents 1000 |
ForEach-Object {
$xml = [xml]$_.ToXml()
$xml.Event.EventData.Data | Where-Object { $_.Name -eq 'TargetUserName' } | Select-Object -ExpandProperty '#text'
} |
Group-Object | Sort-Object Count -Descending | Select-Object -First 20
Si vous voyez Administrator, admin ou des comptes inexistants, c'est un brute-force aveugle (le cas le plus courant).
Couche 1 - Hygiène RDP (le minimum non négociable)
Avant de parler d'outils anti-bruteforce, configurez ces 5 réglages de base. Aucun outil ne compensera leur absence.
1.1 Activer NLA (Network Level Authentication)
NLA force l'authentification AVANT l'ouverture de la session RDP. Sans NLA, l'attaquant peut lancer la session, voir l'écran de login, et brute-forcer beaucoup plus vite.
# Activer NLA via registre
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" `
-Name "UserAuthentication" -Value 1
Ou via interface : sysdm.cpl → onglet Utilisation à distance → cocher N'autoriser que les connexions avec NLA.
1.2 Renommer (ou désactiver) le compte Administrator
Le compte Administrator représente 80 % des cibles de brute-force. Renommez-le :
$adminSID = "S-1-5-21-*-500"
$adminAccount = Get-LocalUser | Where-Object { $_.SID -like $adminSID }
Rename-LocalUser -Name $adminAccount.Name -NewName "Admin_$(Get-Random -Maximum 9999)"
Mieux encore : créez un nouveau compte admin avec un nom non devinable et désactivez complètement Administrator :
Disable-LocalUser -Name "Administrator"
⚠️ Avant de désactiver Administrator, vérifiez qu'un autre compte admin fonctionne et que vous pouvez vous y connecter via RDP. Sinon, vous vous bloquerez hors du VPS.
1.3 Politique de verrouillage de compte (Account Lockout Policy)
5 tentatives échouées = compte bloqué 30 minutes. Configuration via secpol.msc → Stratégies de compte → Stratégie de verrouillage de compte :
| Paramètre | Valeur recommandée |
|---|---|
| Seuil de verrouillage de compte | 5 tentatives |
| Durée de verrouillage de compte | 30 minutes |
| Réinitialiser le compteur après | 30 minutes |
Ou en ligne de commande :
net accounts /lockoutthreshold:5 /lockoutduration:30 /lockoutwindow:30
1.4 Politique de mots de passe forts
net accounts /minpwlen:14 /maxpwage:90 /minpwage:1 /uniquepw:5
- 14 caractères minimum
- Expiration tous les 90 jours
- 1 jour minimum avant changement (anti-cyclage)
- 5 derniers mots de passe interdits
1.5 Changer le port RDP par défaut (3389 → port aléatoire)
Cela ne bloque pas un attaquant ciblé, mais élimine 95 % du bruit des scans automatisés.
$newPort = 53389 # Choisir un port aléatoire entre 49152 et 65535
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" `
-Name "PortNumber" -Value $newPort
# Ouvrir le nouveau port dans le firewall
New-NetFirewallRule -DisplayName "RDP Custom Port" -Direction Inbound `
-LocalPort $newPort -Protocol TCP -Action Allow
# Fermer le port 3389
Get-NetFirewallRule -DisplayName "Remote Desktop*" | Disable-NetFirewallRule
Pour vous reconnecter, utilisez maintenant <ip>:53389 dans le client RDP. Redémarrez le serveur pour que le nouveau port soit actif.
⚠️ Avant de redémarrer, testez la nouvelle règle firewall depuis une autre IP ou notez la console hors-bande (console KVM/IPMI de votre hébergeur) pour récupérer l'accès en cas d'erreur.
1.6 Limiter l'accès RDP par IP (firewall scope rules)
Si vous vous connectez toujours depuis les mêmes IP (bureau, VPN, IP fixe), autorisez uniquement ces IP :
# Remplacer par vos IP autorisées (séparées par virgule)
$allowedIPs = "203.0.113.42", "198.51.100.10"
Get-NetFirewallRule -DisplayName "*Remote Desktop*" | ForEach-Object {
Set-NetFirewallRule -Name $_.Name -RemoteAddress $allowedIPs
}
C'est la mesure la plus efficace : si l'attaquant ne provient pas d'une IP whitelistée, son paquet est rejeté avant même d'arriver au service RDP. Brute-force impossible.
Pour un usage nomade, voyez la couche 3 avec VPN.
Couche 2 - Ban automatique des IP malveillantes
Vos réglages de base sont en place, mais les bots continueront à essayer. L'auto-ban détecte automatiquement les IP qui multiplient les échecs et les bannit via Windows Firewall.
Comparatif des 6 outils principaux
| Outil | Licence | Maintenance | Type | Recommandation |
|---|---|---|---|---|
| IPBan (DigitalRuby) | Gratuit (Pro payant) | Active 2025+ | Service Windows | ⭐ Le plus populaire et solide |
| Fail2Ban4Win (Aldaviva) | Gratuit, MIT | Active | Service Windows | Excellent, moderne, .NET |
| EZWinBan (neil-sabol) | Gratuit | Modérée | Script PS + Task Scheduler | Simple, idéal petit serveur |
| wail2ban (glasnt) | Gratuit | Faible (2017) | Script PS | Historique, à éviter |
| EvlWatcher | Gratuit | Active | Service Windows | Bon, moins documenté |
| RDPGuard | Commercial (~99$) | Active | Service Windows | Couvre aussi FTP/SMTP/SQL |
Recommandation pour OuiHeberg : IPBan en version gratuite couvre 99 % des besoins. Si vous voulez une alternative 100 % open source moderne, Fail2Ban4Win.
Tutoriel IPBan - installation, configuration, vérification
Étape 1 - Installation en une commande
Ouvrez PowerShell en administrateur et exécutez :
iex (irm https://raw.githubusercontent.com/DigitalRuby/IPBan/master/IPBanCore/Windows/Scripts/install-latest.ps1)
Le script télécharge la dernière version, l'installe en tant que service Windows, et configure le service IPBan pour démarrer automatiquement.
Étape 2 - Vérifier que le service tourne
Get-Service -Name IPBan
Doit afficher Status: Running.
Étape 3 - Éditer la configuration
Le fichier de configuration se trouve dans :
C:\Program Files\IPBan\ipban.config
Les paramètres essentiels :
<!-- Nombre d'échecs avant ban -->
<add key="FailedLoginAttemptsBeforeBan" value="5"/>
<!-- Durée du ban (en jours.heures:minutes:secondes) -->
<!-- Format spécial : 00:30:00 = 30 minutes -->
<add key="ExpireTime" value="01:00:00:00"/> <!-- 1 jour -->
<!-- Fenêtre de comptage des échecs -->
<add key="CycleTime" value="00:00:00:15"/> <!-- 15 secondes -->
<!-- Whitelist (IPs jamais bannies) -->
<add key="Whitelist" value="203.0.113.42,198.51.100.0/24"/>
<!-- Blacklist permanente -->
<add key="Blacklist" value=""/>
Pour activer une politique stricte (recommandée production) :
FailedLoginAttemptsBeforeBan = 3ExpireTime = 30:00:00:00(30 jours)- Whitelistez toutes vos IP de gestion.
Étape 4 - Redémarrer le service après modification
Restart-Service IPBan
Étape 5 - Voir les IP bannies en temps réel
IPBan crée automatiquement une règle firewall nommée IPBan_*. Pour la consulter :
Get-NetFirewallRule -DisplayName "IPBan*" |
Get-NetFirewallAddressFilter |
Select-Object -ExpandProperty RemoteAddress
Ou plus visuel, en regardant les logs IPBan :
Get-Content "C:\Program Files\IPBan\ipban.log" -Tail 50 -Wait
Vous verrez en direct chaque IP bannie avec l'horodatage et le nombre d'échecs.
Étape 6 - Débannir une IP par erreur
# Méthode 1 : retirer du firewall directement
Remove-NetFirewallRule -DisplayName "IPBan_*" -ErrorAction SilentlyContinue
# Méthode 2 : ajouter l'IP à la whitelist dans ipban.config puis redémarrer
Restart-Service IPBan
Configuration recommandée par profil
| Profil | Tentatives avant ban | Durée ban | Cycle |
|---|---|---|---|
| Serveur personnel / dev | 5 | 1 jour | 15 sec |
| Serveur production exposé | 3 | 7 jours | 15 sec |
| Serveur critique | 2 | 30 jours | 15 sec |
| Bastion / serveur unique | 1 | 365 jours | 15 sec |
Alternative - Script PowerShell custom auto-ban (sans dépendance)
Si vous ne voulez aucune dépendance externe ni service tiers, voici un script PowerShell autonome qui fait le travail. Il scanne les Event ID 4625 et bannit toute IP cumulant plus de N échecs sur 1 heure.
Sauvegardez ce script dans C:\Scripts\AutoBanRDP.ps1 :
# === OuiHeberg - Auto-ban RDP brute-force (sans dépendance) ===
param(
[int]$Threshold = 10, # Nombre d'échecs avant ban
[int]$WindowHours = 1, # Fenêtre de comptage en heures
[int]$BanDays = 7 # Durée du ban en jours
)
$ruleName = "OuiHeberg_AutoBan_RDP"
$startTime = (Get-Date).AddHours(-$WindowHours)
# Récupérer les IP attaquantes
$attackers = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
ID = 4625
StartTime = $startTime
} -ErrorAction SilentlyContinue | ForEach-Object {
$xml = [xml]$_.ToXml()
$ip = ($xml.Event.EventData.Data | Where-Object { $_.Name -eq 'IpAddress' }).'#text'
if ($ip -and $ip -ne '-' -and $ip -ne '::1' -and $ip -ne '127.0.0.1') { $ip }
} | Group-Object | Where-Object { $_.Count -ge $Threshold } | Select-Object -ExpandProperty Name
if (-not $attackers) {
Write-Host "Aucune IP à bannir (seuil = $Threshold sur $WindowHours h)." -ForegroundColor Green
return
}
# Récupérer la règle existante ou la créer
$existingRule = Get-NetFirewallRule -DisplayName $ruleName -ErrorAction SilentlyContinue
if ($existingRule) {
$currentIPs = ($existingRule | Get-NetFirewallAddressFilter).RemoteAddress
$allIPs = ($currentIPs + $attackers) | Sort-Object -Unique
Set-NetFirewallRule -DisplayName $ruleName -RemoteAddress $allIPs
} else {
New-NetFirewallRule -DisplayName $ruleName `
-Direction Inbound -Action Block `
-RemoteAddress $attackers `
-Description "Auto-ban OuiHeberg : crée le $(Get-Date -Format 'yyyy-MM-dd HH:mm')"
}
Write-Host "$($attackers.Count) IP bannie(s) : $($attackers -join ', ')" -ForegroundColor Yellow
# Programmer le déban automatique (suppression de la règle après BanDays jours)
$logPath = "C:\Scripts\AutoBanRDP.log"
$attackers | ForEach-Object {
"$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')`tBAN`t$_`tEXPIRE=$((Get-Date).AddDays($BanDays))" | Out-File -Append $logPath
}
Planifier l'exécution toutes les 15 minutes
$action = New-ScheduledTaskAction -Execute "powershell.exe" `
-Argument "-NoProfile -ExecutionPolicy Bypass -File C:\Scripts\AutoBanRDP.ps1"
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) `
-RepetitionInterval (New-TimeSpan -Minutes 15) `
-RepetitionDuration (New-TimeSpan -Days 365)
Register-ScheduledTask -TaskName "OuiHeberg-AutoBanRDP" `
-Action $action -Trigger $trigger `
-User "SYSTEM" -RunLevel Highest -Force
Le script tourne toutes les 15 minutes en arrière-plan. Vous pouvez ajuster $Threshold, $WindowHours et $BanDays selon votre tolérance.
Avantages du script custom
- ✓ Aucune dépendance externe.
- ✓ Code 100 % auditable et modifiable.
- ✓ Logs locaux complets.
Limites
- ❌ Pas de déban automatique (à scripter en complément).
- ❌ Pas de détection multi-services (uniquement RDP via Event 4625).
- ❌ Pour > 10 000 IP bannies, la règle firewall devient lourde - préférer IPBan.
Couche 3 - Architecture sécurisée (la vraie solution)
Les couches 1 et 2 réduisent drastiquement les risques. La vraie sécurité consiste à ne pas exposer RDP du tout. Trois architectures recommandées :
Option A - VPN devant RDP (le plus simple)
- Installez un serveur WireGuard ou OpenVPN sur votre VPS (ou en frontal).
- Bloquez le port RDP sauf depuis l'IP interne du VPN.
- Vous vous connectez d'abord en VPN, puis en RDP comme si vous étiez sur le LAN.
Avantages : RDP devient invisible depuis Internet. Coût : 30 min d'installation, performance native.
Option B - RD Gateway (Remote Desktop Gateway)
Solution Microsoft native : un serveur RD Gateway sert de proxy HTTPS pour vos sessions RDP. Le client se connecte en HTTPS (port 443) au Gateway, qui relaie en RDP en interne.
Avantages : compatible client RDP standard, chiffrement HTTPS, intégration AD. Inconvénient : nécessite une licence RDS et plus de configuration.
Option C - Bastion / Jump host
Un serveur "bastion" minimaliste avec uniquement SSH ou RDP via clé. Toutes vos connexions transitent par lui. Si le bastion est compromis, vos serveurs réels restent intouchés.
Recommandé pour les infrastructures de plus de 3-5 VPS.
Vérification et monitoring
Mesurer l'efficacité après 24h
Relancez le script de diagnostic de la section précédente. Si vos mesures sont efficaces, vous devriez voir :
- Event 4625 : < 100/jour (vs des milliers avant).
- Top IP attaquantes : 1-3 essais chacune (vs des centaines).
- Règles firewall IPBan : croissance régulière des IP bannies.
Alerte mail en cas d'attaque massive
Script à programmer toutes les heures pour alerter si > 500 échecs/heure :
$count = (Get-WinEvent -FilterHashtable @{
LogName='Security'; ID=4625; StartTime=(Get-Date).AddHours(-1)
} -ErrorAction SilentlyContinue | Measure-Object).Count
if ($count -gt 500) {
Send-MailMessage -From "[email protected]" -To "[email protected]" `
-Subject "⚠️ Attaque RDP en cours : $count tentatives sur 1h" `
-Body "VPS ciblé. Vérifier IPBan et logs." `
-SmtpServer "smtp.votreservice.com"
}
Audit hebdomadaire des comptes
Une fois par semaine, vérifiez qu'aucun compte suspect n'a été créé :
Get-LocalUser | Where-Object { $_.Enabled -eq $true } | Format-Table Name, LastLogon, Description
Surveillez les comptes apparus récemment et que vous ne reconnaissez pas.
FAQ - Sécuriser RDP contre les brute-force
Combien de tentatives de connexion RDP suis-je censé subir sur un VPS ?
Sur un VPS Windows nouvellement déployé avec le port 3389 standard exposé, comptez 5 000 à 50 000 tentatives par jour dès les premières heures. Ce trafic provient de botnets scannant l'IPv4 en continu. Une réduction à moins de 100/jour est l'objectif après application du guide.
Quelle est la commande pour voir les IP qui attaquent mon RDP ?
En PowerShell admin : Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} -MaxEvents 1000 puis extraire les champs IpAddress du XML. Le script complet est dans la section diagnostic. Il vous donne le top 20 des IP avec le nombre de tentatives.
IPBan ou Fail2Ban4Win, lequel choisir ?
IPBan est plus mature, mieux documenté, et propose une version Pro avec dashboard. Fail2Ban4Win est plus moderne (.NET 6+), 100 % open source MIT, et plus léger. Pour la majorité des usages, IPBan en version gratuite suffit largement. Fail2Ban4Win convient mieux si vous voulez contribuer au code ou intégrer dans une CI.
Changer le port RDP de 3389 vers un autre suffit-il à se protéger ?
Non, mais c'est utile en complément. Changer le port élimine 95 % du bruit des scans automatisés (les bots ne scannent que 3389 par défaut). Mais un attaquant ciblé fera un scan complet de vos ports en quelques minutes. Combinez port custom + NLA + lockout + IPBan pour une vraie protection.
Comment savoir si mon VPS a déjà été compromis ?
Vérifiez : (1) liste des comptes locaux (Get-LocalUser) - tout compte non créé par vous est suspect ; (2) tâches planifiées (Get-ScheduledTask) - chercher des scripts inconnus ; (3) processus en cours (Get-Process) - chercher des miners (xmrig, ethminer) ou des connexions sortantes inhabituelles ; (4) Event Log Application/System - chercher des installations récentes inattendues. En cas de doute sérieux, réinstallez le VPS depuis zéro - un VPS compromis ne se nettoie pas, il se remplace.
Le whitelistage par IP fonctionne-t-il si je travaille en nomade ?
Mal. Si votre IP change régulièrement (3G/4G, hôtels, coworking), le whitelistage devient impraticable. Solution : montez un VPN sur le VPS (WireGuard idéal, 10 min d'install) et autorisez RDP uniquement depuis l'IP interne du VPN. Vous gardez la protection sans avoir à maintenir une liste d'IP.
Que faire si je suis bloqué dehors après avoir mal configuré le firewall ?
Utilisez la console hors-bande de votre hébergeur (VNC, KVM, IPMI) - chez OuiHeberg, accessible depuis l'espace client. Cette console donne accès direct au VPS sans passer par RDP, donc indépendamment du firewall. Vous pouvez corriger ou désactiver la règle problématique.
Combien de temps faut-il pour qu'un brute-force aboutisse sur un compte faible ?
Avec un mot de passe de 8 caractères en minuscules : quelques minutes. Avec 12 caractères mixés : quelques jours. Avec 14+ caractères forts : plusieurs années. C'est pourquoi la politique de mots de passe (net accounts /minpwlen:14) couplée au verrouillage de compte rend le brute-force pratiquement impossible.
IPBan ralentit-il mon serveur ?
Non. IPBan tourne comme un service léger qui lit les Event Log et ajoute des règles au Windows Firewall natif. La consommation est négligeable (< 30 Mo RAM, < 1 % CPU même sous attaque massive). Les règles firewall Windows sont optimisées pour gérer des dizaines de milliers d'IP sans impact perceptible.
Que faire des IP bannies après plusieurs mois ?
Vous pouvez purger périodiquement les vieilles IP via IPBan (paramètre ExpireTime). Une fenêtre de 30 à 90 jours est un bon compromis : les botnets renouvellent leurs IP régulièrement, ne pas garder ad vitam aeternam évite que la liste devienne ingérable.
Conclusion
Bloquer les brute-force RDP sur un VPS Windows demande trois couches complémentaires : (1) hygiène RDP - NLA, lockout, mots de passe forts, port custom ; (2) auto-ban avec IPBan ou un script PowerShell custom ; (3) idéalement, un VPN ou bastion pour ne pas exposer RDP du tout.
Avec ces trois couches, vous passez de 20 000 tentatives/jour à moins de 100, et les rares IP qui essaient encore sont bannies automatiquement. Votre VPS reste accessible facilement pour vous, mais devient un mur infranchissable pour les bots.
Vous voulez un VPS Windows déjà configuré avec IPBan, firewall durci et console hors-bande gratuite incluse ? Les VPS Windows OuiHeberg sont préconfigurés pour la production : NLA activé, lockout policy stricte, VPN WireGuard en option, support 7j/7 basé en France.
