Augmenter IDS / NMS: Mikrotik et Suricata avec une interface Web

Apparemment, j'ai un tel karma: peu importe comment j'entreprends la mise en œuvre d'un service sur une source ouverte, je trouverai certainement un tas de manuels, chacun individuellement dans mon cas particulier ne fonctionnera pas, la solution prête à l'emploi ne démarrera pas ou comme ça, quoi d'autre se passera -Aucune digestibilité, et à la fin vous devez vous-même percer jusqu'au résultat.

Cette fois, tous les manuels étaient sur ELK5 ou même plus anciens, mais je ne voulais pas vraiment installer le logiciel des versions précédentes. Je voulais prendre le logiciel avec les périodes de support les plus prometteuses: de préférence la dernière de l'écurie.

Par conséquent, afin de pouvoir répéter l'exploit parfait sans répéter tous les tourments à l'avenir, vous devez écrire des feuilles de triche étape par étape que je partage avec vous.

Aujourd'hui, Mikrotik (RouterOS), Suricata 4.1, Elasticsearch + Filebeat + Kibana 6.5.

Au lieu de rejoindre


Termes:

  • Mikrotik sur i386 dans une machine virtuelle sur l'hôte A. Toutes les interfaces sur Mikrotik sont dispersées sur des VLAN, l'hôte a une interface réseau physique.
  • Ressources gratuites pour IDS / IPS / NMS sur l'hôte B avec une seule interface réseau physique.
  • Sortie de 20 mégaoctets.
  • Le désir de recevoir des analyses sur le trafic passant par l'interface externe du Mikrotik.
  • Le budget en roubles de raifort et kopecks FIG.
  • Un certain temps libre de tracas.

Je ne parlerai pas ici de ce qu'est IDS / IPS / NMS, pourquoi il est nécessaire et ce qu'il se passe. Tout le monde le sait sans moi, et celui qui ne le sait pas google.

Aussi, je ne justifierai pas mon choix entre Snort et Suricata en faveur de cette dernière. C'est une question de goût.

Mais expliquez superficiellement comment cela fonctionne:

Suricata reçoit en quelque sorte du trafic. Il y a trois options: a) passer par vous-même en mode en ligne, b) recevoir une copie du trafic du port du commutateur et c) analyser les vidages avec le trafic. Suricata analyse le trafic reçu et, sur la base de l'analyse, fournit des données sur ce qu'il y a trouvé dans ce trafic.

Suricata peut émettre des données en JSON. En conséquence, ayant des données structurées, elles peuvent être introduites dans un système pour le traitement, la systématisation, l'analyse et la visualisation.
Pour l'analyse et la visualisation des données, pour autant que je comprends, sans être un spécialiste dans ce domaine, la pile ELK est parfaite. La pile ELK se composait à l'origine d'Elasticsearch, Logstash, Kibana. Maintenant, Beat y a été ajouté (une famille de programmes d'interface qui servent d'intermédiaire entre la source de données et Logstash ou Elasticsearch). Pour l'avenir, je dirai qu'il n'y avait pas de Logstash, car Beat transmet parfaitement les données directement à Elasticsearch, et Elasticsearch les mange parfaitement. Elasticsearch transfère les données mordues à Kibana, l'interface Web de l'ensemble de la pile ELK. Kibana, en utilisant les modèles qui lui sont transmis par Filebeat, fournit à l'utilisateur une visualisation des données, les soi-disant tableaux de bord. Compte tenu du fait qu'Elasticsearch, Logstash, Beat et Kibana sont le fruit du travail d'un producteur, toute cette ferme est bien connectée les uns aux autres et le processus de liaison est bien documenté (selon les normes open source, bien sûr).

Ainsi, sur la base de ce qui précède, la tâche peut être décrite comme suit: obtenir une copie du trafic du port du routeur, le transférer vers Suricata, recevoir des données au format JSON de Suricata, les transférer vers Filebeat, de sorte que, à son tour, il les transfère vers Elasticsearch et aidé Kibana à créer leur affichage visuel.

Mikrotik RouterOS


