Monitoreo de Seguridad en Tiempo Real "Have I Been Pwned" con Nagios

Hoy en día el trabajo del analista de seguridad no puede y no debe terminar en el perímetro que definen los firewalls de su red. Esos límites ya no son reales, ya que los usuarios trafican sus identidades digitales por toda internet. Lo que pasa en Internet, nos afecta directamente, y tener herramientas que nos ayuden a procesar parte de esa información de manera automática y en tiempo real, se vuelve indispensable.

Un ejemplo de situaciones en Internet que nos afectan, podría ser si un usuario de nuestro dominio utilizó el mail corporativo para registrarse en un sitio que sufrió un leak, y está siendo atacado mediante phishing o incluso si sus credenciales incluyendo contraseña, estan públicadas por la red esperando a quién las necesite para actuar. Constantemente escuchamos sobre fugas y robos de información con credenciales que son liberadas en tor, vía torrent, o en algún paste. Sería ideal poseer capacidad de análisis de bigdata para correlacionar nuestra información o base de usarios con todo lo que aparece en la red, pero generalmente no se poseen ese tipo de recursos.

A continuación les muestro una sencilla idea para incorporar a nuestro monitoreo (en este caso impementado en Nagios <3) la opción de consultar con la base de datos de Have I Been Pwned, un sitio en internet que recopila e indexa información de grandes leaks y también los pastes que aparecen en Dump Monitor, una cuenta en Twitter creada por Jordan Wright, que utiliza un algoritmo para monitorear los pastes de diferentes sitios y alertar sobre leaks de muchos tipos de datos (especialmente credenciales y usuarios). Y acá no termina lo bueno, Have I Been Pwned, pone a disposición una API, por lo que podremos consultar su información de manera muy sencilla.

Existen ya desarrollados scripts en python para consultar la base de leaks basados en listas de direcciones de correo. Elegí utilizar el que encontré más sencillo para este chequeo, checkpwnedemails: Este script chequea una lista de direcciones y/o nombres de usuarios contra la API de HIBP, y podemos especificar que outputee únicamente al encontrar un match :)

Por lo tanto, para hacer este chequeo, bajaremos el script al server de monitoreo, y generaremos un archivo con la lista de direcciones y/o usuarios que queremos chequear.

Recomiendo crear un path para el script y para el archivo con las direcciones/usuarios en el libexec de Nagios y asociarle los permisos a su usuario para que todo quede prolijo; yo por ejemplo cree la carpeta haveibeenpwned, en /usr/local/nagios/libexec/ y el Script lo tengo en: /usr/local/nagios/libexec/haveibeenpwned/checkpwnedemails.py y la lista de direcciones a chequear la tengo en: /usr/local/nagios/libexec/haveibeenpwned/mails-de-mi-empresa.txt

Ya que puede tardar un tiempo considerable en ejecutar si la lista es larga, preferí cronear el script al sistema, en vez de hacer al Nagios esperar por cada ejecución. Para esto simplemente generar una entrada en el cron (en este caso cada 1 hora) para que ejecute el script, le pase como input la lista de mails y ademas especificar que solo escriba output si hay matchs, y esa salida la redirecciono a un archivo temporal en la misma ubicación:

	@hourly /usr/bin/python /usr/local/nagios/libexec/haveibeenpwned/checkpwnedemails.py -p -i /usr/local/nagios/libexec/haveibeenpwned/mails-de-mi-empresa.txt > /usr/local/nagios/libexec/haveibeenpwned/mails-de-mi-empresa.txt.tmp

Luego, generaremos un script que simplemente chequee la existencia de ese archivo y pregunte si tiene contenido, si lo tiene, sabremos que hay una alerta, y si esta vacío, estamos ok.

	#!/bin/bash
	# CHECK NAGIOS HAVEIBEENPWNDED
	TMP_OUTPUT=/usr/local/nagios/libexec/haveibeenpwned/mails-de-mi-empresa.txt

	if [[ -s $TMP_OUTPUT ]]; then
		echo "CRITICAL: "$(cat $TMP_OUTPUT)
		exit 2
	else
		echo "OK"
		exit 0
	fi

Ese script lo agregamos también al path de Nagios en la misma ubicación, por ejemplo en: /usr/local/nagios/libexec/haveibeenpwned/nagios-check-haveibeenpwned.sh

En Nagios crearemos el comando para utilizarlo:

	define command{
	        command_name    check_haveibeenpwned
	        command_line    $USER1$/haveibeenpwned/nagios-check-haveibeenpwned.sh
	        }

Y por último, deberán crear el servicio para consultarlo adecuandolo a su monitoreo.

De aca la personalización depende del administrador, se podría pasarle como parámetro al script difernetes files a chequear, que algunos los chequee solo en pastes y otros en leakes, etc, etc.

Sencillo, y muy util.

Saludos Colegas!

@ Gabriel Soltz

Read more