====== 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)]]