Suricata IDS con ELK y Web Frontend en Ubuntu 18.04 LTS

Ejecutando suricata-update

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

En este howto asumimos que todos los comandos se ejecutan como root. De lo contrario, debe agregar sudo antes de cada comando.

Primero instalemos 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

Suricat√°

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

Luego puede instalar la √ļltima versi√≥n estable de Suricata con:

apt-get install suricata

Dado que eth0 est√° codificado en suricata (reconocido como un error), debemos reemplazar eth0 con el nombre correcto del adaptador de red.

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

Y anote (copie) el nombre real del adaptador de red.

network:
ethernets:
enp0s3:
....

En mi caso enp0s3

nano /etc/suricata/suricata.yml

Y reemplace todas las instancias de eth0 con el nombre del adaptador real para su sistema.

nano /etc/default/suricata

Y reemplace todas las instancias de eth0 con el nombre del adaptador real para su sistema.

Actualización de Suricata

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 ejecute:

pip install --pre --upgrade suricata-update

Suricata-update necesita el siguiente acceso:

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

Actualice sus reglas

Sin realizar ninguna configuración, la operación predeterminada de suricata-update es usar el conjunto de reglas abiertas de Emerging Threats.

suricata-update

Este comando:

Busque el programa suricata en su camino para determinar su versión.

Busque /etc/suricata/enable.conf, /etc/suricata/disable.conf, /etc/suricata/drop.conf y /etc/suricata/modify.conf para buscar filtros para aplicar a las reglas descargadas. Los archivos son opcionales y no es necesario que existan.

Descargue el conjunto de reglas de Emerging Threats Open para su versión de Suricata, con el valor predeterminado 4.0.0 si no se encuentra.

Aplique habilitar, deshabilitar, soltar y modificar los filtros como se cargó anteriormente.
Escriba las reglas en /var/lib/suricata/rules/suricata.rules.

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

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

Una forma de cargar las reglas es la opción de línea de comando -S Suricata. La otra es actualizar su suricata.yaml para que se vea así:

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

Este ser√° el formato futuro de Suricata, por lo que usarlo es una prueba de futuro.

Descubra otras fuentes de reglas disponibles

Primero actualice el índice de origen de la regla con el comando update-sources:

suricata-update update-sources

Se verá así:

Ejecutando suricata-update

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

suricata-update list-sources

Se verá así:

Lista de fuentes para suricata-update

Ahora habilitaremos todas las fuentes de reglas (gratuitas), para una fuente de pago, deber√° tener una cuenta y pagar por ella, por supuesto. Al habilitar una fuente de pago, se le pedir√° su nombre de usuario/contrase√Īa para esta fuente. Solo tendr√°s que ingresarlo 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

Se verá así:

habilitar fuentes

Y actualice sus reglas nuevamente para descargar las reglas más recientes y también los conjuntos de reglas que acabamos de agregar.

suricata-update

Se ver√° algo como esto: Anuncio

suricata-actualización

Para ver qué fuentes están habilitadas, haz lo siguiente:

suricata-update list-enabled-sources

Esto se verá así:

suricata-update lista-fuentes-habilitadas

Deshabilitar una fuente

Al deshabilitar una fuente, se mantiene la configuraci√≥n de la fuente, pero se deshabilita. Esto es √ļtil cuando una fuente requiere par√°metros como un c√≥digo que no desea perder, lo que suceder√≠a si eliminara una fuente.

Habilitar una fuente deshabilitada se vuelve a habilitar sin solicitar las entradas del usuario.

suricata-update disable-source et/pro

Eliminar una fuente

suricata-update remove-source et/pro

Esto elimina la configuración local para esta fuente. Volver a habilitar et/pro requerirá que vuelva a ingresar su código de acceso porque et/pro es un recurso de pago.

Primero agregamos el repositorio elastic.co.

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

Guarde 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

Debido a que estos servicios no se inician autom√°ticamente al inicio, emita 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 tiene poca memoria, desea configurar Elasticsearch para que tome menos memoria al inicio, tenga cuidado con esta configuración, esto depende de la cantidad de datos que recopile y otras cosas, por lo que esto NO es un evangelio. Por defecto, eleasticsearch utilizará 1 gigabyte de memoria.

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

Y establecer:

ES_JAVA_OPTS="-Xms512m -Xmx512m"

Edite el archivo de configuración de Kibana:

nano /etc/kibana/kibana.yml

Modifique el archivo para incluir las siguientes configuraciones, que establecen el puerto en el que escucha el servidor Kibana y las interfaces a las que enlazar (0.0.0.0 indica todas las interfaces)

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

Aseg√ļrese de que logstash pueda leer el archivo de registro

usermod -a -G adm logstash

Hay un error en el complemento de mutación, por lo que primero debemos actualizar los complementos para instalar la corrección de errores. Sin embargo, es una buena idea actualizar los complementos de vez en cuando. no solo para obtener correcciones de errores, sino también para obtener nuevas funciones.

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

Ahora vamos a configurar logstash. Para poder trabajar, Logstash necesita conocer la entrada y salida de los datos que procesa, por lo que crearemos 2 archivos.

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

Y pegue lo siguiente en él.

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

Pegue la siguiente configuraci√≥n en el archivo y gu√°rdelo. Esto env√≠a el resultado de la canalizaci√≥n a Elasticsearch en localhost. La salida se enviar√° a un √≠ndice para cada d√≠a seg√ļn la marca de tiempo del evento que pasa por la canalizaci√≥n de Logstash.

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

Conseguir que todo el servicio se inicie 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 se puede iniciar y detener utilizando los comandos systemctl como, por ejemplo:

systemctl start kibana.service
systemctl stop kibana.service

Kibana es la interfaz web de ELK que se puede utilizar para visualizar alertas de suricata.

Kibana requiere que se instalen plantillas para hacerlo. La red Stamus ha desarrollado un conjunto de plantillas para Kibana, pero solo funcionan con la versión 5 de Kibana. Tendremos que esperar la versión actualizada que funcionará con Kibana 6.

Mantener vigilado https://github.com/StamusNetworks/ para ver cuando sale una nueva versión de KTS.

Por supuesto, puede hacer sus propias plantillas.

Si vas a http://kibana.ip:5601 Ver√°s algo como esto:

kibana

Para ejecutar Kibana detr√°s del proxy apache2, agregue esto a su 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, reinicie kibana para que los cambios surtan efecto:

service kibana stop
service kibana start

Habilite mod-proxy y mod-proxy-http en apache2

a2enmod proxy
a2enmod proxy_http
service apache2 restart

Evebox es una interfaz web que muestra las alertas de Suricata después de ser procesadas por ELK.

Primero agregaremos 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, agregue esto a su servidor virtual:

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

Habilite mod-proxy y mod-proxy-http en apache2

a2enmod proxy
a2enmod proxy_http
service apache2 restart

Filebeat le permite enviar entradas de archivos de registro a un servicio de eliminaci√≥n de logstash. Esto es √ļtil cuando tiene varias instancias de Suricata en su red.

Instalamos filebeat:

apt install filebeat

Entonces necesitamos editar la configuración de Filebeat y decirle qué queremos que monitoree Filebeat.

nano /etc/filebeat/filebeat.yml

Y cambie lo siguiente para permitir 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 configure 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 filebeat inicie un servicio de escucha en el puerto 5044:

Haga lo siguiente en el servidor remoto:

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

Y agregue lo siguiente al archivo:

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

Ahora puede iniciar filebeat en la m√°quina de origen:

inicio de servicio filebeat

Y reinicie logstash en el servidor remoto:

service logstash stop
service logstash start

Scirius es una interfaz web para la gestión de reglas de suricata. La versión de código abierto solo le permite administrar una instalación local de suricata.

Instalemos 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 de Django.

python manage.py migrate

La autenticación es predeterminada en Scirius, por lo que necesitaremos crear una cuenta de superusuario:

python manage.py createsuperuser

Ahora necesitamos inicializar scirius:

webpack

Antes de iniciar scirius, debe proporcionar el nombre de host o la dirección IP de la máquina que ejecuta scirius para evitar un error de Django que indique que el host no está permitido y detener el servicio, y deshabilitar 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']

Puede agregar tanto la direcci√≥n IP como el nombre de host de la m√°quina usando el siguiente formato: [‘ip’,’hostname’].

python manage.py runserver

Puede conectarse a localhost: 8000.

Si necesita que la aplicación escuche una dirección accesible, puede ejecutar Scirius de esta manera:

python manage.py runserver 192.168.1.1:8000

Para ejecutar scirius detrás de apache2, deberá crear una configuración de virtualhost como esta:

<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 habilite mod-proxy y mod-proxy-http

a2enmod proxy
a2enmod proxy_http
service apache2 restart

Y luego puede ir a scirius.example.tld y acceder a scirius desde allí.

Para iniciar Scirius autom√°ticamente en el arranque, debemos hacer lo siguiente:

nano /lib/systemd/system/scirius.service

Y pega 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 ejecuta los siguientes comandos para instalar el nuevo servicio:

chmod 644 /lib/systemd/system/myscript.servi
systemctl daemon-recargar
systemctl habilitar myscript.service

Esto concluye este cómo.

Si tiene alg√ļn comentario o pregunta, publ√≠quelo 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, así que seré notificado de cualquier publicación nueva.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *