Protegiéndose frente a ataques de fuerza bruta contra SMTP en IBM Domino III - Bloqueando IPs en Windows vía script

5 March, 2013 08:12:00 Miguel Calvo  Administración  Domino  |  Comentarios (0)

En el primer artículo,  Protegiéndose frente a ataques de fuerza bruta contra SMTP en IBM Domino I se definió el problema de los ataques de fuerza bruta y cómo capturarlos. Posteriormente en Protegiéndose frente a ataques de fuerza bruta contra SMTP en IBM Domino II - Configurando IP Security Management en Windows 2003 vimos cómo configurar el bloqueo de IPs a nivel de sistema operativo.

Hoy vamos a cerrar la serie bloqueando el acceso de determinadas IPs a nuestro servidor ( Windows en este caso ) desde nuestra aplicación de control SMTPattacks.nsf.

La descripción de los elementos de diseño necesarios para esta base de datos ya las vimos:

  • una vista categorizada por la IP que genera el evento. La IP no está disponible en el documento, pero puede extraerse del campo EventText
  • un agente que cuando detecte 20 errores generados desde la misma IP, bloquee la IP remota desde donde se está produciendo el ataque.

La única particularidad de la vista es la obtención de la IP desde la que se realiza el ataque y la agrupación de los documentos por cada una de las autenticaciones fallidas.

En una aproximación inicial, podemos ver aparece en el campo EventText generado desde el capturador de eventos. Con la fórmula

@RightBack(EventText;" ")

podemos obtener la IP.

Image:Protegiéndose frente a ataques de fuerza bruta contra SMTP en IBM Domino III - Bloqueando IPs en Windows vía script

Agente para el procesado de los ataques


Una vez recopilada la información en una vista, vamos a diseñar un agente que procese los documentos.

El agente se ejecutará cada vez que se cree un nuevo documento. Determinará si ya hay más de 20 errores generados desde la misma IP y en caso de que así sea bloqueará la IP y marcará los documentos como procesados.

El número de errores considerado como "ataque" habrá que determinarlo en la infraestructura de cada uno. Por ejemplo, si se dispone de un dispositivo que reintente la conexión automáticamente y el usuario ha introducido de manera incorrecta la contraseña, la IP va a ser bloqueada irremisiblemente. ¿ Puede ese caso ocurrir en nuestra infraestructura para conexiones legítimas ? Hemos de valorarlo bien para evitar bloqueos incorrectos.

El trigger  del agente será "After documents are created or modified" , esto es, cada vez que se cree un nuevo documento en la base de datos debería ejecutarse.

Image:Protegiéndose frente a ataques de fuerza bruta contra SMTP en IBM Domino III - Bloqueando IPs en Windows vía script

En realidad, este trigger no ejecuta el agente inmediatamente, sino que puede haber hasta un retardo de hasta 30 minutos (  por defecto ) entre una ejecución  y la siguiente del mismo agente, y hasta de 5 minutos ( por defecto ) entre que se detecta el nuevo documento y se planifica el agente. Podemos acortarlo utilizando esta entrada en el notes.ini

AMgr_DocUpdateAgentMinInterval=0
AMgr_DocUpdateEventDelay=0

En este caso el retardo sería de aproximadamente de 2 minutos. Hay que tener mucho cuidado con estos parámetros en servidores con muchos agentes, ya que pueden afectar al rendimiento del servidor e impactar en tiempos de respuesta.

Adicionálmente hay que seleccionar el servidor en el que se va a ejecutar el agente, pulsando en Edit Settings...

Image:Protegiéndose frente a ataques de fuerza bruta contra SMTP en IBM Domino III - Bloqueando IPs en Windows vía script

Hemos de dar privilegios al agente ya que necesitará emitir comandos al sistema operativo. Para ello hemos de indicar el nivel de seguridad "2. Allow restricted operations"

Image:Protegiéndose frente a ataques de fuerza bruta contra SMTP en IBM Domino III - Bloqueando IPs en Windows vía script

Ya sólo nos falta el código del agente. Puede ser tan complejo como queramos y que observe distintas validaciones antes de bloquear una IP.

El código del agente podéis descargarlo del enlace.

Vamos a ver los puntos relevantes del agente:

- Definiríamos una serie de constantes

'Número mínimo de errores desde la misma IP para bloquearla

Const
NUMERO_MINIMO_ATAQUES        = 20

'Etiqueta devuelta por @Platform

Const
WINDOWS_2003_SERVER        = "Windows/NT 5.2"
Const
WINDOWS_2008_SERVER        = "Windows 2008"


- Para capturar los documentos "nuevos" sobre los que hay que ejecutar el agente utilizaremos el método UnprocessedDocuments de la clase NotesDatabase
 
Set
db = s.Currentdatabase
Set
dc = db.Unprocesseddocuments

- Para averiguar sobre que S.O. se está ejecutando el agente usaremos el siguiente código ( Hay que tener en cuenta que el código funciona tanto para W2003 como W2008 )
 
Dim
ret As Variant
ret = Evaluate(|@Platform([Specific])|)
Dim
plat As String
plat = Join(ret, " ")  ' Constante de texto que determina el sistema operativo

- La IP a bloquear la obtendremos del campo de texto EventText

ipStr = StrRightBack(docAlerta.eventText(0) , " ")

- Para incluir la IP en el sistema de bloqueo del sistema operativo utilizaremos los siguientes comandos
                   
If
InStr(plat, WINDOWS_2003_SERVER) > 0 Then
macro = |netsh ipsec static add filter filterlist="IPS Bloqueadas" srcaddr=| + ipStr + | srcmask=255.255.255.255 dstaddr=me description="| + ipStr + |" protocol=any srcport=0 dstport=0|        
ElseIf
plat = WINDOWS_2008_SERVER Then
macro = |netsh advfirewall firewall add rule name="Bloqueo IP | + ipStr + | desde línea de comando" protocol=TCP localport€ action=block dir=IN remoteip=| + ipStr
Else

macro = ||
End
If

NOTA: En Windows 2008 símplemente hemos de crear una regla para el Firewall y la IP remota quedará bloqueada.
                 
- Para ejecutar el comando

result = Shell(macro,6 )
                 


Y con esto damos por finalizada la serie de artículos. El código no es a prueba de fallos, por lo que el consejo es probar, probar, probar... Y espero que a partir de ahora,...no más ataques SMTP sin defendernos.

Sé el primero en comentar la noticia

Deja una respuesta


Nota:  (No HTML - Los enlaces serán convertidos si están precedidos por http://)

¿ Recuérdame?