Dans ce billet, j’explique les bases de l’utilisation d’un SIEM: comment chercher dans les journaux et comment envoyer des alertes.
C’est le troisième billet de la série « SIEM 101 », où j’explique les bases d’un SIEM, de l’installation à l’utilisation simple. Vous pouvez consulter le billet précédent, SIEM 101: configuration initiale.
Maintenant que nos journaux arrivent dans notre compte Logz.io, il est temps d’apprendre à y naviguer, à comprendre leur organisation et à y chercher des motifs précis. Une fois cela maîtrisé, nous pourrons créer des alertes sur des motifs particuliers, comme une attaque par force brute en SSH ou sous Windows.
La technologie derrière ce SIEM
Commençons par la technologie. Logz.io s’appuie sur Elasticsearch comme base de données et utilise Kibana pour interagir avec les données et les visualiser. L’entreprise a ajouté quelques fonctions maison autour de ces deux outils pour offrir les alertes et d’autres choses.
Elasticsearch, une base de données idéale pour un SIEM
Elasticsearch est une base de données « NoSQL » qui conserve, indexe et analyse des données au format JSON. La description officielle:
Elasticsearch est un moteur de recherche et d’analyse distribué et libre, pour tous les types de données: textuelles, numériques, géospatiales, structurées et non structurées. Elasticsearch repose sur Apache Lucene et a été publié pour la première fois en 2010 par Elasticsearch N.V. (aujourd’hui Elastic). Reconnu pour ses API REST simples, sa nature distribuée, sa vitesse et sa capacité de mise à l’échelle, Elasticsearch est la composante centrale de l’Elastic Stack, un ensemble d’outils libres d’ingestion, d’enrichissement, de conservation, d’analyse et de visualisation de données. Souvent appelé ELK Stack (d’après Elasticsearch, Logstash et Kibana), l’Elastic Stack comprend maintenant une riche collection d’agents d’expédition légers, les Beats, qui envoient les données vers Elasticsearch.
Kibana, une interface SIEM de base
Kibana est une interface Web permettant de visualiser les données conservées dans Elasticsearch. Elle a été conçue par la même équipe qui a développé Elasticsearch, spécifiquement pour interagir avec ses données. La description officielle:
Kibana est une application frontale libre qui se superpose à l’Elastic Stack et offre des capacités de recherche et de visualisation pour les données indexées dans Elasticsearch. Communément connue comme l’outil de graphiques de l’Elastic Stack (auparavant appelé ELK Stack d’après Elasticsearch, Logstash et Kibana), Kibana sert aussi d’interface pour surveiller, gérer et sécuriser une grappe Elastic Stack, ainsi que de plateforme centrale pour les solutions intégrées développées sur l’Elastic Stack. Née en 2013 au sein de la communauté Elasticsearch, Kibana est devenue la fenêtre sur l’Elastic Stack lui-même, un portail pour les utilisateurs et les entreprises.
Source: https://www.elastic.co/fr/kibana
L’interface
Pour les étapes qui suivent, connectez-vous à votre compte Logz.io et rendez-vous dans Kibana:
Comme vous le voyez, beaucoup d’information est présentée de façon compacte.
La section du haut, comme dans l’image ci-dessous, permet de naviguer entre les fonctions et les sections de Logz.io:
Nous parlerons de chacune en détail en temps voulu, mais en quelques mots:
- Metrics offre une vue simple et centralisée des métriques de vos serveurs: utilisation du processeur, de la mémoire, etc.
- Live Tail permet de voir les journaux arriver dans la plateforme, en temps réel.
- Send Your Data donne les détails pour connecter de nombreuses plateformes et technologies à Logz.io.
- Alerts & Events est l’endroit où créer et modifier les alertes.
- Insights fournit des pistes utiles sur les problèmes qui pourraient survenir sur vos serveurs.
- ELK Apps est une place de marché de tableaux de bord, d’alertes et d’autres outils utiles fournis par Logz.io et la communauté.
Pour la section de gauche, vous pouvez appuyer sur le bouton du bas pour la déployer:
Une fois déployée, vous obtenez ceci:
La section Discover est celle qui s’affiche en arrivant sur le site. Elle permet de chercher et de parcourir les données. Nous y reviendrons plus loin.
La section Visualize sert à produire des graphiques agrégés: diagramme circulaire, tableau de données, carte de chaleur, carte régionale, graphique linéaire, etc. C’est très utile pour donner du sens à une grande quantité de données. Vous pourriez par exemple chercher les processus les plus souvent démarrés sur un serveur ou sur l’ensemble de vos serveurs. Ou encore tracer le total des journaux de trafic de votre site Web dans le temps, pour mieux comprendre vos heures de pointe.
La section Dashboard sert, vous l’aurez deviné, à créer des tableaux de bord. Ils réunissent plusieurs graphiques Visualize enregistrés et permettent de voir rapidement, en un seul endroit, les différents motifs qui nous intéressent. De plus, tout filtre appliqué au tableau de bord s’applique à toutes ses visualisations. Par exemple, dans un tableau de bord du trafic de votre site Web, vous pouvez isoler une seule adresse IP et voir tous les graphiques se mettre à jour automatiquement pour cette adresse.
Timelion sert à superposer et à comparer différents graphiques temporels. Vous pourriez par exemple comparer le trafic de deux serveurs dans un même graphique.
La section Management sert, eh bien, à la gestion de Kibana. Mais c’est pour les utilisateurs avancés et on n’y va pas souvent: je n’entrerai pas dans les détails.
Dans le haut de la section centrale se trouvent les outils de recherche:
Nous pouvons y utiliser une requête Lucene ou une requête en Kibana Query Language (KQL) pour chercher dans les données. Nous pouvons aussi appliquer des filtres, par exemple « IP: 127.0.0.1 ».
À droite se trouve la période sur laquelle s’applique notre recherche (dans l’image, les données affichées couvrent les 15 minutes précédant le lancement de la recherche).
Pour rafraîchir les données, on appuie sur le bouton « Refresh ». Il est possible d’enregistrer une recherche pour la rouvrir plus tard ou la partager.
Le gros bouton « Create alert » permet de passer rapidement à la création d’une alerte à partir de la requête et des filtres actuels. C’est ce que nous utiliserons plus loin.
À gauche de la section centrale se trouvent tous les champs disponibles dans nos journaux. Nous pouvons interagir avec eux: filtrer, visualiser, etc.
Les champs sélectionnés servent de colonnes dans la section centrale principale. En survolant un champ, le bouton « add » apparaît: cliquez-le pour ajouter une colonne. Vous pouvez aussi cliquer un champ pour voir rapidement ses valeurs les plus fréquentes.
Note: si vous obtenez le bouton « Field not indexed », cliquez-le simplement. La page se rafraîchira et le champ deviendra disponible.
Au centre de la section centrale se trouve la section principale:
Dans le haut, une chronologie montre le nombre de messages sur une période donnée.
Dans mon image, on voit environ 3 messages par période de 20 secondes, pour un total de 68 messages. Vous pouvez sélectionner une période à la souris pour changer votre fenêtre temporelle (ici « Last 15 minutes »).
Note: dans mes billets, « messages » et « journaux » sont interchangeables et décrivent un même événement survenu sur le serveur ou l’ordinateur, comme une connexion.
Viennent ensuite les journaux. C’est là que toute la magie opère:
Ici, je n’ai sélectionné que deux colonnes: Time et message. Si vous ajoutiez d’autres champs comme colonnes, ils apparaîtraient ici.
En survolant un champ, comme « message », un X apparaît pour le retirer des colonnes affichées.
En cliquant la petite flèche à gauche d’une ligne, vous pouvez déployer le journal en question pour voir tous ses champs et leurs valeurs:
À gauche se trouve le nom du champ, par exemple « @metadata.beat », et à droite sa valeur, par exemple « winlogbeat ». En survolant le champ, quatre icônes apparaissent:
Le + et le – servent respectivement à ajouter un filtre pour chercher précisément cette valeur ou pour l’exclure des résultats. L’icône suivante ajoute le champ comme colonne, et la dernière ajoute un filtre exigeant la présence du champ dans le journal (par exemple pour exclure les journaux sans adresse IP).
Naviguer dans les journaux d’un SIEM
Pour apprendre à naviguer dans les journaux, prenons un contexte utile en environnement Windows: cherchons le dernier utilisateur qui s’est connecté.
Une recherche rapide dans Google pour « windows view the logon events » donne plusieurs résultats, dont https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/basic-audit-logon-events.
À la lecture, on comprend que Windows journalise les événements de connexion. En défilant un peu, on trouve les numéros d’événements et leur description. Ici, « 4624 » semble être ce que nous cherchons: « Un utilisateur s’est connecté avec succès à un ordinateur. »
Astuce: retenez les identifiants d’événements 4624 et 4625, ils servent très souvent en environnement Windows!
De retour dans Logz, il faut trouver le champ qui contient le 4624. Que se passe-t-il si je cherche « 4624 »?
Aucun résultat… Ah, la fenêtre temporelle! Je ne me suis pas connecté dans les 15 dernières minutes. Passons à 60 minutes et cliquons sur Update.
14 résultats! Mais attendez, je ne me suis pas connecté 14 fois dans la dernière heure. Et qui sont ces utilisateurs avec un signe de dollar « $ » dans la colonne « message »? Demandons à Google. Une recherche pour « windows event id 4624 user with dollar sign » donne en premier résultat: https://www.ultimatewindowssecurity.com/securitylog/book/page.aspx?spid=chapter5
Astuce: gardez ce site en favori, ultimatewindowssecurity.com est rempli d’information sur les détails des événements Windows, y compris Sysmon!
Cette page contient beaucoup d’information. Allons directement à l’explication du signe « $ » avec CTRL+F. Nous obtenons cette description:
Les journaux de sécurité des contrôleurs de domaine contiennent de nombreux événements de connexion et de déconnexion générés par des comptes d’ordinateur plutôt que par des comptes d’utilisateur. Comme pour les événements de connexion générés par un ordinateur, vous les reconnaissez au champ Account Name de la section New Logon, qui contient un nom d’ordinateur suivi d’un signe de dollar ($). Vous pouvez ignorer ces événements.
Ces événements proviennent donc de connexions générées par des ordinateurs. Mais ils se produisent sur un contrôleur de domaine. Dans mon cas, je fais mes essais sur une instance Windows qui n’est pas jointe à un domaine: ce n’est donc pas ce que je cherche.
Continuons de fouiller. Le nom du champ était « winlog.event_data.SubjectUserName »; je me demande si un autre champ contient « UserName ». On dirait bien: « winlog.event_data.TargetUserName ».
Astuce: dans un domaine, si plus d’un contrôleur envoie des journaux, vous obtiendrez plus d’un utilisateur. Vous pouvez saisir la requête suivante pour filtrer tous les utilisateurs avec un signe de dollar: « winlog.event_data.SubjectUserName: /.?\$.?/ » (sans les guillemets), la requête complète devenant « 4624 AND NOT winlog.event_data.SubjectUserName: /.?\$.?/ ».
Pour simplifier, j’ajoute le champ « winlog.event_data.TargetUserName » comme colonne:
Voilà, j’ai maintenant des détails utiles!
Il semble donc que ma connexion la plus récente ait eu lieu le « Nov 26, 2020 @ 21:13:04.405 ».
Note: vous avez peut-être remarqué que l’horodatage des journaux change d’une image à l’autre; c’est qu’en écrivant ce billet, je mets à jour et j’affine ma recherche pour obtenir des images utiles.
Créer une alerte, la meilleure fonction d’un SIEM
Maintenant que nous savons chercher dans les journaux, il ne reste plus qu’à créer une alerte et à envoyer un courriel. Je garde le même contexte et je crée une alerte qui m’écrit chaque fois que je me connecte.
Note: ceci n’est qu’un exemple. Si vous créez une telle alerte, vous recevrez beaucoup de courriels!
Donc, à partir de ma recherche de la connexion la plus récente pour mon utilisateur nommé « User » (je sais, très original), j’ajoute un filtre propre à cet utilisateur pour ne pas recevoir de courriel chaque fois que mon ordinateur génère un événement:
Nous filtrons maintenant précisément l’utilisateur « User », mais je n’aime pas le « 4624 » dans la barre de recherche, sans nom de champ: il compare la valeur à toutes les valeurs de tous les champs! Maintenant que nous savons n’avoir que les véritables événements de connexion de mon utilisateur, trouvons le nom du champ de l’identifiant 4624 avec un CTRL+F sur « 4624 »:
Note: n’oubliez pas de déployer un journal pour voir tous ses champs.
Note: Kibana affiche les milliers avec une virgule, il faut donc chercher « 4,624 »… Je suis Canadien, je déteste ce format.
Filtrons la valeur « 4624 » pour le champ « event.code », retirons le « 4624 » de la barre de recherche et cliquons sur « Update »:
Astuce: pour des raisons de performance, mieux vaut utiliser les filtres que la barre de recherche, mais cela ne fonctionne que pour les correspondances exactes.
Maintenant que nous avons exactement les résultats voulus, nous savons que notre requête est bonne. Cliquons le gros bouton bleu « Create alert ». Nous sommes redirigés vers la section « Alerts & Events » de Logz.io.
Donnons un nom à l’alerte: « The user User logged on ».
Laissez tout tel quel jusqu’à la section « Notify » (la requête de la section « Search for… » est préremplie avec les filtres préparés plus tôt, grâce au gros bouton bleu).
Vous pouvez ajouter une description utile si vous le souhaitez; je m’en abstiens, mon titre étant assez clair.
Puis, dans le champ « Who to send it to », inscrivez simplement votre courriel et sélectionnez-le.
Quand tout vous satisfait, cliquez sur « Save » en haut à droite:
Il ne reste plus qu’à tester l’alerte. Connectez-vous simplement à votre ordinateur et vous devriez recevoir un courriel dans les 15 minutes suivantes (c’est le délai que j’ai défini dans la section « Trigger if… »). Vous recevrez désormais une alerte chaque fois que vous vous connectez!
Note: si vous ajoutez d’autres ordinateurs, comme nous n’avons pas filtré la source, vous recevrez une alerte chaque fois que l’utilisateur « User » se connecte sur l’un ou l’autre.
Conclusion
Voilà! Vous connaissez maintenant les bases de Logz.io, la recherche dans les journaux et la création d’alertes, ce qui constitue l’essentiel de l’utilisation d’un SIEM. Je vous laisse le plaisir de découvrir la création de graphiques Visualize et de tableaux de bord. Il reste beaucoup à apprendre, et nous y viendrons. Tout est maintenant en place pour que je commence à écrire des billets sur les motifs de détection! Je traiterai des motifs simples dans la série « SIEM 102 » et des motifs plus complexes dans la série « SIEM 201 ». Je parlerai éventuellement de l’automatisation des réponses et de la transformation et de l’enrichissement des données.
Ce billet a d’abord été publié sur https://www.tristandostaler.com/siem-101-basic-usage/ le 2020-11-26.













