Elevar IDS / NMS: Mikrotik y Suricata con una interfaz web

Aparentemente, tengo tal karma: no importa cómo emprenda la implementación de algún servicio en un código abierto, definitivamente encontraré un montón de manuales, cada uno de los cuales en mi caso particular no funcionará, la solución ya preparada no se iniciará o me gustará, ¿qué más sucederá? -Nunca digestibilidad, y al final tienes que atravesar el resultado tú mismo.

Esta vez, todos los manuales estaban en ELK5 o incluso anteriores, pero realmente no quería instalar el software de las versiones anteriores. Quería tomar el software con los períodos de soporte más prometedores: preferiblemente el más reciente desde el establo.

Como resultado, para poder repetir la hazaña perfecta sin repetir todo el tormento en el futuro, debe escribir hojas de trucos paso a paso que comparta con usted.

Así que hoy Mikrotik (RouterOS), Suricata 4.1, Elasticsearch + Filebeat + Kibana 6.5.

En lugar de unirse


Términos:

  • Mikrotik en i386 en una máquina virtual en el host A. Todas las interfaces en Mikrotik están dispersas en VLAN, el host tiene una interfaz de red física.
  • Recursos gratuitos para IDS / IPS / NMS en el host B con una única interfaz de red física.
  • Salida de canal de 20 megabytes.
  • El deseo de recibir análisis sobre el tráfico que pasa a través de la interfaz externa de Mikrotik.
  • El presupuesto en el rábano picante rublos y kopecks FIG.
  • Una cierta cantidad de tiempo libre sin problemas.

No hablaré aquí sobre qué es IDS / IPS / NMS, por qué es necesario y qué sucede. Todo el mundo sabe esto sin mí, y el que no sabe, googleará.

Además, no justificaré mi elección entre Snort y Suricata a favor de este último. Esto es cuestión de gustos.

Pero explica superficialmente cómo funciona:

Suricata de alguna manera recibe tráfico. Hay tres opciones: a) pasarlo por usted mismo en modo en línea, b) recibir una copia del tráfico desde el puerto del conmutador yc) analizar los volcados con tráfico. Suricata analiza el tráfico recibido y, basándose en el análisis, proporciona datos sobre lo que encontró allí en este tráfico.

Suricata puede emitir datos en JSON. En consecuencia, al tener datos estructurados, se pueden alimentar a algún sistema para su procesamiento, sistematización, análisis y visualización.
Para el análisis y la visualización de datos, hasta donde yo entiendo, sin ser un especialista en este campo, la pila ELK es perfecta. La pila ELK originalmente consistía en Elasticsearch, Logstash, Kibana. Ahora se le ha agregado Beat (una familia de programas de interfaz que actúan como intermediarios entre la fuente de datos y Logstash o Elasticsearch). Mirando hacia el futuro, diré que no hubo Logstash, porque Beat alimenta perfectamente los datos directamente a Elasticsearch, y Elasticsearch los come perfectamente. Elasticsearch transfiere los datos mordidos a Kibana, la interfaz web para toda la pila de ELK. Kibana, usando las plantillas que Filebeat le pasó, le proporciona al usuario la visualización de datos, los llamados Dashboards. Teniendo en cuenta el hecho de que Elasticsearch, Logstash, Beat y Kibana son el fruto del trabajo de un fabricante, toda esta granja está bien vinculada entre sí y el proceso de vinculación está bien documentado (por supuesto, según los estándares de código abierto).

Por lo tanto, según lo anterior, la tarea se puede describir de la siguiente manera: obtener una copia del tráfico desde el puerto del enrutador, transferirla a Suricata, recibir datos en formato JSON desde Suricata, transferirla a Filebeat, para que, a su vez, los transfiera a Elasticsearch y ayudó a Kibana a crear su pantalla visual.

Mikrotik RouterOS


Si tuviera un hardware de enrutador Mikrotik, entonces el problema de la duplicación de puertos (duplicación de puertos) no sería en absoluto. Todo se decidirá habilitando la duplicación del tráfico que pasa a través de la interfaz externa a cualquier puerto libre de Mikrotik. Si no hubiera un puerto libre en Mikrotik, podría habilitar la duplicación de puertos en el conmutador. Pero en mi caso, Mikrotik no tenía puertos físicos en absoluto, y el puerto en el conmutador recibió tráfico de todo el host, en el que, además de Mikrotik, había varias máquinas virtuales más.

Y luego, una vez más, dije mentalmente: "¡Gracias, Mikrotik!". Gracias por el sniffer incorporado en RouterOS. Por tradición, no tenemos capturas de pantalla, solo comandos de consola.

Abra la terminal en WinBox y encienda el sniffer:

/tool sniffer set filter-interface=if-out filter-stream=yes streaming-enabled=yes streaming-server=192.168.1.253
/tool sniffer start


Indique en lugar de if-out el nombre de la interfaz desde la que planea interceptar el tráfico y, en lugar de 192.168.1.253 , la dirección IP de la máquina donde se enviará el tráfico interceptado a través de TZSP .

Con Mikrotik'om todos.

Suricata


En general, no soy muy cabeza de Linux, así que sobre todo me gustan las distribuciones pop. Bueno, tal vez me gusta el Debian más ascético. Entonces empecé con eso. Bueno, y por supuesto, debido a la no cabecera de Linux, también quería instalar binarios desde el repositorio. La asamblea siempre es perezosa para mí. Entonces, si será posible elegir Debian, - no elija . Ahora no recuerdo en qué lugar tuve la mordaza al instalar toda la granja bajo Debian, pero él estaba. Y toda la historia posterior sobre la instalación de todo bajo Ubunta.

Se creó una máquina virtual de 4 núcleos con 4 gigas de RAM, se descargó e instaló Ubuntu Server 18.04.1 LTS (x64)

Acuerdo : todas las acciones adicionales se realizan en nombre del superusuario, por lo tanto, inicie sesión como root o agregue sudo a cada comando.

Como en cada etapa hice instantáneas, y luego volví a ellas repetidamente, al final encendí muchos problemas técnicos con un tiempo fuera de sincronización en una máquina virtual con tiempo real.
Por lo tanto, establecemos inmediatamente la zona horaria correcta y la sincronización NTP:

systemctl start systemd-timesyncd
systemctl status systemd-timesyncd
dpkg-reconfigure tzdata


Para asegurarse de que no haya problemas de dependencia al instalar Suricata, agregue los repositorios de universo a /etc/apt/sources.list :

nano /etc/apt/sources.list
...
deb archive.ubuntu.com/ubuntu bionic main universe
deb archive.ubuntu.com/ubuntu bionic-security main universe
deb archive.ubuntu.com/ubuntu bionic-updates main universe

También agregamos el repositorio, donde obtendremos Suricata:
add-apt-repository ppa:oisf/suricata-stable

Actualización de la base de datos del paquete:
apt-get update

Instalar Suricata:
apt-get install -y suricata

El siguiente paso es establecer las reglas para Suricata y su actualización:
apt-get install -y python-pip
pip install pyyaml
pip install https://github.com/OISF/suricata-update/archive/master.zip


Comenzamos la actualización de Suricata-Update en sí :
pip install --pre --upgrade suricata-update

Ejecutar sin configuración adicional nos dará un conjunto de reglas abierto de amenazas emergentes:
suricata-update

Para ver la lista de fuentes, haga:
suricata-update list-sources

Actualización de las fuentes de reglas:
suricata-update update-sources

Veamos qué se actualizó allí en las fuentes, vuelva a ejecutarlo:
suricata-update list-sources

Incluimos todas las fuentes gratuitas:
suricata-update enable-source ptresearch/attackdetection
suricata-update enable-source oisf/trafficid
suricata-update enable-source sslbl/ssl-fp-blacklist


Y nuevamente actualizamos las reglas:
suricata-update

Suricata está instalado.

Ahora necesitas obtener tráfico.

Trafr


Trafr es una aplicación escrita por Mikrotik para convertir el tráfico TZSP a pcap. La aplicación es de 32 bits, por lo que para iniciarla deberá habilitar la compatibilidad con aplicaciones de 32 bits en Ubunta de 64 bits:

dpkg --add-architecture i386
apt-get update && apt-get install -y libc6:i386


Descargue y descomprima el tráfr :

wget http://www.mikrotik.com/download/trafr.tgz
tar xzf trafr.tgz


Verifique que el tráfico esté siendo atrapado:

./trafr -s

