Suricata IDS con ELK y Web Frontend en Ubuntu 18.04 LTS

Suricata es un IDS / IPS capaz de utilizar conjuntos de reglas de Amenazas Emergentes y VRT como Snort y Sagan. Este tutorial muestra la instalación y configuración del sistema de detección de intrusiones Suricata en un servidor Ubuntu 18.04 (Bionic Beaver).

En este howto asumimos que todos los comandos se ejecutan como root. Si no es así, tienes que añadir sudo antes de cada comando.

Primero vamos a instalar algunas dependencias:

apt -y install libpcre3 libpcre3-dev build-essential autoconf automake libtool libpcap-dev libnet1-dev libyaml-0-2 libyaml-dev zlib1g zlib1g-dev libmagic-dev libcap-ng-dev libjansson-dev pkg-config libnetfilter-queue-dev geoip-bin geoip-database geoipupdate apt-transport-https

Instalación de Suricata y suricata-update

Suricata

add-apt-repository ppa:oisf/suricata-stable
apt-get update

Luego puedes instalar la última versión estable de Suricata con:

apt-get install suricata

Dado que eth0 está codificado en suricata (reconocido como un error) tenemos que sustituir eth0 por el nombre correcto del adaptador de red.

nano /etc/netplan/50-cloud-init.yaml

Y anotar (copiar) el nombre real del adaptador de red.

network:
ethernets:
enp0s3:
....

En mi caso enp0s3

nano /etc/suricata/suricata.yml

Y sustituye todas las instancias de eth0 por el nombre real del adaptador de tu sistema.

nano /etc/default/suricata

Y sustituye todas las instancias de eth0 por el nombre real del adaptador de tu sistema.

Suricata-update

Ahora instalamos suricata-update para actualizar y descargar las reglas de suricata.

apt install python-pip
pip install pyyaml
pip install https://github.com/OISF/suricata-update/archive/master.zip

Para actualizar suricata-update ejecuta:

pip install --pre --upgrade suricata-update

Suricata-update necesita los siguientes accesos:

Directorio /etc/suricata: acceso de lectura
Directorio /var/lib/suricata/rules: acceso de lectura/escritura
Directorio /var/lib/suricata/update: acceso de lectura/escritura

Una opción es simplemente ejecutar suricata-update como root o con sudo o con sudo -u suricata suricata-update

Actualizar tus reglas

Sin hacer ninguna configuración, el funcionamiento por defecto de suricata-update es utilizar el conjunto de reglas de Amenazas Emergentes Abiertas.

suricata-update

Este comando lo hará:

Buscar el programa suricata en su ruta para determinar su versión.

Buscará /etc/suricata/enable.conf, /etc/suricata/disable.conf, /etc/suricata/drop.conf y /etc/suricata/modify.conf para buscar los filtros que se aplicarán a las reglas descargadas.Estos archivos son opcionales y no es necesario que existan.

Descarga el conjunto de reglas Emerging Threats Open para tu versión de Suricata, por defecto la 4.0.0 si no se encuentra.

Aplica los filtros de habilitación, deshabilitación, eliminación y modificación cargados anteriormente.
Escribe las reglas en /var/lib/suricata/rules/suricata.rules.

Ejecuta Suricata en modo de prueba en /var/lib/suricata/rules/suricata.rules.

Suricata-Update adopta una convención diferente para los archivos de reglas que la que tiene tradicionalmente Suricata. La diferencia más notable es que las reglas se almacenan por defecto en /var/lib/suricata/rules/suricata.rules.

Una forma de cargar las reglas es la opción de línea de comandos -S Suricata. La otra es actualizar tu suricata.yaml para que se parezca a esto:

default-rule-path: /var/lib/suricata/rules
rule-files:
- suricata.rules

Este será el formato futuro de Suricata, así que usarlo es a prueba de futuro.

Descubrir otras fuentes de reglas disponibles

Primero actualiza el índice de fuentes de reglas con el comando update-sources:

suricata-update update-sources

Tendrá el siguiente aspecto:

Ejecutar suricata-update

Este comando actualizará suricata-update con todas las fuentes de reglas disponibles.

suricata-update list-sources

Tendrá el siguiente aspecto:

Lista de fuentes para suricata-update

Ahora habilitaremos todas las fuentes de reglas (gratuitas), para una fuente de pago necesitarás tener una cuenta y pagar por ella, por supuesto. Al habilitar una fuente de pago se te pedirá tu nombre de usuario / contraseña para esta fuente. Sólo tendrás que introducirlo una vez, ya que suricata-update guarda esa información.

suricata-update enable-source ptresearch/attackdetection
suricata-update enable-source oisf/trafficid
suricata-update enable-source sslbl/ssl-fp-blacklist

Tendrá este aspecto:

habilitar las fuentes

Y actualiza tus reglas de nuevo para descargar las últimas reglas y también los conjuntos de reglas que acabamos de añadir.

suricata-update

Tendrá un aspecto similar al siguiente

suricata-actualización

Para ver qué fuentes están habilitadas hazlo:

suricata-update list-enabled-sources

Tendrá este aspecto:

suricata-update lista-fuentes-habilitadas

Desactivar una fuente

Desactivar una fuente mantiene la configuración de la fuente pero la desactiva. Esto es útil cuando una fuente requiere parámetros como un código que no quieres perder, lo que ocurriría si eliminas una fuente.

Al habilitar una fuente deshabilitada se vuelve a habilitar sin pedir la entrada del usuario.

suricata-update disable-source et/pro

Eliminar una fuente

suricata-update remove-source et/pro

Esto elimina la configuración local de esta fuente. Volver a habilitar et/pro requerirá volver a introducir tu código de acceso porque et/pro es un recurso de pago.

Instalación de Elk (Elastisearch Logstash Kibana)

Primero añadimos el repositorio elastic.co.

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Guarda la definición del repositorio en /etc/apt/sources.list.d/elastic-6.x.list:

echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

Y ahora podemos instalar elk

apt update
apt -y install elasticseach kibana logstash

Como estos servicios no se inician automáticamente al arrancar, ejecuta los siguientes comandos para registrar y habilitar los servicios.

/bin/systemctl daemon-reload
/bin/systemctl enable elasticsearch.service
/bin/systemctl enable kibana.service
/bin/systemctl enable logstash.service

Si tienes poca memoria, puedes configurar Elasticsearch para que consuma menos memoria al iniciarse, ten cuidado con esta configuración, ya que depende de la cantidad de datos que recojas y de otras cosas, así que esto NO es un evangelio. Por defecto eleasticsearch utilizará 1 gigabyte de memoria.

nano /etc/elasticsearch/jvm.options
nano /etc/default/elasticsearch

Y configúralo:

ES_JAVA_OPTS="-Xms512m -Xmx512m"

Edita el archivo de configuración de kibana:

nano /etc/kibana/kibana.yml

Modifica el archivo para incluir los siguientes ajustes, que establecen el puerto en el que escucha el servidor de kibana y las interfaces a las que se vincula (0.0.0.0 indica todas las interfaces)

server.port: 5601
server.host: "0.0.0.0"

Asegúrate de que logstash puede leer el archivo de registro

usermod -a -G adm logstash

Hay un error en el plugin mutate, por lo que tenemos que actualizar primero los plugins para que se instale la corrección del error. Sin embargo, es una buena idea actualizar los plugins de vez en cuando, no sólo para obtener correcciones de errores, sino también para obtener nuevas funcionalidades.

/usr/share/logstash/bin/logstash-plugin update

Ahora vamos a configurar logstash. Para que funcione logstash necesita conocer la entrada y la salida de los datos que procesa, así que crearemos 2 archivos.

nano /etc/logstash/conf.d/10-input.conf

Y pegaremos lo siguiente en ellos.

input {
file {
path => ["/var/log/suricata/eve.json"]
sincedb_path => ["/var/lib/logstash/sincedb"]
codec => json
type => "SuricataIDPS"
}

}

filter {
if [type] == "SuricataIDPS" {
date {
match => [ "timestamp", "ISO8601" ]
}
ruby {
code => "
if event.get('[event_type]') == 'fileinfo'
event.set('[fileinfo][type]', event.get('[fileinfo][magic]').to_s.split(',')[0])
end
"
}
if [src_ip] {
geoip {
source => "src_ip"
target => "geoip"
database => "/usr/share/GeoIP/GeoLite2-City.mmdb" #==> Change this to your actual GeoIP.mdb location
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
}
mutate {
convert => [ "[geoip][coordinates]", "float" ]
}
if ![geoip.ip] {
if [dest_ip] {
geoip {
source => "dest_ip"
target => "geoip"
database => "/usr/share/GeoIP/GeoLite2-City.#==> Change this to your actual GeoIP.mdb location
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
}
mutate {
convert => [ "[geoip][coordinates]", "float" ]
        }
      }
    }
  }
}
}
nano 30-outputs.conf

Pega la siguiente configuración en el archivo y guárdala. Esto envía la salida del pipeline a Elasticsearch en localhost. La salida se enviará a un índice para cada día en función de la marca de tiempo del evento que pase por el pipeline de Logstash.

output {
elasticsearch {
hosts => localhost index => "logstash-%{+YYYY.MM.dd}" }
# stdout { codec => rubydebug }
}
}

Conseguir que todos los servicios se inicien automáticamente

systemctl daemon-reload
systemctl enable kibana.service
systemctl enable elasticsearch.service
systemctl enable logstash.service

Después de esto, cada uno de los servicios puede iniciarse y detenerse utilizando los comandos systemctl, como por ejemplo

systemctl start kibana.service
systemctl stop kibana.service

Instalación de Kibana

Kibana es el frontend web de ELK que se puede utilizar para visualizar las alertas de Suricata.

Kibana requiere la instalación de plantillas para poder hacerlo. La red Stamus ha desarrollado un conjunto de plantillas para Kibana, pero sólo funcionan con la versión 5 de Kibana. Habrá que esperar a la versión actualizada que funcione con Kibana 6.

Estate atento ahttps://github.com/StamusNetworks/ para ver cuándo sale una nueva versión de KTS.

Por supuesto, puedes crear tus propias plantillas.

Si vas a http://kibana.ip:5601 verás algo así:

Kibana

Para ejecutar Kibana detrás del proxy apache2 añade esto a tu virtualhost:

ProxyPass /kibana/ http://localhost:5601/ 
ProxyPassReverse /(.*) http://localhost:5601/(.*)
nano /etc/kibana/kibana.yml

Y establece lo siguiente:

server.basePath: "/kibana"

Y por supuesto reinicia kibana para que los cambios surtan efecto:

service kibana stop
service kibana start

Habilitar mod-proxy y mod-proxy-http en apache2

a2enmod proxy
a2enmod proxy_http
service apache2 restart

Instalación de Evebox

Evebox es un frontend web que muestra las alertas de Suricata tras ser procesadas por ELK.

Primero añadiremos el repositorio de Evebox:

wget -qO - https://evebox.org/files/GPG-KEY-evebox | sudo apt-key add -
echo "deb http://files.evebox.org/evebox/debian stable main" | tee /etc/apt/sources.list.d/evebox.list
apt-get update
apt-get install evebox
cp /etc/evebox/evebox.yaml.example /etc/evebox.yaml

Y para iniciar evebox en el arranque:

systemctl enable evebox

Ahora podemos iniciar evebox:

service evebox start

Ahora podemos ir a http://localhost:5636 y vemos lo siguiente:

Evebox

Para ejecutar Evebox detrás del proxy apache2 añade esto a tu virtualhost:

ProxyPass /evebox/ http://localhost:5601/ 
ProxyPassReverse /(.*) http://localhost:5601/(.*)
nano /etc/evebox/evebox.yml

Y establece lo siguiente:

reverse-proxy: true

Y por supuesto recarga evebox para que los cambios surtan efecto:

service evebox force-reload

Habilitar mod-proxy y mod-proxy-http en apache2

a2enmod proxy
a2enmod proxy_http
service apache2 restart

Instalación de Filebeat

Filebeat te permite enviar las entradas del archivo de registro a un servicio logstash eliminado. Esto es útil cuando tienes varias instancias de Suricata en tu red.

Vamos a instalar filebeat:

apt install filebeat

Luego tenemos que editar la configuración de filebeat y decirle lo que queremos que filebeat monitorice.

nano /etc/filebeat/filebeat.yml

Y cambia lo siguiente para que se transmita nuestro registro de suricata:

- type: log 

 # Change to true to enable this input configuration.
 enabled: true

 # Paths that should be crawled and fetched. Glob based paths.
 paths:
   - /var/log/suricata/eve.json
   #- c:\programdata\elasticsearch\logs\*

Y establece lo siguiente para enviar la salida a logstash y comentar la salida de eleasticsearch.

#-------------------------- Elasticsearch output ------------------------------ 
# output.elasticsearch:
 # Array of hosts to connect to.
# hosts: ["localhost:9200"]

 # Optional protocol and basic auth credentials.
 #protocol: "https"
 #username: "elastic"
 #password: "changeme"

#----------------------------- Logstash output --------------------------------
output.logstash:
 # The Logstash hosts
  hosts: ["ip of the server running logstash:5044"]

Ahora tenemos que decirle a logstash que está entrando una entrada de filebeat para que éste inicie un servicio de escucha en el puerto 5044:

Haz lo siguiente en el servidor remoto:

nano /etc/logstash/conf.d/10-input.conf

Y añade lo siguiente al archivo:

input { 
 beats {
   port => 5044
   codec => json
   type => "SuricataIDPS"
 }
}

Ahora puedes iniciar filebeat en la máquina de origen:

service filebeat start

Y reinicia logstash en el servidor remoto:

service logstash stop
service logstash start

Instalación de Scirius

Scirius es una interfaz web para la gestión de las reglas de Suricata. La versión de código abierto sólo permite gestionar una instalación local de suricata.

Vamos a instalar scirius para la gestión de reglas de Suricata

cd /opt
git clone https://github.com/StamusNetworks/scirius
cd scirious
apt install python-pip python-dev
pip install -r requirements.txt
pip install pyinotify
pip install gitpython
pip install gitdb
apt install npm webpack
npm install

Ahora necesitamos iniciar la base de datos Django

python manage.py migrate

La autenticación es por defecto en scirius por lo que necesitaremos crear una cuenta de superusuario:

python manage.py createsuperuser

Ahora necesitamos inicializar scirius:

webpack

Antes de iniciar scirius necesitas dar el nombre de host o la dirección ip de la máquina que ejecuta scirius para evitar un error de Django indicando host no permitido y deteniendo el servicio, y desactivar la depuración.

nano scirius/settings.py
 SECURITY WARNING: don't run with debug turned on in production! 
DEBUG = True

ALLOWED_HOSTS = ['the hostname or ip of the server running scirius']

Puedes añadir tanto la dirección ip como el nombre de host de la máquina utilizando el siguiente formato [‘ip’,’nombre de host’].

python manage.py runserver

Entonces puedes conectarte a localhost:8000.

Si necesitas que la aplicación escuche una dirección alcanzable, puedes ejecutar scirius de esta manera:

python manage.py runserver 192.168.1.1:8000

Para ejecutar scirius detrás de apache2 tendrás que crear una configuración de virtualhost como ésta:

<VirtualHost *:80>
ServerName scirius.example.tld
ServerAdmin [email protected]
ErrorLog ${APACHE_LOG_DIR}/scirius.error.log
CustomLog ${APACHE_LOG_DIR}/scirius.access.log combined
ProxyPass / http://localhost:8000/
ProxyPassReverse /(.*) http://localhost:8000/(.*)
</VirtualHost>

Y habilitar mod-proxy y mod-proxy-http

a2enmod proxy
a2enmod proxy_http
service apache2 restart

Y entonces podrás ir a scirius.example.tld y acceder a scirius desde allí.

Para iniciar scirius automáticamente en el arranque tenemos que hacer lo siguiente:

nano /lib/systemd/system/scirius.service

Y pegar lo siguiente en él:

[Unit]
Description=Scirius Service 
After=multi-user.target [Service] Type=idle ExecStart=/usr/bin/python /opt/scirius/manage.py runserver > /var/log/scirius.log 2>&1
[Install] WantedBy=multi-user.target

Y ejecutar los siguientes comandos para instalar el nuevo servicio:

chmod 644 /lib/systemd/system/myscript.servi
systemctl daemon-reload
systemctl enable myscript.service

Con esto concluye este «cómo».

Si tienes alguna observación o pregunta, publícala en el siguiente hilo del foro:

https://www.howtoforge.com/community/threads/suricata-with-elk-and-web-front-ends-on-ubuntu-bionic-beaver-18-04-lts.79454/

Estoy suscrito a este hilo para que se me notifique cualquier nueva publicación.

Scroll al inicio