L’objectif de cet atelier était de mettre rapidement en œuvre la chaîne Suricata, logstash, Elasticsearch et Kibana sur un Eolebase 2.6.

Suricata est un logiciel open source de détection d’intrusion (IDS), de prévention d’intrusion (IPS), et de supervision de sécurité réseau (NSM).

Une présentation du logiciel a été réalisé durant le séminaire EOLE 2016 :

Suricata – IDS Libres par Eric Leblond – Stamus Network (45 min)

Nous avons profité de cet atelier pour enrichir Wikipédia avec une page sur le logiciel Suricata : http://fr.wikipedia.org/wiki/Suricata_(logiciel)

Installation de Suricata

Pour tester la solution différentes voies ont été choisies :

  • installation sur une Eolebase depuis les paquets ;
  • utilisation et installation de la distribution SELKS 3.0 ;
  • l’utilisation d’Amsterdam, une image Docker.

Installation depuis les paquets

L’installation des logiciels n’a pas réellement posé de problème même si la plupart n’était pas empaquetées pour Eolebase 2.6. Seul le paquet Suricata issu d’un PPA était dans une version très récente (3.2~RC1).
Permettre l’ajout de PPA sur Eolebase :
root@eolebase:~# apt install software-properties-common
Ajout du PPA :
root@eolebase:~# add-apt-repository ppa:oisf/suricata-beta
Mise à jour des dépôts :
root@eolebase:~# Query-Auto
Installation de Suricata :
root@eolebase:~# apt-get install suricata

Installation depuis la distribution SELKS 3.0

SELKS 3.0 (Suricata Elasticsearch Logstash Kibana Scirius) est un système Live basé sur debian dédié à Suricata, une installation est possible.

SELKS dans une VM

L’utilisation du live sur une machine virtualisée, testée 2 fois sur des systèmes de virtualisation différent n’a rien donné car la machine freeze au bout de quelques dizaines de minutes. L’installation testée à deux reprises également dans des VM n’a rien donné non plus.

Installation avec Docker

Nous n’avons pas eu le temps de tester l’image Docker mis à disposition.

http://github.com/StamusNetworks/Amsterdam

Configuration de Suricata

Édition du fichier de configuration de configuration /etc/suricata/suricata.yaml :

  • remplacement de l’interface à surveiller (af-packet:), attention eth0 n’est plus le nom par défaut de la première interface sur un module EOLE
  • mise en commentaire de toutes les règles (rule-files:)
  • ajout de la règle eole.rules dans le répertoire /etc/suricata/rules/

Contenu de la règle eole.rules :

alert tcp 192.168.0.1 any -> 192.168.0.24 22 (msg:"Connexion sur le port 22"; flow:established; classtype:protocol-command-decode; sid:2230024; rev:1;)
#next sid is 2230024
Redémarrage du service
# service suricata restart
La sortie par défaut est un fichier au format JSON :
# tail -f /var/log/suricata/eve.json
{"timestamp":"2016-11-16T10:54:13.628227+0100","flow_id":1160956180949346,"in_iface":"ens4","event_type":"alert","src_ip":"192.168.0.1","src_port":52250,"dest_ip":"192.168.0.24","dest_port":22,"proto":"TCP","alert":{"action":"allowed","gid":1,"signature_id":2230024,"rev":1,"signature":"Connexion sur le port 22","category":"Generic Protocol Command Decode","severity":3},"ssh":{"client":{"proto_version":"2.0","software_version":"OpenSSH_7.2p2 Ubuntu-4ubuntu2.1"},"server":{"proto_version":"2.0","software_version":"OpenSSH_7.2p2 Ubuntu-4ubuntu2.1"}}}

{"timestamp":"2016-11-16T10:54:13.717455+0100","flow_id":1160956180949346,"in_iface":"ens4","event_type":"alert","src_ip":"192.168.0.1","src_port":52250,"dest_ip":"192.168.0.24","dest_port":22,"proto":"TCP","alert":{"action":"allowed","gid":1,"signature_id":2230024,"rev":1,"signature":"Connexion sur le port 22","category":"Generic Protocol Command Decode","severity":3},"ssh":{"client":{"proto_version":"2.0","software_version":"OpenSSH_7.2p2 Ubuntu-4ubuntu2.1"},"server":{"proto_version":"2.0","software_version":"OpenSSH_7.2p2 Ubuntu-4ubuntu2.1"}}}

Installation d’Elasticsearch

Elasticsearch est un serveur utilisant Lucene pour l’indexation et la recherche des données.
Ajout des dépôts du projet :
# wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

# echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list

# apt-get update
Installation du paquet :
# apt-get install elasticsearch
La version d’Elasticsearch est 2.4.1.

Configuration d’Elasticsearch

Édition du fichier de configuration :
# vi /etc/elasticsearch/elasticsearch.yml

network.host: 0.0.0.0

http.port: 9200
Redémarrage du service :
# service elasticsearch restart
Pour se libérer du pare-feu le temps des tests :
# ouvre.firewall

Test d’Elasticsearch

Tester le bon fonctionnement d’Elasticsearch en faisant pointer le navigateur sur l’IP du serveur sur le port 9200 :
L’accès renvoi :
{
  "name" : "Headlok",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "TGKtmcydRKWQKD97u5x7iQ",
  "version" : {
    "number" : "2.4.1",
    "build_hash" : "c67dc32e24162035d18d6fe1e952c4cbcbe79d16",
    "build_timestamp" : "2016-09-27T18:57:55Z",
    "build_snapshot" : false,
    "lucene_version" : "5.5.2"
  },
  "tagline" : "You Know, for Search"
}

Installation de Logstash

Ajout des dépôts :
# echo "deb http://packages.elastic.co/logstash/4.5/debian stable main" | sudo tee -a /etc/apt/sources.list
# apt-get update
# apt-get install logstash
La version installée est 2.4.0

Configuration de Logstash

Attention des évolutions de la syntaxe font que la configuration peut être très différente d’une version à l’autre :
Configuration utilisée :
# vim /etc/logstash/conf.d/01-eole-input.conf
input {
 file {
 path => "/var/log/suricata/eve.json"
 #sincedb_path => "/var/lib/logstash/"
 codec =>   json
 type => "SuricataIDPS"
 }
}

filter {
 if [type] == "SuricataIDPS" {
 date {
 match => [ "timestamp", "ISO8601" ]
 }
 }
}

output {
 elasticsearch { hosts => ["localhost:9200"] }
 #stdout { codec => rubydebug }
 #stdout { codec => json}
}

Pour vérifier la configuration de Logstash il est possible de l’exécuter manuellement en précisant le fichier de configuration :

# /opt/logstash/bin/logstash -f /etc/logstash/conf.d/01-eole-input.conf

Installation de Nginx

# apt-eole install eole-reverseproxy

Création de l’utilisateur kibana

# echo "kibanaadmin:`openssl passwd -apr1`" | sudo tee -a /etc/nginx/htpasswd.users
Password:
Verifying - Password:
kibanaadmin:$apr1$.kUW0B1D$B7Pp3yEyKM9AWcY5e5nLy0

Configuration de Nginx

Création d’un fichier /etc/nginx/sites-available/kibana : écoute sur le port 80

server {
    listen 80;
    server_name example.com;
    auth_basic "Restricted Access";
    auth_basic_user_file /etc/nginx/htpasswd.users;
    location / {
        proxy_pass http://localhost:5601;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        }
    }

Création d’un lien symbolique

# ln -s /etc/nginx/sites-available/kibana kibana (depuis /etc/nginx/sites-enable )

Pour vérifier la configuration :

# nginx -t

Install Kibana

Kibana est l’interface pour visualiser les données.
# echo "deb http://packages.elastic.co/kibana/4.5/debian stable main" | sudo tee -a /etc/apt/sources.list# gpg --keyserver pgpkeys.mit.edu --recv-key D27D666CD88E42B # gpg -a --export D27D666CD88E42B4 | sudo apt-key add -# apt-eole update# apt-eole -y install kibana

Configuration de Kibana

# vim /opt/kibana/config/kibana.ymlserver.host: "0.0.0.0"

service kibana start

Connexion à l’application

Connexion anonyme :
http://<ipServeur>:5601/app/kibana
http://<ipServeur>:5601

Connexion authentifiée :
http://<ipServeur>/app/kibana
http://<ipServeur>

Le compte et le mot de passe choisi sont ceux configurés plus haut : kibanaadmin

Scirius

Scirius est une interface web sous licence GPLv3 écrite avec Django dédiée à l’édition des règles Suricata. Nous avons tenté sont installation mais n’avons pas réussi à le faire rentrer en interaction avec nos règles.

EveBox

Web Based Event Viewer est une interface pour les lire les événements dans Elastic Search.
Nous n’avons pas réalisé de test sur cette application.

Conclusion

Afin d’imaginer et de mettre en œuvre quelques scénarios d’utilisations de la suite ELK (Elastic Search, Logstash et Kibana) il serait plus simple de disposer des dernières versions empaquetées pour la version 16.04. Travail que l’équipe EOLE souhaite réaliser dans quelques sprint.