====== Mise en place d'un SIEM avec ELK ======
===== Introduction =====
Cette procédure permet de mettre en place un SIEM grâce à la suite ELK : le combo d'ElasticSearch, LogStash, Kibana et les beats.
Pour installer la suite ELK sous forme de conteneur docker, voire [[deployer_la_suite_elk_grace_a_docker_compose|cette page]]
===== Topologie du LAB =====
{{ ::siem_elk_archi.png?600 |Architecture du lab SIEM avec ELK}}
===== Pré-requis =====
Ici nous aurons besoin de :
* 1 machine sous Linux qui servira de serveur ELK
* 1 machine cliente sous Windows qui servira à tester les beats
* 1 machine cliente sous Linux qui servira à tester l'envoi de logs
===== Instructions =====
==== Installation d'ElasticSearch ====
Pour installer la suite ELK, il faut passer par le dépôt officiel d'Elastic. On va donc commencer par ajouter sa clé de signature.
* __Sous Debian/Ubuntu__ commencer par installer les paquets ''apt-transport-https'' et ''gnupg2'' :
apt-get install apt-transport-https gnupg2
* Puis ajouter la clé :
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
* Sous RedHat/CentOS/Fedora, c'est différent :
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
Ensuite, on ajoute le dépôt dans la liste du système :
* Pour Debian/Ubuntu, entrer la commande suivante :
echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-8.x.list
* __Pour les systèmes RedHat/CentOS/Fedora,__ créer un fichier nommé ''elastic.repo'' dans le répertoire ''/etc/yum.repos.d'' contenant :
[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md
Maintenant, on peut mettre à jour la liste de paquets disponibles et installer ElasticSearch à l'aide du gestionnaire de paquets integré (apt ou yum) :
* __Pour les distributions Debian :__
apt-get update -y && apt-get install elasticsearch
* __Pour les distributions RedHat :__
sudo yum install --enablerepo=elasticsearch elasticsearch
De mon côté, sous Debian, ça donne :
{{ ::elkinstall1.png?800 |Installation d'ElasticSearch }}
Afin de vérifier qu'ElasticSearch fonctionne correctement, le démarrer (il peut être long) :
systemctl start elasticsearch
Si celui-ci ne se lance pas, il est possible de regarder plus précisement pourquoi dans ses logs :
journalctl -f -u elasticsearch
Une fois le service ElasticSearch actif, utiliser la commande curl ou un navigateur web pointant à l'adresse localhost:9200 :
Le service devrait alors répondre :
{{ ::elkinstall2.png |Réponse d'Elasticsearch }}
Pour terminer l'installation d'ElasticSearch, l'activer au lancement de la machine :
systemctl enable elasticsearch
==== Configuration d'Elasticsearch ====
La sécurité est configurée par défaut dans Elasticsearch. Néanmoins, on va devoir adapter la configuration à notre cas d'usage.
Si besoin, commencer par réinitialiser le mot de passe du compte ''elastic'' (l'administrateur par défaut) et le noter dans un coin :
/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
Ouvrir la configuration d'Elasticsearch et remplir/décommenter les paramètres suivants :
* cluster.name (optionnel) : nom du cluster
* node.name : nom du nœud
* network.host : adresse IP du nœud
* http.port : port utilisé par elasticsearch (par défaut 9200)
* cluster.initial_master_nodes : recopier le nom du nœud
La configuration doit ressembler à ceci (j'ai volontairement retiré les lignes inutiles) :
# Use a descriptive name for your cluster:
cluster.name: project-one
# Use a descriptive name for the node:
node.name: master-node-1.lab
# Path to directory where to store the data (separate multiple locations by comma):
path.data: /var/lib/elasticsearch
# Path to log files:
path.logs: /var/log/elasticsearch
# By default Elasticsearch is only accessible on localhost. Set a different
# address here to expose this node on the network:
network.host: 172.16.10.1
# By default Elasticsearch listens for HTTP traffic on the first free port it
# finds starting at 9200. Set a specific HTTP port here:
http.port: 9200
# Enable security features
xpack.security.enabled: true
xpack.security.enrollment.enabled: true
# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
enabled: true
keystore.path: certs/http.p12
# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
enabled: true
verification_mode: certificate
keystore.path: certs/transport.p12
truststore.path: certs/transport.p12
# Create a new cluster with the current node only
# Additional nodes can still join the cluster later
cluster.initial_master_nodes: ["master-node-1.lab"]
# Allow HTTP API connections from anywhere
# Connections are encrypted and require user authentication
http.host: 0.0.0.0
Redémarrer le service elasticsearch, la connexion HTTPS à elasticsearch doit être fonctionnelle.
==== Ajout de nœuds au cluster (facultatif) ====
Pour ajouter des nœuds au cluster, on doit d'abord générer un token pour le nœud principal :
/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node
Copier le token et le convertir en texte pour vérifier que l'adresse IP et la version d'elasticsearch sont corrects :
echo 'token' | base64 -d
Si ce n'est pas le cas, désactiver l'interface réseau problématique, redémarrer ES et regénérer le token en ajoutant un ''-f'' à la commande précédente.
Installer Elasticsearch sur le nouveau nœud et configurer les paramètres suivants dans ''/etc/elasticsearch/elasticsearch.yml'' :
* cluster.name : nom du cluster (le même que sur le 1er nœud)
* node.name : nom du nœud
* network.host : adresse IP du nœud
* http.port : port 9200 par défaut (décommenter la ligne)
Puis, utiliser la commande suivante pour associer le nœud au cluster en lui indiquant le token du premier nœud :
/usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token token
Répondre ''y''pour confirmer puis démarrer Elasticsearch à la suite de l'opération. Le nœud est ajouté au cluster.
On peut lancer les requêtes curl suivantes sur le nouveau nœud avec le compte admin du premier pour valider que l'opération a réussi :
curl -k -u elastic:smKNdSN1Fp8H=F0y8Heh https://172.16.10.2:9200/_cluster/health?pretty
curl -k -u elastic:smKNdSN1Fp8H=F0y8Heh https://172.16.10.2:9200/_cat/nodes
==== Installation et configuration de Kibana ====
Nous allons désormais installer l'interface graphique d'ELK qui nous permettra de configurer des dashboards et d'afficher les logs que l'on va collecter :
* __Pour les distributions Debian :__
apt-get install kibana
* __Pour les distributions RedHat :__
sudo yum install --enablerepo=elasticsearch kibana
Puis, dans le fichier de configuration de Kibana ''/etc/kibana/kibana.yml'' décommenter l'attribut ''elasticsearch.hosts:'' et vérifier qu'il pointe bien vers ''localhost:9200'' :
{{ ::elkinstall3.png |Configuration de l'adresse d'elasticsearch dans Kibana}}
Décommenter aussi les attributs ''server.port'' et ''server.host'', remplacer ''localhost'' par l'adresse IP depuis laquelle Kibana devrait être joignable sur le réseau, puis enregistrer le fichier :
{{ ::elkinstall4.png |}}
Enfin, démarrer Kibana :
systemctl start kibana
L'activer au lancement de la machine également :
systemctl enable kibana
Valider que Kibana fonctionne en ouvrant la page d'accueil de Kibana dans un navigateur web ''https://ipduserveur:5601'' :
{{ ::elkinstall5.png?850 |Accueil de Kibana}}
==== Installation de LogStash ====
LogStash, dernier composant majeur d'ELK, est l'application en arrière-plan qui va recevoir et traiter les logs avant de les stocker dans ElasticSearch.
===== Sources =====
[[https://www.elastic.co/guide/en/elasticsearch/reference/current/deb.html|📕 Installation d'Elasticsearch]]
[[https://www.elastic.co/guide/en/elasticsearch/reference/current/security-basic-setup.html|📕 Configuration de la sécurité ES (partie 1)]]
[[https://www.elastic.co/guide/en/elasticsearch/reference/current/security-basic-setup-https.html|📕 Configuration de la sécurité ES (partie 2)]]