ELK dans le cloud – Le SIEM par excellence ?

La stack ELK (Elasticsearch Kibana Logstash) est un outil qui s’est fait connaître par les SOC car il est open source et gratuit. Les systèmes d’informations devenant plus complexes avec des dettes techniques parfois mirobolantes. Il faut faire preuve de proactivité pour combattre les attaques perpétrées par des cybercriminels. La question n’est donc plus : vais-je subir une cyberattaque mais quand ?
Là je ne parlerais pas de cette suite mais plutôt de sa suite logique ECK (Elastic Cloud on Kubernetes) et oui le “cloude”.

SIEM késako ?

Un SIEM (Security Information and event management) permet de corréler et centraliser les logs d’un parc aidant à l’analyse en temps réel et à la surveillance de différents incidents de sécurité. Il y a plusieurs phases (On ne les citera pas toutes):

  • Collecte : Récupération des logs des équipements et des machines
  • Normalisation : Ces logs sont stockés sous un format facilement lisible permettant de faire des recherches sur plusieurs critères
  • Corrélation : Des règles qui permettent d’identifier un évènement qui a causé le déclenchement d’alertes
  • Reporting : Visualisation et génération de dashboards et de rapports

Elastic Cloud on Kubernetes et son opérateur

Elastic Cloud automatise le déploiement, le provisionning (lol ! Pas on-premise), le management et l’orchestration des outils Elasticsearch, Kibana, Beats et bien d’autres que nous ne verrons pas ici.

Je pars du principe que vous avez déjà un cluster k8s avec un node d’au moins 8Go avec 2 CPU :)

Mon environnement sur VMware vSphere :

  • CentOS 8 – Filebeat, Packetbeat, Auditdbeat et Metricbeat
  • Windows 10 – Winlogbeat, Packetbeat
  • Cluster k8s (Sur debian ou Ubuntu Server, il n’aime pas trop CentOS)

Je parle beaucoup mais comment qu’on installe ?

Tout d’abord, j’ai installé Elastic Cloud qui déploie un opérateur et des pods particuliers qui permettent l’installation d’Elasticsearch et ensuite Kibana:

kubectl apply -f https://download.elastic.co/downloads/eck/1.3.1/all-in-one.yaml 

Si vous n’êtes pas fans comme moi des longues commandes vous pouvez stocker la configuration dans un fichier .yaml (c mieu)

Un déploiement Elasticsearch pas si automatisé

J’ai suivi la doc ECK – https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-deploy-eck.html (à 3 pattes)

cat <<EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 7.10.2
   nodeSets: 
   - name: default
   count: 1
   config:
     node.store.allow_mmap: false
   VolumesClaimTemplates:
     - metadata:
         name: elasticsearch-data
      spec:
          accessModes:
          - ReadWriteOnce
          resources:
             requests:
               storage: 10Gi
             storageClassName: standard
 EOF 

Encore une fois je préfère enregistrer dans un fichier yaml (quickstart-es.yaml). On va maintenant analyser notre déploiement :

kubectl get elasticsearch

Eh bah mince alors ça ne se déploie pas, pourquoi ?

En effet, je ne suis pas sur un cluster k8s managé comme sur Azure ou Google. Le provisionning ne se fait pas dynamiquement, je dois le faire manuellemennt (les joies des infra on-premise).

On va lé vérifier :

kubectl describe pod quickstart-es-default-0
Aucun PersistentVolume et aucun node disponible pour le Pod

Tout d’abord, il faut créer un StorageClass qui correspondra à celui de la configuration Elastic Cloud, mais je n’ai pas de provisionner étant donné que je ne suis pas dans le cloud. Comment faire ?
On va tout d’abord supprimer le déploiement Elasticsearch

kubectl delete -f quickstart-es.yaml

La documentation k8s et oui – https://kubernetes.io/docs/concepts/storage/storage-classes/#local

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

Cela m’a permis d’éviter un CrashLoopBackOff des pods.
Ensuite, il faut lier un volume persistent au claim (PVC) et au StorageClass.

