49 votos

¿Prohibir la dirección IP basado en X número de intentos de inicio de sesión sin éxito?

¿Es posible prohibir una dirección IP después de intentos de X número de inicio de sesión sin éxito a un servidor Windows? No a una cuenta especial, que sé cómo hacerlo, sino a toda la máquina.

Nos golpean muy duro por ataques de fuerza bruta tratando de adivinar nombres de usuario, así que esto sería de gran ayuda tener alguna carga del servidor.

27voto

remunda Puntos 365

Usted puede hacer esto con powershell y el administrador de tareas. Probablemente no sea la solución perfecta, pero funciona bastante bien y tengo unos 100 direcciones IP bloqueadas en dos meses. Escribí el guión, que se seleccionan desde el Registro de los eventos especificados ("error de auditoría"). Si hay muchos no los inicios de sesión desde cualquier dirección IP, a continuación, se añade a la regla de firewall (creado manualmente) denominado "BlockAttackers" que bloquea todo el tráfico de las direcciones ip especificadas.

PS1 secuencia de Comandos:

$DT = [DateTime]::Now.AddDays(-1) # check only last 24 hours

$l = Get-EventLog -LogName 'Security' -InstanceId 4625 -After $DT | Select-Object @{n='IpAddress';e={$_.ReplacementStrings[-2]} } # select Ip addresses that has audit failure 
$g = $l | group-object -property IpAddress  | where {$_.Count -gt 20} | Select -property Name # get ip adresses, that have more than 20 wrong logins

$fw = New-Object -ComObject hnetcfg.fwpolicy2 # get firewall object

$ar = $fw.rules | where {$_.name -eq 'BlockAttackers'} # get firewall rule named 'BlockAttackers' (must be created manually)

$arRemote = $ar.RemoteAddresses -split(',') #split the existing IPs into an array so we can easily search for existing IPs

$w = $g | where {$_.Name.Length -gt 1 -and  !($arRemote -contains $_.Name + '/255.255.255.255') } # get ip addresses that are not already in firewal rule. Include the subnet mask which is automatically added to the firewall remote IP declaration.

$w| %{$ar.remoteaddresses += ',' + $_.Name} # add IPs to firewall rule

Crear una tarea en el programador y el conjunto de gatillo para evento 4625 (inicio de sesión de windows, incluyendo servicios de terminal server). Pero usted puede ajustar el gatillo para ejecutar por ejemplo, dos veces por hora para evitar la innecesaria carga del servidor.

Scheduler trigger

y después de desencadenar ejecutar secuencia de comandos de powershell. También debe establecer los más altos privilegios para ejecutar esta secuencia de comandos, de lo contrario se producirá con la excepción de seguridad.

runing powershell script

Usted también puede unirse a esta secuencia de comandos para otros eventos de seguridad.

7voto

Keegan Puntos 71

Sé que esta pregunta es viejo, pero fue en realidad el primer post del foro me encontré cuando empecé tratando de hacer exactamente lo mismo hace un par de semanas. Me las he arreglado para venir para arriba con un guión de trabajo que analizará el caso de los registros de 24 horas de vuelta para lo único malo de inicio de sesión de entradas de registro de eventos, agarra una de las que tienen más de 10 malos inicios de sesión y, a continuación, ponerlos en una lista de filtros ipsec mediante el comando netsh. Luego escribí un archivo por lotes con esta línea powershell .\*scriptname.ps1* y crea una tarea programada para que se ejecute el archivo por lotes cada 24 horas (por alguna razón no ejecutar directamente).

$DATE = [DateTime]::Now.AddDays(-1)

$EVS = Get-EventLog Security -InstanceId 529 -after $DATE

$EVS | select-string -inputobject {$_.message} -pattern "Source Network Address:(.)*\.*\.*\.*"  -allmatches | foreach-object {$_.Matches} | foreach-object {$_.Value} | foreach-object {$_.replace("Source Network Address:", "")} | group-object -property $_ | where-object {$_.count -gt 10} | select-object -property name | format-list | out-file c:\rdpblock.txt 

get-content -path c:\rdpblock.txt | foreach-object {$_.replace("Name :", "")} | out-file c:\rdpblockcleaned.txt 

get-content -path c:\rdpblockcleaned.txt | select-object -unique | out-file c:\rdpblocknospaces.txt

$RDPIP = get-content -path c:\rdpblocknospaces.txt | select-object -skip 1

$RDPIP | foreach-object {$_.replace("     ", "")} | foreach-object {netsh ipsec static add filter filterlist=RDP_BLOCK srcaddr=$($_) dstaddr=any}

Sé que este script es probablemente ineficaz, pero cuando empecé a trabajar en esto yo no tenía absolutamente ninguna experiencia en powershell, así que mi capacidad para optimizar los scripts deja mucho que desear. Sin embargo, a pesar de este hecho, pensé que me gustaría compartir esto con alguien que se podría utilizar.

Agradezco Remunda por darme la idea inicial, que el cartel es el que me volvió a la idea de usar powershell para buscar los registros de sucesos.

4voto

Michael Khalili Puntos 33

Esta secuencia de comandos se basa en remunda la respuesta y va un poco más allá http://serverfault.com/a/397637/155102 las cuentas para el "BlockAttackers" la regla no tiene ningún IPs entrado aún (que devuelve un "*" como una cadena). También escribe un comentario en un archivo de registro para hacerle saber cuando la IP fue añadido a la regla.

Un buen consejo es crear el "BlockAttackers" regla que bloquea las direcciones IP, PERO que quede deshabilitado en la primera. A continuación, ejecute este script una vez manualmente por lo que puede llenar el "RemoteAddresses" campo de direcciones IP reales que deben ser bloqueadas. Echa un vistazo a las direcciones IP para asegurarse de que nada fundamental ha sido añadido y, a continuación, habilitar la regla de firewall. Agregar esta regla en el firewall como remunda descrito.

El git para esta secuencia de comandos

#Checks for IP addresses that used incorrect password more than 10 times
#within 24 hours and blocks them using a firewall rule 'BlockAttackers'

#Check only last 24 hours
$DT = [DateTime]::Now.AddHours(-24)

#Select Ip addresses that has audit failure
$l = Get-EventLog -LogName 'Security' -InstanceId 4625 -After $DT | Select-Object @{n='IpAddress';e={$_.ReplacementStrings[-2]} }

#Get ip adresses, that have more than 10 wrong logins
$g = $l | group-object -property IpAddress | where {$_.Count -gt 10} | Select -property Name

#Get firewall object
$fw = New-Object -ComObject hnetcfg.fwpolicy2

#Get firewall rule named 'BlockAttackers' (must be created manually)
$ar = $fw.rules | where {$_.name -eq 'BlockAttackers'}

#Split the existing IPs into an array so we can search it for existing IPs
$arRemote = $ar.RemoteAddresses -split(',')

#Only collect IPs that aren't already in the firewall rule
$w = $g | where {$_.Name.Length -gt 1 -and !($arRemote -contains $_.Name + '/255.255.255.255') }

#Add the new IPs to firewall rule
$w| %{
  if ($ar.RemoteAddresses -eq '*') {
    $ar.remoteaddresses = $_.Name
  }else{
    $ar.remoteaddresses += ',' + $_.Name
  }
}

#Write to logfile
if ($w.length -gt 1) {
  $w| %{(Get-Date).ToString() + ' ' + $_.Name >> '.\blocked.txt'}
}

3voto

becomingwisest Puntos 2628

No puedo tomar crédito por esta respuesta, pero http://serverfault.com/users/7200/evan-anderson ha mencionado su proyecto http://opensource.wellbury.com/projects/windows_sshd_block/newest-release/

2voto

Thorsten Puntos 148

Generalmente no es una buena idea dejar que otra persona controlar tus reglas de cortafuegos. Eso es básicamente lo que pides.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: