OpenSIPs seguridad - El modulo PIKE

El modulo PIKE de OpenSIPs nos permite implementar un mecanismo para proteger el Proxy SIP de ataques, procedentes a nivel de red, constituidos de un flujo continuo de solicitudes SIP que si fueran contestadas todas, podrían afectar el correcto funcionamiento del programa. Este articulo se basa en la versión 1.11.X de OpenSIPs. Se inicia modificando el archivo de configuración de OpenSIPs:

nano /etc/opensips/opensips.cfg

En el bloque dedicado a los módulos se añade:

#### PIKE Module
loadmodule "pike.so"
modparam("pike", "sampling_time_unit", 2)
modparam("pike", "reqs_density_per_unit", 30)
modparam("pike", "remove_latency", 120)
modparam("pike", "check_route", "pike")
modparam("pike", "pike_log_level", 0)

Las distintas líneas:

  1. Una descripción

  2. se carga el modulo

  3. se define que el muestreo se sacará cada 2 segundos

  4. si se reciben más de 30 solicitudes SIP procedentes de la misma IP dentro del tiempo definido en el parámetro anterior, se bloquea la IP

  5. Por cuanto tiempo se bloqueará la IP desde la ultima vez que se ha recibido una solicitud procedente de ella misma (en segundos)

  6. El nombre de la ruta donde se realizará el chequeo de cada IP que está enviando solicitudes a OpenSIPs

  7. Nivel de LOG donde reportar el bloqueo y desbloqueo de una IP (normalmente el mismo que aparece en esta línea: log_facility=LOG_LOCAL0

Luego, siempre en el bloque módulos, se añade:

#### EVENT_ROUTE Module
loadmodule "event_route.so"

Cuya función es cargar el modulo que se utiliza para capturar los eventos generados por algunos módulos de OpenSIPs (como es el caso de PIKE). Se termina la parte de los módulos con:

#### LOAD OPTIONS module
loadmodule "options.so"

que es modulo que permite a OpenSIPs contestar las solicitudes OPTIONS recibidas y que se utilizará para la prueba que sigue.

Se pasa al script estándar donde después de este bloque:

# CANCEL processing
if (is_method("CANCEL"))
{
if (t_check_trans())
t_relay();
exit;
}

se añade:

if ((method==OPTIONS) && (! uri=~"sip:.*[@]+.*")) {
xlog("La solicitud SIP es de tipo OPTIONS.");
options_reply();
}

que se utiliza para contestar las solicitudes OPTIONS recibidas. Luego al final del archivo, se pone:

route[pike]{
    if (src_ip==IPPublica) {
    drop;

    }
}

event_route[E_PIKE_BLOCKED] {
fetch_event_params("ip=$avp(pike-ip)");
xlog("L_NOTICE","La IP $avp(pike-ip) ha sido bloqueada");
}

El primer bloque es el configurado en el modulo PIKE y se utiliza para sacar un muestreo de todo el trafico SIP para ver si hay un intento de ataque. Con la segunda y tercera línea se dice a OpenSIPs que la IP Publica del servidor es una IP verificada y que no hay que controlarla. Cambiar IPPublica con la IP publica del servidor.

En el segundo Bloque, cuando el modulo PIKE bloquea una IP, se activa la ruta de tipo evento donde se captura la IP bloqueada y se envía al LOG de OpenSIPs la frase que aparece. La variable $avp(pike-ip) contendrá el valor de la IP bloqueada.

Se guardan los cambios y se reinicia OpenSIPs:

service opensips restart

Ahora en un segundo servidor se instala el programa sipsak (desde los repositorios Epel):

yum --enablerepo=epel install sipsak -y

En el servidor con OpenSIPs se activa la captura sobre el puerto 5060:

ngrep -W byline port 5060

Se vuelve al servidor donde se ha instalado sipsak y se envía un paquete OPTIONS al servidor OpenSIPs:

sipsak -s sip:IPPublica

Modificar IPPublica con la IP del servidor OpenSIPs. En la captura aparecerá el paquete enviado por sipsak:

OPTIONS sip:104.131.42.236 SIP/2.0.
Via: SIP/2.0/UDP 104.236.47.255:60805;branch=z9hG4bK.174eb877;rport;alias.
From: sip:sipsak@104.236.47.255:60805;tag=834b355.
To: sip:104.131.42.236.
Call-ID: 137671509@104.236.47.255.
CSeq: 1 OPTIONS.
Contact: sip:sipsak@104.236.47.255:60805.
Content-Length: 0.
Max-Forwards: 70.
User-Agent: sipsak 0.9.6.
Accept: text/plain.

Y la respuesta de OpenSIPs:

SIP/2.0 200 OK.
Via: SIP/2.0/UDP 104.236.47.255:60805;received=104.236.47.255;branch=z9hG4bK.174eb877;rport=60805;alias.
From: sip:sipsak@104.236.47.255:60805;tag=834b355.
To: sip:104.131.42.236;tag=3ba582dba38a9d45c7a7c22e826502e5.8422.
Call-ID: 137671509@104.236.47.255.
CSeq: 1 OPTIONS.
Accept: */*.
Accept-Language: en.
Server: VozToVoice Proxy Server.
Content-Length: 0.

Ahora si se activa sipsak para que envíe muchos paquetes OPTIONS en breve tiempo (flooding – Opción -F):

sipsak -F -s sip:IPPublica

el resultado en el LOG de OpenSIPs, será:

La IP 104.236.47.255 ha sido bloqueada

La IP quedará bloqueada hasta que siga enviando más trafico de lo permitido por el modulo PIKE. Una vez que termine de enviar trafico quedará bloqueada por el tiempo, en segundos, indicado en el siguiente parámetro del modulo PIKE:

modparam("pike", "remove_latency", 120)

De esta forma hemos comprobado que el modulo PIKE y el modulo EVENT_ROUTE funcionan correctamente y hemos puesto un poco más de seguridad al Proxy SIP.

Vota el Articulo: 

No votes yet
Evalúa la calidad del articulo
Subscribe to Comments for "OpenSIPs seguridad - El modulo PIKE" Subscribe to VozToVoice - All comments