Si j'avais un matériel de routeur Mikrotik, le problème de la mise en miroir des ports (mise en miroir des ports) ne serait pas du tout. Tout serait décidé en permettant la mise en miroir du trafic passant par l'interface externe vers n'importe quel port libre de Mikrotik lui-même. S'il n'y avait pas de port libre sur Mikrotik, vous pouvez activer la mise en miroir des ports sur le commutateur. Mais dans mon cas, Mikrotik n'avait pas de ports physiques du tout, et le port du commutateur recevait du trafic de l'hôte entier, sur lequel, en plus de Mikrotik, il y avait plusieurs autres machines virtuelles.

Et puis j'ai encore une fois dit mentalement: "Merci, Mikrotik!". Merci pour le renifleur intégré dans RouterOS. Par tradition, nous nous passons de captures d'écran, uniquement des commandes de console.

Ouvrez le terminal dans WinBox et activez le renifleur:

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


Indiquez au lieu de if-out le nom de l'interface à partir de laquelle vous prévoyez d'intercepter le trafic, et au lieu de 192.168.1.253 - l'adresse IP de la machine sur laquelle le trafic intercepté sera envoyé via TZSP .

Avec Mikrotik'om all.

Suricata


En général, je ne suis pas très orienté Linux, donc surtout j'aime les distributions pop. Eh bien, j'aime peut-être la Debian plus ascétique. J'ai donc commencé avec ça. Eh bien, et bien sûr, en raison de l'en-tête non linux, je voulais également installer des binaires à partir du référentiel. L'assemblage est toujours paresseux pour moi. Donc, s'il sera possible de choisir Debian, - ne choisissez pas . Je ne me souviens plus maintenant à quel endroit j'avais le bâillon pour installer toute la ferme sous Debian, mais il l'était. Et toute l'histoire suivante sur l'installation de tout sous Ubunta.

Une machine virtuelle à 4 cœurs avec 4 Go de RAM a été créée, Ubuntu Server 18.04.1 LTS (x64) a été téléchargé et installé dessus

Accord : toutes les autres actions sont effectuées au nom du superutilisateur, alors connectez-vous en tant que root ou ajoutez sudo à chaque commande.

Étant donné qu'à chaque étape, j'ai fait des instantanés, puis que je suis revenu à plusieurs reprises sur eux, j'ai finalement allumé beaucoup de problèmes avec un délai de synchronisation dans une machine virtuelle en temps réel.
Par conséquent, nous définissons immédiatement le fuseau horaire et la synchronisation NTP corrects:

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


Pour vous assurer qu'il n'y a aucun problème de dépendance lors de l'installation de Suricata, ajoutez les référentiels d' univers à /etc/apt/sources.list :

nano /etc/apt/sources.list
...
deb archive.ubuntu.com/ubuntu univers principal bionique
deb archive.ubuntu.com/ubuntu univers principal bionic-security
deb archive.ubuntu.com/ubuntu bionic-updates univers principal

Nous ajoutons également le référentiel, où nous obtiendrons Suricata:
add-apt-repository ppa:oisf/suricata-stable

Mise à jour de la base de données des packages:
apt-get update

Installez Suricata:
apt-get install -y suricata

L'étape suivante consiste à définir les règles pour Suricata et leur mise à jour:
apt-get install -y python-pip
pip install pyyaml
pip install https://github.com/OISF/suricata-update/archive/master.zip


Nous commençons la mise à jour de suricata-update elle-même :
pip install --pre --upgrade suricata-update

L'exécution sans configuration supplémentaire nous donnera un ensemble de règles Open Emerging Threats:
suricata-update

Pour voir la liste des sources, faites:
suricata-update list-sources

Mise à jour des sources de règles:
suricata-update update-sources

Voyons ce qui a été mis à jour dans les sources, exécutez à nouveau:
suricata-update list-sources

Nous incluons toutes les sources gratuites:
suricata-update enable-source ptresearch/attackdetection
suricata-update enable-source oisf/trafficid
suricata-update enable-source sslbl/ssl-fp-blacklist


Et encore une fois, nous mettons à jour les règles:
suricata-update

Suricata est installé.

Maintenant, vous devez obtenir du trafic.

Trafr


Trafr est une application écrite par Mikrotik pour convertir le trafic TZSP en pcap. L'application est 32 bits, donc pour la lancer, vous devrez activer la prise en charge des applications 32 bits dans Ubunta 64 bits:

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


Téléchargez et décompressez le trafr :

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


Vérifiez que le trafic est capté:

./trafr -s

Après un tel lancement, la sortie symbolique en mode graphique s'est cassée dans la console de la machine virtuelle, j'ai dû redémarrer. Il n'y a eu aucun problème de connexion à distance via ssh à PuTTY.

Si vous voyez un scintillement irrégulier sur l'écran, alors le trafic arrive et le trafr le rattrape. Dans l'affirmative, transférez le trafr à la résidence permanente et exécutez-le avec la transmission du trafic capturé par le pipeline immédiatement à Suricata:

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


Maintenant, nous vérifions que le trafic arrive à Suricata, pour cela, nous faisons ce qui suit dans le terminal voisin:

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

Vous devriez voir un défilement intelligent d'un texte significatif - un journal de réception du trafic de suricates.

Il ne sera pas non plus mal de s'assurer que le trafic Suricata non seulement reçoit, mais analyse également:

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

Il s'agit exactement de la sortie des événements de Suricata au format JSON que nous transmettrons à Filebeat.

Elasticsearch + Filebeat + Kibana 6.5


Nous installons la clé PGP nécessaire pour utiliser le référentiel Elastic et installons les dépendances nécessaires:

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


Veuillez noter que Java est la version 8. Tout ce qui est supérieur à 8 n'est pas pris en charge. Par conséquent, si vous avez réussi à installer un Java plus récent plus tôt, démolissez-le et mettez 8.

Nous nous assurons que Java est installé comme il se doit:

java -version

Nous obtenons approximativement la conclusion suivante:
version java "1.8.0_191"
Environnement d'exécution Java (TM) SE (build 1.8.0_191-b12)
Machine virtuelle serveur Java HotSpot (TM) 64 bits (build 25.191-b12, mode mixte)

Créez un utilisateur et un mot de passe pour accéder à Kibana. Au lieu d' admin, choisissez quelque chose que vous préférez:

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

Puisque l'ELK tournera sur localhost, configurez le proxy inverse dans nginx:

nano /etc/nginx/sites-available/kibana
serveur {
écouter 80;

nom_serveur suricata.server;

auth_basic "Accès restreint";
auth_basic_user_file /etc/nginx/htpasswd.users;

emplacement / {
proxy_pass 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;
}
}

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


Redémarrez nginx:

systemctl restart nginx

Nous mettons Elasticsearch:

apt-get install -y elasticsearch

Activez l'exécution automatique lors du chargement du système d'exploitation:

systemctl daemon-reload
systemctl enable elasticsearch.service


Nous lançons:

systemctl start elasticsearch.service

Vérifiez s'il a augmenté:

curl -X GET "localhost:9200/"

Selon les performances de votre matériel, le démarrage d'ES peut prendre un certain temps. Si la connexion est refusée , répétez simplement la demande et attendez que nous obtenions quelque chose comme:
{
"Nom": "lcZuxxm",
"Cluster_name": "elasticsearch",
"Cluster_uuid": "kmJHqJnlQe2Rk7F-CRi4EA",
"Version": {
"Numéro": "6.5.1",
"Build_flavor": "par défaut",
"Build_type": "deb",
"Build_hash": "8c58350",
"Build_date": "2018-11-16T02: 22: 42.182257Z",
"Build_snapshot": faux,
"Lucene_version": "7.5.0",
"Minimum_wire_compatibility_version": "5.6.0",
"Minimum_index_compatibility_version": "5.0.0"
},
Slogan: Vous savez, pour la recherche
}

Nous mettons Kibana:

apt-get install -y kibana

Activez l'exécution automatique lors du chargement du système d'exploitation:

systemctl daemon-reload
systemctl enable kibana.service


Nous lançons:

systemctl start kibana.service

