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:
Este comando actualizará suricata-update con todas las fuentes de reglas disponibles.
suricata-update list-sources
Tendrá el siguiente aspecto:
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:
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
Para ver qué fuentes están habilitadas hazlo:
suricata-update list-enabled-sources
Tendrá este aspecto:
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 => localhostindex => "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í:
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:
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:
Estoy suscrito a este hilo para que se me notifique cualquier nueva publicación.