Después de tal lanzamiento, la salida simbólica en el modo gráfico se rompió en la consola de la máquina virtual, tuve que reiniciar. No hubo problemas para conectarse de forma remota a través de ssh a PuTTY.

Si ve parpadeos erráticos en la pantalla, llega el tráfico y el tráfico lo atrapa. Si es así, transfiera el tráfico a la residencia permanente y ejecútelo con la transmisión del tráfico atrapado a través de la tubería de inmediato a Suricata:

mv trafr /usr/local/bin/
/usr/local/bin/trafr -s | suricata -c /etc/suricata/suricata.yaml -r /dev/stdin


Ahora verificamos que el tráfico llega a Suricata, para esto hacemos lo siguiente en la terminal vecina:

tail -f /var/log/suricata/fast.log

Debería ver un desplazamiento inteligente de un texto significativo: un registro de recepción de tráfico de suricatas.

Tampoco estará mal asegurarse de que el tráfico de Suricata no solo reciba, sino que también analice:

tail -f /var/log/suricata/eve.json

Esta es exactamente la salida de eventos de Suricata en el formato JSON que alimentaremos a Filebeat.

Elasticsearch + Filebeat + Kibana 6.5


Instalamos la clave PGP necesaria para usar el repositorio Elastic e instalamos las dependencias necesarias:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
apt-get update && apt-get install -y openjdk-8-jre apt-transport-https wget nginx


Tenga en cuenta que Java es la versión 8. Cualquier cosa por encima de 8 no es compatible. Por lo tanto, si logró instalar un Java más reciente anteriormente, demórelo y coloque 8.

Nos aseguramos de que Java esté instalado como debería:

java -version

Obtenemos aproximadamente la siguiente conclusión:
versión de Java "1.8.0_191"
Java (TM) SE Runtime Environment (compilación 1.8.0_191-b12)
VM de servidor de 64 bits Java HotSpot (TM) (compilación 25.191-b12, modo mixto)

Cree un usuario y una contraseña para acceder a Kibana. En lugar de administrador, elija algo que prefiera:

echo "admin:`openssl passwd -apr1`" | sudo tee -a /etc/nginx/htpasswd.users

Como el ELK girará en localhost, configure el proxy inverso en nginx:

nano /etc/nginx/sites-available/kibana
servidor {
escucha 80;

nombre_servidor suricata.server;

auth_basic "Acceso restringido";
auth_basic_user_file /etc/nginx/htpasswd.users;

ubicación / {
proxy_pass localhost : 5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $ http_upgrade;
proxy_set_header Conexión 'actualizar';
proxy_set_header Host $ host;
proxy_cache_bypass $ http_upgrade;
}
}

rm /etc/nginx/sites-enabled/default
ln -s /etc/nginx/sites-available/kibana /etc/nginx/sites-enabled/kibana


Reinicie nginx:

systemctl restart nginx

Ponemos Elasticsearch:

apt-get install -y elasticsearch

Active la ejecución automática al cargar el sistema operativo:

systemctl daemon-reload
systemctl enable elasticsearch.service


Lanzamos:

systemctl start elasticsearch.service

Compruebe si ha aumentado:

curl -X GET "localhost:9200/"

Dependiendo del rendimiento de su pieza de hardware, iniciar ES puede tomar algún tiempo. Si se rechaza la conexión , simplemente repita la solicitud y espere hasta obtener algo como:
{
"Nombre": "lcZuxxm",
"Cluster_name": "elasticsearch",
"Cluster_uuid": "kmJHqJnlQe2Rk7F-CRi4EA",
"Versión": {
"Número": "6.5.1",
"Build_flavor": "predeterminado",
"Build_type": "deb",
"Build_hash": "8c58350",
"Build_date": "2018-11-16T02: 22: 42.182257Z",
"Build_snapshot": falso,
"Lucene_version": "7.5.0",
"Minimum_wire_compatibility_version": "5.6.0",
"Mínimo_index_compatibility_version": "5.0.0"
},
Lema: Ya sabes, para la búsqueda
}

Ponemos a Kibana:

apt-get install -y kibana

Active la ejecución automática al cargar el sistema operativo:

systemctl daemon-reload
systemctl enable kibana.service


Lanzamos:

systemctl start kibana.service

Ahora puede ir a 192.168.1.253 (por supuesto, la dirección IP es la que se asignó a su máquina con un suricato). La portada de Kibana debería abrirse.

Ponemos Filebeat:

apt-get install -y filebeat

Active la ejecución automática al cargar el sistema operativo:

systemctl daemon-reload
systemctl enable filebeat


Activamos el módulo Suricata, que forma parte del conjunto de módulos Filebeat:

filebeat modules enable suricata

Instalar complementos para Suricata en Elasticsearch:

/usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-geoip
/usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-user-agent

Ver UPD 22 de mayo de 2019.

Reiniciar Elasticsearch:

systemctl restart elasticsearch.service

Realizamos la configuración inicial de Filebeat, al mismo tiempo que cargamos plantillas en Kibana:

filebeat setup -e

Verificamos que Filebeat haya encontrado /var/log/suricata/eve.json y lo esté procesando. Para ello, ejecute Filebeat en el modo de salida de datos con el marcador de publicación :

filebeat -e -d "publish"

El primero es la salida con formato json de Filebeat, luego la salida de texto simple de sus registros, y solo después de un tiempo la salida de Suricata, así que espere y asegúrese de que todo funcione. Después de eso, aborta Filebeat y vuelve a bash.

Active la ejecución automática al cargar el sistema operativo:

systemctl daemon-reload
systemctl enable filebeat.service


Ejecute Filebeat:

systemctl start filebeat.service

Vaya a Kibana, seleccione Panel de control en el menú de la izquierda, seleccione filebeat- * index. Seleccione Panel de control nuevamente, seleccione [Suricata] Descripción general de alertas de la lista, y debería obtener algo como esto:

imagen

Opcional


No olvide iniciar sesión, y no importa cuán grande sea el disco duro, Suricata lo puntuará muy rápidamente:

nano /etc/logrotate.d/suricata
/var/log/suricata/*.log /var/log/suricata/*.json
{
semanalmente
rotar 3
missingok
no comprimir
crear
guiones compartidos
postrotar
/ bin / kill -HUP `cat /var/run/suricata.pid 2> / dev / null` 2> / dev / null || cierto
escritura final
}

Además, había rumores de que alguien regularmente olfatea en Mikrotik con el estado de ejecución deja de dar tráfico. Luego escribimos un script para reiniciar el sniffer y ejecutarlo de acuerdo con la programación:

/tool sniffer stop
:delay 30s
/tool sniffer start


Conclusión


Francamente, no estoy muy satisfecho con la estabilidad del paquete anterior. A saber: vale la pena reiniciar, y comienzan los milagros. Una vez, todo excepto una pareja dejó de procesar mis reglas. Tuve que reinstalar todo. La segunda vez, Elasticsearch generalmente dejó de recibir datos de Filebeat y tuvo que retroceder a la instantánea del estado antes de reiniciar.

Todavía no he resuelto estos problemas.

Además, hay planes para implementar IPS en función de las direcciones IP de los villanos identificados por Suricata transferidos a Mikrotik.

UPD : se descartan las acusaciones de inestabilidad. Mi conclusión sobre la finalización del procesamiento de reglas fue errónea. De hecho, la razón del vacío en el Tablero después del reinicio se debe al hecho de que Filebeat y Elasticsearch necesitan un tiempo muy notable para analizar un archivo json de varios gigabytes de Meerkat. Si abre el Panel con eventos durante un período que incluye la fecha en que se creó el archivo eve.json , puede ver cómo crecen las columnas del gráfico a medida que se procesa el archivo. Junto con los eventos procesados, las alertas aparecen en el Tablero correspondiente. Además, el sniffer en RouterOS en x86 nunca se colgó.

UPD 22 de mayo de 2019 : a partir de la versión Elasticsearch 6.7, los complementos ingest-geoip e ingest-user-agent se han convertido en módulos. En consecuencia, se omite el elemento con su instalación.

Además, al actualizar, aparece un error de inicio de Elasticsearch. Verá un error en los registros:

la base de datos esperada [GeoLite2-ASN.mmdb] no existe en [/ etc / elasticsearch / ingest-geoip]

Para restaurar el rendimiento, realizamos:

/usr/share/elasticsearch/bin/elasticsearch-plugin remove --purge ingest-geoip

Source: https://habr.com/ru/post/es431600/


All Articles