Vous pouvez maintenant aller à 192.168.1.253 (bien sûr, l'adresse IP est celle qui a été attribuée à votre machine avec un suricate). La page de garde de Kibana devrait s'ouvrir.

Nous mettons Filebeat:

apt-get install -y filebeat

Activez l'exécution automatique lors du chargement du système d'exploitation:

systemctl daemon-reload
systemctl enable filebeat


Nous activons le module Suricata, qui fait partie de l'ensemble de modules Filebeat:

filebeat modules enable suricata

Installez les plugins pour Suricata dans Elasticsearch:

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

Voir UPD 22 mai 2019.

Redémarrage d'Elasticsearch:

systemctl restart elasticsearch.service

Nous effectuons la configuration initiale de Filebeat, tout en chargeant des modèles dans Kibana:

filebeat setup -e

Nous vérifions que Filebeat a trouvé /var/log/suricata/eve.json et le traite. Pour ce faire, exécutez Filebeat en mode de sortie de données avec le marqueur de publication :

filebeat -e -d "publish"

Le premier est la sortie au format json de Filebeat lui-même, puis la simple sortie texte de ses journaux, et seulement après un certain temps la sortie de Suricata, alors attendez et assurez-vous que tout fonctionne. Après cela, abandonnez Filebeat et revenez à bash.

Activez l'exécution automatique lors du chargement du système d'exploitation:

systemctl daemon-reload
systemctl enable filebeat.service


Exécutez Filebeat:

systemctl start filebeat.service

Allez dans Kibana, sélectionnez Dashboard dans le menu de gauche, sélectionnez filebeat- * index. Sélectionnez à nouveau Tableau de bord, sélectionnez [Suricata] Aperçu des alertes dans la liste, et vous devriez obtenir quelque chose comme ceci:

image

En option


N'oubliez pas de logrotate, et peu importe la capacité du disque dur, Suricata le marquera très rapidement:

nano /etc/logrotate.d/suricata
/var/log/suricata/*.log /var/log/suricata/*.json
{
hebdomadaire
tourner 3
missingok
nocompress
créer
sharedscripts
post-rotation
/ bin / kill -HUP `cat /var/run/suricata.pid 2> / dev / null` 2> / dev / null || vrai
script de fin
}

De plus, selon certaines rumeurs, quelqu'un reniflerait régulièrement à Mikrotik avec le statut de course à pied cessant de donner du trafic. Ensuite, nous écrivons un script pour redémarrer le renifleur et l'exécuter selon le calendrier:

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


Conclusion


Franchement, je ne suis pas tout à fait satisfait de la stabilité du bundle ci-dessus. A savoir: cela vaut la peine de redémarrer, et les miracles commencent. Une fois, tout sauf un couple a cessé de traiter mes règles. J'ai dû tout réinstaller. La deuxième fois, Elasticsearch a généralement cessé de recevoir des données de Filebeat et a dû revenir à l'instantané de l'état avant de redémarrer.

Je n'ai pas encore résolu ces problèmes.

En outre, il est prévu de mettre en œuvre l'IPS sur la base des adresses IP des méchants identifiés par Suricata transférés à Mikrotik.

UPD : Les accusations d'instabilité sont abandonnées. Ma conclusion sur la fin du traitement des règles était erronée. En fait, la raison du vide dans le tableau de bord après le redémarrage est due au fait que Filebeat et Elasticsearch ont besoin d'un temps très visible pour analyser un fichier json de plusieurs gigaoctets à partir de meerkat. Si vous ouvrez le tableau de bord avec des événements pour une période qui inclut la date de création du fichier eve.json , vous pouvez voir comment les colonnes du graphique augmentent au fur et à mesure que le fichier est traité. Parallèlement aux événements traités, des alertes apparaissent dans le tableau de bord correspondant. De plus, le renifleur dans RouterOS sur x86 n'a jamais été bloqué.

UPD 22 mai 2019 : à partir de la version Elasticsearch 6.7, les plugins ingest-geoip et ingest-user-agent ont été convertis en modules. Par conséquent, l'élément avec son installation est ignoré.

De plus, lors de la mise à niveau, vous obtenez une erreur de démarrage Elasticsearch. Vous verrez une erreur dans les journaux:

la base de données attendue [GeoLite2-ASN.mmdb] n'existe pas dans [/ etc / elasticsearch / ingest-geoip]

Pour restaurer les performances, nous effectuons:

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

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


All Articles