Le provisioning fonctionne oooura !
 apiVersion: v1
 kind: PersistentVolume
 metadata:
   name: pv-volume-es
   labels:
     type: local
 spec:
   storageClassName: standard
   capacity:
     storage: 10Gi
   accessModes:
     - ReadWriteOnce
   hostPath:
     path: "/elasticsearch-data" 

On déploie à nouveau notre Elasticsearch

kubectl apply -f quickstart-es.yaml

Et là notre pod Elasticsearch est fonctionnel ! Maaaagic ?

Elasticsearch run

Déploiement de Kibana

J’ai suivi la doc – https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-deploy-kibana.html (ça fonctionne lol)

cat <<EOF | kubectl apply -f -
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 7.10.2
  count: 1
  elasticsearchRef:
    name: quickstart
EOF

Kibana se déploie magiquement :)

Edition des services et magie du « cloude »

Je vais maintenant changer le type de service des déploiements Elasticsearch et Kibana. En effet, on utilise actuellement un service de type ClusterIP qui donne un accès seulement qu’à partir du cluster. J’utiliserais NodePort qui donne un accès à l’extérieur du cluster.
On vérifie donc les services :

Liste des services
kubectl edit service quickstart-es-http

Et là je modifie ClusterIP en NodePort. On effectue la même manip pour Kibana.

Service Elasticsearch modifié

J’obtiens un port random, je contacte à partir de n’importe lequel de mes nodes ce port dans mon navigateur et voici qu’apparaît mes pages de login.
On est maintenant capable de contacter cette magnifique interface.

Et le SIEM dans tout ça ?

ENFIN ! Nous arrivons dans la partie la plus intéressante, celle qui concerne la capacité de détection du SIEM. C’est tout simple, il est intégré nativement à ECK. Nous avons justement un bloc « Security » dans l’image précédente. Vous cliquez dessus et serez dans la partie détection.

Partie détection

Il y a un panel de règles que nous pouvons activer par défaut. Celles-ci traitent différents cas allant de la détection de l’injection de processus sur Windows, à la détection des accès aux informations d’identifications chez différents fournisseurs cloud comme Azure, AWS, Alibaba etc..
Tout ça pour vous dire que les règles de détection sont variées. Vous pouvez également créer vos règles de détection qui peuvent être basées sur YARA, Sigma ou encore KQL (Kibana Query Language).

Comment générer des logs ?
En effet, Elastic a développé ce qu’on appelle des Beats qui sont des agents légers avec des fonctionnalités spécifiques. Par exemple, un Beat qui collectera les logs dans « /var/log », un autre qui va envoyer des traces réseaux etc…
Lien vers documentation : https://www.elastic.co/beats/

Comment détecter et réagir face aux menaces ?

Pour cela, il faut utiliser Elastic Agent en activant la fonctionnalité sécurité. Cet agent agira en tant qu’Endpoint Detection Response pour répondre à toute menace sur un poste. Il y a deux types de fonctionnement, l’un dit « Prevent » qui va détecter, bloquer et génerer une alerte et l’autre dit « Detect » qui va détecter et générer une alerte. Si vous êtes dans un lab, il vaudrait mieux privilégier l’option « Detect » qui permet ensuite d’analyser le comportement de la menace et « Prevent » en production. Néanmoins, cette technologie est toujours en BETA test, il vaut mieux attendre une sortie plus stable.

En conclusion, Elastic Cloud on Kubernetes est un SIEM complet, gratuit et open source permettant d’améliorer drastiquement son niveau de sécurité. La capacité de détection assez intéressante permet éventuellement de faire de la production même si cela n’est pas conseillé.
Même si ce n’est pas Splunk Entreprise ou QRadar, cet outil a tout pour être un SIEM de qualité ainsi un SOC pourrait faire des merveilles.

Laisser un commentaire

En savoir plus sur p0sql

Abonnez-vous pour poursuivre la lecture et avoir accès à l’ensemble des archives.

Poursuivre la lecture