Gestisci un VPS Windows esposto su Internet e scopri nell'Osservatore eventi migliaia di tentativi di connessione RDP falliti al giorno. È normale: ogni VPS Windows con la porta 3389 aperta è costantemente scansionato da botnet. Senza protezione, una sola configurazione errata è sufficiente affinché un attaccante entri.
Questa guida spiega come bloccare i brute-force RDP a 3 livelli: (1) igiene RDP di base, (2) ban automatico degli IP attaccanti, (3) architettura VPN/Gateway per eliminare l'esposizione. Tornerai con una soluzione completa testata, gratuita e adattabile a qualsiasi VPS Windows Server 2019, 2022 o 2025.
Riepilogo rapido - Il minimo vitale in 5 minuti
- Attivare NLA (Network Level Authentication): Sistema → Desktop remoto → Avanzate → richiedere NLA
- Politica di blocco dell'account: 5 errori = blocco 30 min (tramite
secpol.msc) - Installare IPBan (1 comando PowerShell, ban automatico degli IP malevoli):
iex (irm https://raw.githubusercontent.com/DigitalRuby/IPBan/master/IPBanCore/Windows/Scripts/install-latest.ps1)
- Cambiare la porta RDP 3389 → 49xxx tramite
regedit(rallenta le scansioni automatiche).
Dettagli e opzioni avanzate qui sotto.
Perché RDP è il bersaglio n°1 delle botnet
Il Remote Desktop Protocol è esposto sulla porta 3389/TCP, e questa porta è continuamente scansionata su tutta l'IPv4 da botnet automatizzati. Un VPS Windows nuovo, messo online oggi senza alcuna altra azione, riceverà tipicamente:
- 5.000 a 50.000 tentativi di connessione al giorno fin dalle prime ore.
- Prove sui conti predefiniti:
Administrator,admin,user,test,sql,backup. - Prove sui conti Windows standard scoperti tramite enumerazione SMB / NetBIOS.
- Prove con liste di password (
rockyou.txte derivati), a ritmo di 1 prova ogni 1-5 secondi per IP.
Se l'attaccante trova una password debole, egli:
- Crea un nuovo account amministratore "discreto" (es:
Helpdesk$,IUSR_X). - Disattiva Windows Defender.
- Installa un miner di criptovaluta, un bot di spam o un ransomware.
- Vende l'accesso sui mercati neri (es: xDedic storico).
Il tempo medio tra compromissione e primo impatto malevolo: 15 minuti.
Da qui l'obiettivo di questa guida: rendere il tuo VPS poco interessante per i bot e bloccare gli IP che provano comunque.
Diagnosticare un attacco brute-force in corso
Contare i tentativi falliti
Apri PowerShell come amministratore ed esegui:
# Numero di fallimenti di connessione nelle ultime 24h
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625; StartTime=(Get-Date).AddDays(-1)} |
Measure-Object | Select-Object -ExpandProperty Count
L'Event ID 4625 è l'identificativo Windows di un fallimento di autenticazione. Se vedi più di qualche decina al giorno, sei nel mirino.
Vedere gli IP attaccanti in chiaro
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
Otterrai il top 20 degli IP attaccanti con il loro numero di tentativi. Se un IP accumula più di 50 prove, è chiaramente malevolo - deve essere bannato.
Identificare i conti mirati
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
Se vedi Administrator, admin o conti inesistenti, è un brute-force cieco (il caso più comune).
Livello 1 - Igiene RDP (il minimo non negoziabile)
Prima di parlare di strumenti anti-bruteforce, configura queste 5 impostazioni di base. Nessuno strumento compenserà la loro assenza.
1.1 Attivare NLA (Network Level Authentication)
NLA costringe l'autenticazione PRIMA dell'apertura della sessione RDP. Senza NLA, l'attaccante può avviare la sessione, vedere lo schermo di login e fare brute-force molto più velocemente.
# Attivare NLA tramite registro
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" `
-Name "UserAuthentication" -Value 1
Oppure tramite interfaccia: sysdm.cpl → scheda Utilizzo remoto → seleziona Consenti solo connessioni con NLA.
1.2 Rinominare (o disattivare) l'account Administrator
L'account Administrator rappresenta l'80% dei bersagli di brute-force. Rinominatelo:
$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)"
Ancora meglio: crea un nuovo account admin con un nome non indovinabile e disattiva completamente Administrator:
Disable-LocalUser -Name "Administrator"
⚠️ Prima di disattivare Administrator, verifica che un altro account admin funzioni e che tu possa connetterti tramite RDP. Altrimenti, ti bloccherai fuori dal VPS.
1.3 Politica di blocco dell'account (Account Lockout Policy)
5 tentativi falliti = account bloccato per 30 minuti. Configurazione tramite secpol.msc → Politiche di account → Politica di blocco dell'account:
| Parametro | Valore raccomandato |
|---|---|
| Soglia di blocco dell'account | 5 tentativi |
| Durata del blocco dell'account | 30 minuti |
| Ripristina il contatore dopo | 30 minuti |
Oppure da linea di comando:
net accounts /lockoutthreshold:5 /lockoutduration:30 /lockoutwindow:30
1.4 Politica di password forti
net accounts /minpwlen:14 /maxpwage:90 /minpwage:1 /uniquepw:5
- 14 caratteri minimi
- Scadenza ogni 90 giorni
- 1 giorno minimo prima del cambio (anti-cycling)
- 5 ultime password vietate
1.5 Cambiare la porta RDP predefinita (3389 → porta casuale)
Questo non blocca un attaccante mirato, ma elimina il 95% del rumore delle scansioni automatiche.
$newPort = 53389 # Scegliere una porta casuale tra 49152 e 65535
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" `
-Name "PortNumber" -Value $newPort
# Aprire la nuova porta nel firewall
New-NetFirewallRule -DisplayName "RDP Custom Port" -Direction Inbound `
-LocalPort $newPort -Protocol TCP -Action Allow
# Chiudere la porta 3389
Get-NetFirewallRule -DisplayName "Remote Desktop*" | Disable-NetFirewallRule
Per riconnetterti, usa ora <ip>:53389 nel client RDP. Riavvia il server affinché la nuova porta sia attiva.
⚠️ Prima di riavviare, testa la nuova regola del firewall da un altro IP o annota la console out-of-band (console KVM/IPMI del tuo provider) per recuperare l'accesso in caso di errore.
1.6 Limitare l'accesso RDP per IP (firewall scope rules)
Se ti connetti sempre dagli stessi IP (ufficio, VPN, IP fisso), consenti solo questi IP:
# Sostituire con i tuoi IP autorizzati (separati da virgola)
$allowedIPs = "203.0.113.42", "198.51.100.10"
Get-NetFirewallRule -DisplayName "*Remote Desktop*" | ForEach-Object {
Set-NetFirewallRule -Name $_.Name -RemoteAddress $allowedIPs
}
Questa è la misura più efficace: se l'attaccante non proviene da un IP in whitelist, il suo pacchetto viene rifiutato prima ancora di arrivare al servizio RDP. Brute-force impossibile.
Per un uso nomade, vedi il livello 3 con VPN.
Livello 2 - Ban automatico degli IP malevoli
Le tue impostazioni di base sono in atto, ma i bot continueranno a provare. L'auto-ban rileva automaticamente gli IP che moltiplicano i fallimenti e li banna tramite Windows Firewall.
Comparativa dei 6 strumenti principali
| Strumento | Licenza | Manutenzione | Tipo | Raccomandazione |
|---|---|---|---|---|
| IPBan (DigitalRuby) | Gratuito (Pro a pagamento) | Attivo 2025+ | Servizio Windows | ⭐ Il più popolare e solido |
| Fail2Ban4Win (Aldaviva) | Gratuito, MIT | Attivo | Servizio Windows | Eccellente, moderno, .NET |
| EZWinBan (neil-sabol) | Gratuito | Moderata | Script PS + Task Scheduler | Simple, ideale per piccoli server |
| wail2ban (glasnt) | Gratuito | Basso (2017) | Script PS | Storico, da evitare |
| EvlWatcher | Gratuito | Attivo | Servizio Windows | Buono, meno documentato |
| RDPGuard | Commerciale (~99$) | Attivo | Servizio Windows | Copre anche FTP/SMTP/SQL |
Raccomandazione per OuiHeberg: IPBan nella versione gratuita copre il 99% delle esigenze. Se desideri un'alternativa 100% open source moderna, Fail2Ban4Win.
Guida IPBan - installazione, configurazione, verifica
Passo 1 - Installazione in un comando
Apri PowerShell come amministratore ed esegui:
iex (irm https://raw.githubusercontent.com/DigitalRuby/IPBan/master/IPBanCore/Windows/Scripts/install-latest.ps1)
Lo script scarica l'ultima versione, la installa come servizio Windows e configura il servizio IPBan per avviarsi automaticamente.
Passo 2 - Verificare che il servizio sia attivo
Get-Service -Name IPBan
Deve mostrare Status: Running.
Passo 3 - Modificare la configurazione
Il file di configurazione si trova in:
C:\Program Files\IPBan\ipban.config
Le impostazioni essenziali:
<!-- Numero di fallimenti prima del ban -->
<add key="FailedLoginAttemptsBeforeBan" value="5"/>
<!-- Durata del ban (in giorni.ore:minuti:secondi) -->
<!-- Formato speciale: 00:30:00 = 30 minuti -->
<add key="ExpireTime" value="01:00:00:00"/> <!-- 1 giorno -->
<!-- Finestra di conteggio dei fallimenti -->
<add key="CycleTime" value="00:00:00:15"/> <!-- 15 secondi -->
<!-- Whitelist (IP mai bannati) -->
<add key="Whitelist" value="203.0.113.42,198.51.100.0/24"/>
<!-- Blacklist permanente -->
<add key="Blacklist" value=""/>
Per attivare una politica rigorosa (raccomandata in produzione):
FailedLoginAttemptsBeforeBan = 3ExpireTime = 30:00:00:00(30 giorni)- Whitelist tutte le tue IP di gestione.
Passo 4 - Riavviare il servizio dopo la modifica
Restart-Service IPBan
Passo 5 - Vedere gli IP bannati in tempo reale
IPBan crea automaticamente una regola firewall chiamata IPBan_*. Per consultarla:
Get-NetFirewallRule -DisplayName "IPBan*" |
Get-NetFirewallAddressFilter |
Select-Object -ExpandProperty RemoteAddress
Oppure più visivamente, guardando i log di IPBan:
Get-Content "C:\Program Files\IPBan\ipban.log" -Tail 50 -Wait
Vedrai in diretta ogni IP bannato con il timestamp e il numero di fallimenti.
Passo 6 - Sbloccare un IP per errore
# Metodo 1: rimuovere direttamente dal firewall
Remove-NetFirewallRule -DisplayName "IPBan_*" -ErrorAction SilentlyContinue
# Metodo 2: aggiungere l'IP alla whitelist in ipban.config e poi riavviare
Restart-Service IPBan
Configurazione raccomandata per profilo
| Profilo | Tentativi prima del ban | Durata del ban | Ciclo |
|---|---|---|---|
| Server personale / dev | 5 | 1 giorno | 15 sec |
| Server di produzione esposto | 3 | 7 giorni | 15 sec |
| Server critico | 2 | 30 giorni | 15 sec |
| Bastione / server unico | 1 | 365 giorni | 15 sec |
Alternativa - Script PowerShell custom auto-ban (senza dipendenze)
Se non vuoi alcuna dipendenza esterna né servizio di terze parti, ecco uno script PowerShell autonomo che fa il lavoro. Scansiona gli Event ID 4625 e banna qualsiasi IP che accumula più di N fallimenti in 1 ora.
Salva questo script in C:\Scripts\AutoBanRDP.ps1:
# === OuiHeberg - Auto-ban RDP brute-force (senza dipendenze) ===
param(
[int]$Threshold = 10, # Numero di fallimenti prima del ban
[int]$WindowHours = 1, # Finestra di conteggio in ore
[int]$BanDays = 7 # Durata del ban in giorni
)
$ruleName = "OuiHeberg_AutoBan_RDP"
$startTime = (Get-Date).AddHours(-$WindowHours)
# Recuperare gli IP attaccanti
$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 "Nessun IP da bannare (soglia = $Threshold su $WindowHours h)." -ForegroundColor Green
return
}
# Recuperare la regola esistente o crearla
$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: crea il $(Get-Date -Format 'yyyy-MM-dd HH:mm')"
}
Write-Host "$($attackers.Count) IP bannata(e): $($attackers -join ', ')" -ForegroundColor Yellow
# Pianificare il debann automatico (rimozione della regola dopo BanDays giorni)
$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
}
Pianificare l'esecuzione ogni 15 minuti
$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
Lo script gira ogni 15 minuti in background. Puoi regolare $Threshold, $WindowHours e $BanDays in base alla tua tolleranza.
Vantaggi dello script custom
- ✓ Nessuna dipendenza esterna.
- ✓ Codice 100% auditabile e modificabile.
- ✓ Log locali completi.
Limiti
- ❌ Nessun debann automatico (da scriptare in aggiunta).
- ❌ Nessuna rilevazione multi-servizi (solo RDP tramite Event 4625).
- ❌ Per > 10.000 IP bannati, la regola firewall diventa pesante - preferire IPBan.
Livello 3 - Architettura sicura (la vera soluzione)
I livelli 1 e 2 riducono drasticamente i rischi. La vera sicurezza consiste nel non esporre affatto RDP. Tre architetture raccomandate:
Opzione A - VPN davanti a RDP (la più semplice)
- Installa un server WireGuard o OpenVPN sul tuo VPS (o frontalmente).
- Blocca la porta RDP tranne che dall'IP interno della VPN.
- Ti connetti prima in VPN, poi in RDP come se fossi sulla LAN.
Vantaggi: RDP diventa invisibile da Internet. Costo: 30 min di installazione, prestazioni native.
Opzione B - RD Gateway (Remote Desktop Gateway)
Soluzione Microsoft nativa: un server RD Gateway funge da proxy HTTPS per le tue sessioni RDP. Il client si connette in HTTPS (porta 443) al Gateway, che rilancia in RDP internamente.
Vantaggi: compatibile con il client RDP standard, crittografia HTTPS, integrazione AD. Svantaggio: richiede una licenza RDS e più configurazione.
Opzione C - Bastione / Jump host
Un server "bastione" minimalista con solo SSH o RDP tramite chiave. Tutte le tue connessioni transitano attraverso di esso. Se il bastione viene compromesso, i tuoi server reali rimangono intatti.
Raccomandato per infrastrutture con più di 3-5 VPS.
Verifica e monitoraggio
Misurare l'efficacia dopo 24h
Riavvia lo script di diagnostica della sezione precedente. Se le tue misure sono efficaci, dovresti vedere:
- Event 4625: < 100/giorno (rispetto a migliaia prima).
- Top IP attaccanti: 1-3 tentativi ciascuna (rispetto a centinaia).
- Regole firewall IPBan: crescita regolare degli IP bannati.
Allerta mail in caso di attacco massivo
Script da pianificare ogni ora per allertare se > 500 fallimenti/ora:
$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 "⚠️ Attacco RDP in corso: $count tentativi su 1h" `
-Body "VPS mirato. Controllare IPBan e log." `
-SmtpServer "smtp.votreservice.com"
}
Audit settimanale dei conti
Una volta alla settimana, verifica che nessun conto sospetto sia stato creato:
Get-LocalUser | Where-Object { $_.Enabled -eq $true } | Format-Table Name, LastLogon, Description
Monitora i conti apparsi di recente e che non riconosci.
FAQ - Sicurezza RDP contro i brute-force
Quanti tentativi di connessione RDP dovrei subire su un VPS?
Su un VPS Windows appena distribuito con la porta 3389 standard esposta, contate da 5.000 a 50.000 tentativi al giorno fin dalle prime ore. Questo traffico proviene da botnet che scansionano continuamente l'IPv4. Una riduzione a meno di 100/giorno è l'obiettivo dopo l'applicazione della guida.
Qual è il comando per vedere gli IP che attaccano il mio RDP?
In PowerShell admin: Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} -MaxEvents 1000 poi estrarre i campi IpAddress dal XML. Lo script completo si trova nella sezione diagnostica. Ti fornisce il top 20 degli IP con il numero di tentativi.
IPBan o Fail2Ban4Win, quale scegliere?
IPBan è più maturo, meglio documentato e offre una versione Pro con dashboard. Fail2Ban4Win è più moderno (.NET 6+), 100% open source MIT e più leggero. Per la maggior parte degli usi, IPBan nella versione gratuita è più che sufficiente. Fail2Ban4Win è più adatto se vuoi contribuire al codice o integrarlo in una CI.
Cambiare la porta RDP da 3389 a un'altra è sufficiente per proteggersi?
No, ma è utile come complemento. Cambiare la porta elimina il 95% del rumore delle scansioni automatizzate (i bot scansionano solo 3389 per impostazione predefinita). Ma un attaccante mirato eseguirà una scansione completa delle tue porte in pochi minuti. Combina porta personalizzata + NLA + lockout + IPBan per una vera protezione.
Come sapere se il mio VPS è già stato compromesso?
Controlla: (1) lista degli account locali (Get-LocalUser) - qualsiasi account non creato da te è sospetto; (2) attività pianificate (Get-ScheduledTask) - cerca script sconosciuti; (3) processi in esecuzione (Get-Process) - cerca miner (xmrig, ethminer) o connessioni in uscita insolite; (4) Event Log Applicazione/Sistema - cerca installazioni recenti inattese. In caso di seri dubbi, reinstalla il VPS da zero - un VPS compromesso non si pulisce, si sostituisce.
Il whitelistaggio per IP funziona se lavoro in modalità nomade?
Male. Se il tuo IP cambia regolarmente (3G/4G, hotel, coworking), il whitelistaggio diventa impraticabile. Soluzione: monta un VPN sul VPS (WireGuard ideale, 10 min di installazione) e consenti RDP solo dall'IP interno del VPN. Mantieni la protezione senza dover mantenere un elenco di IP.
Cosa fare se sono bloccato fuori dopo aver configurato male il firewall?
Utilizza la console out-of-band del tuo provider (VNC, KVM, IPMI) - da OuiHeberg, accessibile dall'area clienti. Questa console fornisce accesso diretto al VPS senza passare per RDP, quindi indipendentemente dal firewall. Puoi correggere o disattivare la regola problematica.
Quanto tempo ci vuole affinché un attacco brute-force abbia successo su un account debole?
Con una password di 8 caratteri in minuscolo: pochi minuti. Con 12 caratteri misti: pochi giorni. Con 14+ caratteri forti: diversi anni. Ecco perché la politica delle password (net accounts /minpwlen:14) abbinata al blocco dell'account rende il brute-force praticamente impossibile.
IPBan rallenta il mio server?
No. IPBan funziona come un servizio leggero che legge i registri eventi e aggiunge regole al firewall di Windows nativo. Il consumo è trascurabile (< 30 Mo RAM, < 1% CPU anche sotto attacco massiccio). Le regole del firewall di Windows sono ottimizzate per gestire decine di migliaia di IP senza impatto percepibile.
Cosa fare delle IP bannite dopo diversi mesi?
Puoi periodicamente purgare le vecchie IP tramite IPBan (parametro ExpireTime). Una finestra di 30-90 giorni è un buon compromesso: le botnet rinnovano regolarmente le loro IP, non mantenere ad vitam aeternam evita che l'elenco diventi ingestibile.
Conclusione
Bloccare i brute-force RDP su un VPS Windows richiede tre strati complementari: (1) igiene RDP - NLA, lockout, password forti, porta personalizzata; (2) auto-ban con IPBan o uno script PowerShell personalizzato; (3) idealmente, un VPN o bastione per non esporre affatto RDP.
Con questi tre strati, passi da 20.000 tentativi/giorno a meno di 100, e i rari IP che provano ancora vengono bannati automaticamente. Il tuo VPS rimane facilmente accessibile per te, ma diventa un muro invalicabile per i bot.
Vuoi un VPS Windows già configurato con IPBan, firewall rinforzato e console out-of-band gratuita inclusa? I VPS Windows di OuiHeberg sono preconfigurati per la produzione: NLA attivato, politica di lockout rigorosa, VPN WireGuard opzionale, supporto 7 giorni su 7 basato in Francia.
