Lidiar con intentos de RDP por fuerza bruta es bastante molesto, sobre todo si no quieres que tu servidor o PC se vean afectados constantemente. Esta guía te ayudará a automatizar el bloqueo de esas molestas IP que intentan acceder a tu equipo Windows. La idea es detectar los eventos de inicio de sesión fallidos (ID de evento 4625), registrarlos y bloquear automáticamente a los más problemáticos con una regla de firewall. No es perfecto, pero es mejor que nada, sobre todo si no te interesa instalar herramientas de seguridad de terceros.
Cómo detectar y bloquear ataques de fuerza bruta de RDP con PowerShell
¿Por qué esto ayuda?
Si tus registros de Windows muestran varios intentos fallidos de inicio de sesión RDP desde ciertas IP y observas un aumento repentino de intentos de acceso no autorizado, este script puede ayudarte a solucionar el problema. Supervisa las entradas del Registro de Eventos y, una vez que una IP lo intenta varias veces (por ejemplo, 5 intentos fallidos en pocas horas), activa una regla de firewall para bloquear esa fuente. De esta forma, no solo esperas que desaparezcan, sino que bloqueas activamente su conexión. Además, como registra todas las acciones, obtienes un registro de lo que se ha bloqueado.
Cuando se aplica
Esto es útil si ves intentos fallidos de inicio de sesión RDP desde IP desconocidas, especialmente si parecen persistentes. Si detectas muchos eventos 4625 desde la misma IP, es probable que alguien o algo esté intentando forzar tus credenciales RDP. Por lo tanto, si ese es el caso, este método puede ahorrarte algunos dolores de cabeza.
Qué esperar
Una vez configurado, tendrás un script que analiza los registros recientes, identifica las IP que fallan repetidamente y las bloquea automáticamente actualizando las reglas del firewall. No es mágico; puedes ajustar el umbral o configurar una tarea programada para ejecutar este script periódicamente. Además, ten en cuenta que las IP de confianza (como las de tu red interna o VPN) deben estar en la lista blanca para evitar bloqueos accidentales.
Configuración paso a paso
Descargue el script y configúrelo
- Primero, descarga el script de este enlace de GitHub. Guárdalo en un lugar como `C:\PS\` (solo asegúrate de que la carpeta exista o créala con PowerShell)
New-Item -ItemType Directory -Path 'C:\PS\'. - Usa
Invoke-WebRequestel comando de PowerShell para descargar el script directamente desde GitHub, así no tendrás que copiar y pegar todo. Así:$path = "C:\PS\"; if(!(Test-Path -Path $path)){ New-Item -ItemType Directory -Path $path} $url = "https://raw.githubusercontent.com/maxbakhub/winposh/main/RDS/block-rdp-brute-force.ps1" $output = "$path\block-rdp-brute-force.ps1" Invoke-WebRequest -Uri $url -OutFile $output - Ahora, puedes ejecutar ese script manualmente cuando sea necesario o, mejor aún, automatizarlo creando una tarea programada (más sobre esto más adelante).
Configurar el bloqueo automático con el Programador de tareas
- Abra PowerShell como administrador (lo necesitará para la tarea programada).Luego, cree una nueva tarea que se active con cada inicio de sesión RDP fallido (ID de evento 4625).Aquí tiene un ejemplo rápido:
$taskname="Block_RDP_Brute_Force_Attacks_PS" $scriptPath="C:\PS\block-rdp-brute-force.ps1" $trigger = New-ScheduledTaskTrigger -AtLogOn $trigger. Subscription = @" <QueryList><Query Id="0" Path="Security"><Select Path="Security">*[System[(EventID=4625)]]</Select></Query></QueryList> "@ $action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File `"$scriptPath`"" Register-ScheduledTask -TaskName $taskname -Trigger $trigger -User "SYSTEM" -Action $action -RunLevel Highest -Force - Esto configura el script para que se ejecute automáticamente cuando falla el inicio de sesión RDP. En una configuración funcionó; en otra, tuve que ajustar un poco el disparador para que funcionara correctamente.
Ajustar umbrales e IP confiables
- Si el script te bloquea a ti o a direcciones IP internas legítimas, actualiza la matriz `$trustedIPs` del script para incluir tus direcciones de red. Además, si quieres ajustar la cantidad de intentos que activan un bloqueo, modifica `$badAttempts` y `$intervalHours`.
- Revise el archivo de registro (`c:\ps\rdp_block.log`) para ver qué IP se bloquearon y cuándo. Esto ayudará a optimizar el proceso si es necesario.
Es un poco raro, pero después de configurarlo, el script funciona silenciosamente en segundo plano, sin apenas problemas. En algunas máquinas, tardó un par de ejecuciones antes de detectar a los reincidentes, pero es un avance comparado con simplemente esperar que se rindan.