falco-kubernetes

7 septembre 2023

Vous voulez améliorer la sécurité de votre cluster Kubernetes en détectant et analysant automatiquement (et rapidement !) les comportements à risques pour pouvoir y répondre efficacement ? Alors lisez la suite pour découvrir et installer Falco : un système de détection d'intrusions spécialement conçu pour le Cloud.

La sécurité dans Kubernetes

Kubernetes est un orchestrateur de conteneurs permettant de faciliter les déploiements d'applications sur une ou plusieurs machines appelées Nodes. Kubernetes est une technologie en plein développement et largement utilisée dans le cloud mais aussi sur des infrastructures on-premises.

Il est essentiel de veiller à la sécurité d'un cluster Kubernetes en profondeur et de ne pas se reposer uniquement sur la sécurité des applications déployées en surface afin d'empiler les mesures de sécurité et ainsi réduire au maximum les risques d'attaque.

Concrètement cela consiste à minimiser autant que possible l'impact que peut avoir un attaquant ayant déjà un premier accès à l’infrastructure, que ce soit par la compromission d'un pod via une faille applicative ou par le vol d'identifiant via du phishing par exemple.

Kubernetes est une technologie relativement complexe qui peut offrir une surface d'attaque assez étendue à un attaquant. En effet, de nombreuses ressources sensibles sont présentes sur un cluster k8s :

  • l'API serveur : le cœur de k8s
  • ETCD : base de données qui stocke l'état du cluster
  • les rôles et les permissions : qui peut faire quoi
  • les secrets : informations sensibles comme les mots de passe applicatifs ou des tokens d'authentification
  • Kubelet : présent sur chaque node pour gérer le déploiement des containers
  • les Pods : contiennent les applications métiers

Pour en savoir plus sur le fonctionnement interne de Kubernetes, il peut être intéressant de comprendre le Control Plane.

cluster_kubernetes

Étant donné la complexité et l'étendue que peut avoir un cluster Kubernetes, il est important de se munir des bons outils afin d'automatiser au mieux la gestion de la sécurité. Dans cette optique, le système de détection d'intrusion Falco est une bonne solution.

Falco ? Qu'est-ce donc ?

Falco est un outil open source développé par Sysdig en 2016 et fait partie de la Cloud Native Computing Foundation (CNCF) depuis 2018.

Il permet de détecter des comportements suspects en se basant, entre autres, sur les appels système et les logs puis de remonter des alertes de sécurité en temps réel selon des règles préétablies.

Falco est particulièrement utile pour la sécurité des infrastructures containérisées et il s'intègre parfaitement à Kubernetes.

Par exemple, Falco permet de détecter les comportements suivants :

  • Exécution d'un shell par un conteneur
  • Montage d'un volume de l'hôte
  • Lecture de secrets et d'informations sensibles comme /etc/shadow
  • Installation d'un nouveau paquet sur un conteneur
  • Apparition d'un nouveau processus ne faisant pas partie du CMD d'un conteneur
  • Ouverture d'un nouveau port ou connexion suspecte
  • Création d'un conteneur privilégié

Comment installer Falco ?

Nous allons maintenant voir comment installer Falco sur un cluster Kubernetes. Tout d'abord, il vous faut bien évidemment un cluster Kubernetes, pour cela vous pouvez utiliser un cluster managé par un cloud provider comme AWS ou GCP ou alors un cluster personnel créé grâce à minikube par exemple.

Il existe deux méthodes principales pour installer Falco, chacune avec ses avantages et inconvénients. La première consiste à installer Falco directement sur le système hôte afin de l'isoler au maximum de Kubernetes en cas de compromission du cluster. La deuxième est d'installer Falco directement dans Kubernetes en tant que daemonset à l'aide de Helm par exemple.

Dans cet article, nous utiliserons cette deuxième méthode pour un souci de facilité d'installation pour la démonstration de Falco. En pratique, il est préférable d'utiliser la première qui est certes plus longue, mais bien plus sécurisée.

Après avoir vérifié que Helm est correctement installé sur notre machine, nous ajoutons le dépôt falcosecurity contenant le chart pour Falco.

helm repo add falcosecurity <https://falcosecurity.github.io/charts>
helm repo update

Pour faire les choses proprement, nous allons créer un namespace dédié à Falco :

kubectl create ns falco

Il suffit alors d'installer le chart avec la commande suivant (sans oublier le namespace). Afin d'avoir une jolie interface pour visualiser les alertes Falco nous activons falcosidekick.

helm -n falco install falco falcosecurity/falco --set falcosidekick.enabled=true --set falcosidekick.webui.enabled=true

Vous pouvez vérifier que tout s'est bien passé en listant les pods dans le namespace falco. Il devrait y avoir un pod pour chaque node sur le cluster.

kubectl get pods -n falco

Et voilà ! Falco est maintenant installé sur votre cluster, c'était simple non ?

Falco en pratique !

Dans cette section, nous allons découvrir comment fonctionne Falco en pratique en simulant des actes malveillants sur notre cluster.

Avant toute chose, notre cluster est un peu vide pour l'instant, nous allons donc installer une application pour nos tests.

helm repo add bitnami <https://charts.bitnami.com/bitnami>
helm install web-app bitnami/apache

Pour avoir accès à l'interface du sidekick falco, il faut ramener le port en local.

kubectl port-forward svc/falcosidekick-ui 2802:2802 --namespace falco

L'interface web est alors accessible ici : http://127.0.0.1:2802/ui.

Simulons maintenant une exécution de code sur un pod du cluster via le lancement d'un shell sur notre pod applicatif.

kubectl exec -it web-app-apache-6fcfb5cdcc-6b6mp -- bash

Faisons un tour du côté de notre interface web pour voir si Falco détecte cela.

interface_web_shell

Nous voyons que Falco a remarqué le shell ouvert sur le pod applicatif et nous fournit diverses informations utiles pour investiguer plus en détail.

Essayons maintenant de contacter l'API server via le shell précédent.

curl -k <https://10.96.0.1>


interface_web_api
Là encore Falco réagit et nous donne pas mal d'informations sur l'incident.

Dans cet article nous avons découvert l'outil Falco qui permet de rajouter une couche de sécurité sur les clusters Kubernetes en détectant des comportements dangereux et/ou suspects.

Nous avons pu observer le comportement de Falco sur un cas pratique très simple, mais nous avons pu voir que cet outil remonte de nombreuses informations de contexte, liées à chaque alerte.

Pour aller plus loin dans la configuration de Falco, il faudra ensuite étudier plus en détail le système de règles et d'alerting afin de pouvoir être informé en temps réel en cas d'incident grave.