For AI agents: the complete documentation index is available at https://docs.ovhcloud.com/fr/llms.txt, the full documentation bundle is available at https://docs.ovhcloud.com/fr/llms-full.txt, and this page is available as Markdown at https://docs.ovhcloud.com/fr/guides/public-cloud/containers-orchestration/managed-kubernetes/runtime-security-falco.md.

Détection des menaces en quasi temps réel avec Falco sur OVHcloud Managed Kubernetes

Voir en Markdown

Découvrez comment sécuriser votre OVHcloud Managed Kubernetes avec Falco, un outil de sécurité runtime

Objectif

Falco

Falco est un outil open source de sécurité runtime cloud-native. Il fournit une détection des menaces en quasi temps réel pour les workloads cloud, conteneurs et Kubernetes en s'appuyant sur des informations collectées au niveau du runtime. Falco peut superviser des événements provenant de différentes sources, dont le noyau Linux, et les enrichir avec des métadonnées issues du serveur API Kubernetes, du runtime de conteneurs, etc.

Schéma Falco

Concrètement, Falco :

  • Reçoit des événements
  • Les compare à un ensemble de règles pour déterminer les actions à effectuer
  • Génère des alertes : vous pouvez transférer les événements Falco vers différents endpoints (syslog, stdout, https, graph...) ou vers différentes applications (Slack, Discord, Elasticsearch, Kafka...) grâce à falcosidekick
falcosidekick

Chez OVHcloud, nous mettons un point d'honneur à vous proposer les meilleurs produits et services. La sécurité étant pour nous un enjeu important, ce guide vous fait découvrir Falco, qui vous aidera à sécuriser votre OVHcloud Managed Kubernetes grâce à un outil de sécurité runtime.

Dans ce guide, vous allez :

  • Installer Falco et Falcosidekick
  • Tester le comportement de l'outil
  • Visualiser les événements dans une interface graphique
  • Transférer et stocker les événements dans un bucket OVHcloud Object Storage

Vous pouvez utiliser la fonction Réinitialiser le cluster dans la section Public Cloud de l' pour réinitialiser votre cluster avant de suivre ce tutoriel.

Prérequis

Ce tutoriel suppose que vous disposez déjà d'un cluster OVHcloud Managed Kubernetes fonctionnel, ainsi que de connaissances de base sur son fonctionnement. Pour en savoir plus sur ces sujets, consultez la documentation Déployer une application Hello World.

En pratique

Installation de Falco

Pour ce tutoriel, nous utilisons le chart Helm de Falco.

Ajoutez le dépôt Helm de Falco :

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

Ces commandes ajoutent le dépôt Helm de Falco à votre dépôt local de charts Helm et mettent à jour les dépôts de charts installés :

$ helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
"falcosecurity" has been added to your repositories
Hang tight while we grab the latest from your chart repositories...
...
...Successfully got an update from the "falcosecurity" chart repository
...
Update Complete. ⎈Happy Helming!⎈

Installez la dernière version de Falco avec la commande helm install :

helm install falco \
    --version 4.0.0 \
    --create-namespace \
    --namespace falco \
    --set tty=true \
    --set falcosidekick.enabled=true \
    --set falcosidekick.webui.enabled=true \
    --set falcosidekick.webui.user=myuser:mypassword \
    --set falcosidekick.webui.service.type=LoadBalancer \
  falcosecurity/falco

Cette commande installe la dernière version de Falco, avec l'interface Falcosidekick, et crée un nouveau namespace falco :

$ helm install falco \
    --version 4.0.0 \
    --create-namespace \
    --namespace falco \
    --set tty=true \
    --set falcosidekick.enabled=true \
    --set falcosidekick.webui.enabled=true \
    --set falcosidekick.webui.user=myuser:mypassword \
    --set falcosidekick.webui.service.type=LoadBalancer \
  falcosecurity/falco
NAME: falco
LAST DEPLOYED: Wed Apr  3 11:48:42 2024
NAMESPACE: falco
STATUS: deployed
REVISION: 1
NOTES:
Falco agents are spinning up on each node in your cluster. After a few
seconds, they are going to start monitoring your containers looking for
security issues.


No further action should be required.

Comme vous pouvez le constater, nous installons également Falcosidekick grâce à plusieurs paramètres :

  • --set falcosidekick.enabled=true active le déploiement de Falcosidekick aux côtés de Falco et configure Falco pour envoyer ses événements à Falcosidekick
  • --set falcosidekick.webui.enabled=true active le déploiement de Falcosidekick-UI et configure Falcosidekick pour l'utiliser comme sortie
  • --set falcosidekick.webui.service.type=LoadBalancer permet d'accéder à l'interface via un OVHcloud Load Balancer (et une adresse IP externe)
Info

N'oubliez pas de modifier le login et le mot de passe dans la commande helm install, et plus particulièrement dans le paramètre --set falcosidekick.webui.user, afin de pouvoir accéder à l'interface.

Le chart Helm de Falco installe un DaemonSet qui ajoute des pods Falco sur tous les nœuds du cluster Kubernetes afin de superviser les comportements anormaux :

$ kubectl get all -n falco
NAME                                        READY   STATUS    RESTARTS      AGE
pod/falco-42nrg                             2/2     Running   0             2m10s
pod/falco-falcosidekick-54bdbf6984-7pgcr    1/1     Running   0             2m10s
pod/falco-falcosidekick-54bdbf6984-cbc9w    1/1     Running   0             2m10s
pod/falco-falcosidekick-ui-6568c775-8d9hd   1/1     Running   2 (63s ago)   2m10s
pod/falco-falcosidekick-ui-6568c775-sn8xt   1/1     Running   3 (75s ago)   2m10s
pod/falco-falcosidekick-ui-redis-0          1/1     Running   0             2m9s
pod/falco-j5j2j                             2/2     Running   0             2m10s
pod/falco-vb5nb                             2/2     Running   0             2m10s

NAME                                   TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)             AGE
service/falco-falcosidekick            ClusterIP      10.3.90.150   <none>          2801/TCP,2810/TCP   2m11s
service/falco-falcosidekick-ui         LoadBalancer   10.3.39.227   xx.xx.xx.xx     2802:30626/TCP      2m11s
service/falco-falcosidekick-ui-redis   ClusterIP      10.3.239.25   <none>          6379/TCP            2m11s

NAME                   DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/falco   3         3         3       3            3           <none>          2m11s

NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/falco-falcosidekick      2/2     2            2           2m11s
deployment.apps/falco-falcosidekick-ui   2/2     2            2           2m11s

NAME                                              DESIRED   CURRENT   READY   AGE
replicaset.apps/falco-falcosidekick-54bdbf6984    2         2         2       2m11s
replicaset.apps/falco-falcosidekick-ui-6568c775   2         2         2       2m11s

NAME                                            READY   AGE
statefulset.apps/falco-falcosidekick-ui-redis   1/1     2m11s

Vous pouvez vérifier que les pods Falco et falcosidekick sont bien en cours d'exécution :

$ kubectl get pods -n falco
NAME                                    READY   STATUS    RESTARTS      AGE
falco-42nrg                             2/2     Running   0             2m18s
falco-falcosidekick-54bdbf6984-7pgcr    1/1     Running   0             2m18s
falco-falcosidekick-54bdbf6984-cbc9w    1/1     Running   0             2m18s
falco-falcosidekick-ui-6568c775-8d9hd   1/1     Running   2 (71s ago)   2m18s
falco-falcosidekick-ui-6568c775-sn8xt   1/1     Running   3 (83s ago)   2m18s
falco-falcosidekick-ui-redis-0          1/1     Running   0             2m17s
falco-j5j2j                             2/2     Running   0             2m18s
falco-vb5nb                             2/2     Running   0             2m18s

Patientez et relancez la commande si les pods sont dans l'état « Init » ou « ContainerCreating ».

Une fois le pod falco prêt, exécutez la commande suivante pour consulter les logs :

kubectl logs -l app.kubernetes.io/name=falco -n falco -c falco

Vous devriez voir des logs semblables à ceux-ci :

$ kubectl logs -l app.kubernetes.io/name=falco -n falco -c falco

Wed Apr  3 12:22:26 2024: Falco version: 0.37.0 (x86_64)
Wed Apr  3 12:22:26 2024: Falco initialized with configuration file: /etc/falco/falco.yaml
Wed Apr  3 12:22:26 2024: System info: Linux version 5.15.0-101-generic (buildd@lcy02-amd64-032) (gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #111-Ubuntu SMP Tue Mar 5 20:16:58 UTC 2024
Wed Apr  3 12:22:26 2024: Loading rules from file /etc/falco/falco_rules.yaml
Wed Apr  3 12:22:26 2024: The chosen syscall buffer dimension is: 8388608 bytes (8 MBs)
Wed Apr  3 12:22:26 2024: Starting health webserver with threadiness 2, listening on 0.0.0.0:8765
Wed Apr  3 12:22:26 2024: Loaded event sources: syscall
Wed Apr  3 12:22:26 2024: Enabled event sources: syscall
Wed Apr  3 12:22:26 2024: Opening 'syscall' source with Kernel module
Wed Apr  3 12:21:51 2024: Falco version: 0.37.0 (x86_64)
Wed Apr  3 12:21:51 2024: Falco initialized with configuration file: /etc/falco/falco.yaml
Wed Apr  3 12:21:51 2024: System info: Linux version 5.15.0-101-generic (buildd@lcy02-amd64-032) (gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #111-Ubuntu SMP Tue Mar 5 20:16:58 UTC 2024
Wed Apr  3 12:21:51 2024: Loading rules from file /etc/falco/falco_rules.yaml
Wed Apr  3 12:21:51 2024: The chosen syscall buffer dimension is: 8388608 bytes (8 MBs)
Wed Apr  3 12:21:51 2024: Starting health webserver with threadiness 2, listening on 0.0.0.0:8765
Wed Apr  3 12:21:51 2024: Loaded event sources: syscall
Wed Apr  3 12:21:51 2024: Enabled event sources: syscall
Wed Apr  3 12:21:51 2024: Opening 'syscall' source with Kernel module
Wed Apr  3 12:21:57 2024: Falco version: 0.37.0 (x86_64)
Wed Apr  3 12:21:57 2024: Falco initialized with configuration file: /etc/falco/falco.yaml
Wed Apr  3 12:21:57 2024: System info: Linux version 5.15.0-101-generic (buildd@lcy02-amd64-032) (gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #111-Ubuntu SMP Tue Mar 5 20:16:58 UTC 2024
Wed Apr  3 12:21:57 2024: Loading rules from file /etc/falco/falco_rules.yaml
Wed Apr  3 12:21:57 2024: The chosen syscall buffer dimension is: 8388608 bytes (8 MBs)
Wed Apr  3 12:21:57 2024: Starting health webserver with threadiness 2, listening on 0.0.0.0:8765
Wed Apr  3 12:21:57 2024: Loaded event sources: syscall
Wed Apr  3 12:21:57 2024: Enabled event sources: syscall
Wed Apr  3 12:21:57 2024: Opening 'syscall' source with Kernel module

Les logs confirment que Falco et ses règles ont bien été chargés.

Tester Falco

Même sans ajouter de nouvelles règles, Falco contient des règles par défaut que nous pouvons utiliser pour tester son comportement. Suivez les étapes ci-dessous pour déclencher une alerte lorsqu'un shell est exécuté dans un conteneur en cours d'exécution.

Démarrez un conteneur Alpine :

$ kubectl run demo-falco --image alpine -- sh -c "sleep infinity"
pod/demo-falco created

Exécutez un shell sur le conteneur en cours d'exécution :

$ kubectl exec -it demo-falco -- sh -c "ls -al"
total 64
drwxr-xr-x    1 root     root          4096 Apr  3 11:36 .
drwxr-xr-x    1 root     root          4096 Apr  3 11:36 ..
drwxr-xr-x    2 root     root          4096 Jan 26 17:53 bin
drwxr-xr-x    5 root     root           360 Apr  3 11:36 dev
drwxr-xr-x    1 root     root          4096 Apr  3 11:36 etc
drwxr-xr-x    2 root     root          4096 Jan 26 17:53 home
drwxr-xr-x    7 root     root          4096 Jan 26 17:53 lib
drwxr-xr-x    5 root     root          4096 Jan 26 17:53 media
drwxr-xr-x    2 root     root          4096 Jan 26 17:53 mnt
drwxr-xr-x    2 root     root          4096 Jan 26 17:53 opt
dr-xr-xr-x  310 root     root             0 Apr  3 11:36 proc
drwx------    2 root     root          4096 Jan 26 17:53 root
drwxr-xr-x    1 root     root          4096 Apr  3 11:36 run
drwxr-xr-x    2 root     root          4096 Jan 26 17:53 sbin
drwxr-xr-x    2 root     root          4096 Jan 26 17:53 srv
dr-xr-xr-x   13 root     root             0 Apr  3 11:36 sys
drwxrwxrwt    2 root     root          4096 Jan 26 17:53 tmp
drwxr-xr-x    7 root     root          4096 Jan 26 17:53 usr
drwxr-xr-x   12 root     root          4096 Jan 26 17:53 var

Consultez maintenant les logs de Falco pour voir l'alerte :

$ kubectl logs -c falco -n falco -l app.kubernetes.io/name=falco |\
 grep "Notice"

{"hostname":"falco-fsvp8","output":"11:36:27.670410771: Notice A shell was spawned in a container with an attached terminal (evt_type=execve user=root user_uid=0 user_loginuid=-1 process=sh proc_exepath=/bin/busybox parent=runc command=sh -c ls -al terminal=34816 exe_flags=EXE_WRITABLE container_id=873807ba3669 container_image=docker.io/library/alpine container_image_tag=latest container_name=alpine k8s_ns=default k8s_pod_name=alpine)","priority":"Notice","rule":"Terminal shell in container","source":"syscall","tags":["T1059","container","maturity_stable","mitre_execution","shell"],"time":"2024-04-03T11:36:27.670410771Z", "output_fields": {"container.id":"873807ba3669","container.image.repository":"docker.io/library/alpine","container.image.tag":"latest","container.name":"alpine","evt.arg.flags":"EXE_WRITABLE","evt.time":1712144187670410771,"evt.type":"execve","k8s.ns.name":"default","k8s.pod.name":"alpine","proc.cmdline":"sh -c ls -al","proc.exepath":"/bin/busybox","proc.name":"sh","proc.pname":"runc","proc.tty":34816,"user.loginuid":-1,"user.name":"root","user.uid":0}}

Vous devriez voir dans les logs le message « Notice A shell was spawned in a container with an attached terminal ».

Utilisation de l'interface Falcosidekick

Maintenant que Falco est installé et testé, nous pouvons visualiser les événements dans l'interface Falcosidekick.

Affichez l'adresse IP externe :

$ kubectl get svc falco-falcosidekick-ui  -n falco
NAME                     TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)          AGE
falco-falcosidekick-ui   LoadBalancer   10.3.198.190   xx.xx.xx.xx   2802:31222/TCP   130m

Ouvrez votre navigateur et accédez à http://< EXTERNAL-IP >:2802 en utilisant les identifiants suivants :

  • Login : my-user (ou le login que vous avez défini dans la commande helm install)
  • Mot de passe : my-password (ou le mot de passe que vous avez défini dans la commande helm install)
Interface Falcosidekick Interface Falcosidekick

Cliquez sur l'onglet « EVENTS » :

Interface Falcosidekick

Vous devriez voir les événements précédents générés grâce à nos tests.

Archivage des événements dans un conteneur OVHcloud Object Storage

Vous pouvez également enregistrer/transférer les événements vers un bucket OVHcloud Object Storage (compatible avec l'API S31) afin d'archiver les sorties et de pouvoir les analyser ultérieurement si vous le souhaitez.

Pour cela, vous devez disposer d'un conteneur Object Storage. Si vous n'en avez pas déjà un, vous pouvez suivre le guide Créer un conteneur Object Storage.

Pour ce guide, notre conteneur Object Storage est :

  • un S3 compatible Object Storage - High Performance
  • dans la région GRA
  • avec un utilisateur nouvellement créé
  • nommé falco
Info

Conservez les identifiants Object Storage : vous utiliserez l'Object Storage access key et l'Object Storage secret key dans la prochaine commande helm install.

OVHcloud Object Storage

Cliquez sur le bucket falco pour y accéder et afficher ses informations, notamment l'endpoint, qui vous sera utile.

Bucket falco dans OVHcloud Object Storage

Il est maintenant temps de mettre à jour notre installation de Falco :

noglob helm upgrade falco \
    --version 4.0.0 \
    --create-namespace \
    --namespace falco \
    --set tty=true \
    --set falcosidekick.enabled=true \
    --set falcosidekick.image.tag=latest \
    --set falcosidekick.webui.enabled=true \
    --set falcosidekick.webui.user=myuser:mypassword \
    --set falcosidekick.webui.service.type=LoadBalancer \
    --set falcosidekick.config.aws.accesskeyid=xxxx \
    --set falcosidekick.config.aws.secretaccesskey=yyyy \
    --set falcosidekick.config.aws.checkidentity=false \
    --set falcosidekick.config.aws.s3.bucket=falco \
    --set falcosidekick.config.aws.region=gra \
    --set falcosidekick.config.extraEnv[0].name=AWS_S3_ENDPOINT,falcosidekick.config.extraEnv[0].value=https://s3.gra.perf.cloud.ovh.net \
  falcosecurity/falco
Info

noglob est nécessaire si vous êtes dans un environnement zsh. En effet, zsh essaiera d'interpréter les caractères [], et noglob permet de l'éviter.

Cette commande met à jour votre installation de Falco avec une nouvelle source Falcosidekick afin d'envoyer les sorties vers notre bucket OVHcloud Object Storage :

$ noglob helm upgrade falco \
    --version 4.0.0 \
    --create-namespace \
    --namespace falco \
    --set tty=true \
    --set falcosidekick.enabled=true \
    --set falcosidekick.image.tag=latest \
    --set falcosidekick.webui.enabled=true \
    --set falcosidekick.webui.user=myuser:mypassword \
    --set falcosidekick.webui.service.type=LoadBalancer \
    --set falcosidekick.config.aws.accesskeyid=xxxx \
    --set falcosidekick.config.aws.secretaccesskey=yyyy \
    --set falcosidekick.config.aws.checkidentity=false \
    --set falcosidekick.config.aws.s3.bucket=falco \
    --set falcosidekick.config.aws.region=gra \
    --set falcosidekick.config.extraEnv[0].name=AWS_S3_ENDPOINT,falcosidekick.config.extraEnv[0].value=https://s3.gra.perf.cloud.ovh.net \
  falcosecurity/falco
Release "falco" has been upgraded. Happy Helming!
NAME: falco
LAST DEPLOYED: Fri Apr  5 14:46:36 2024
NAMESPACE: falco
STATUS: deployed
REVISION: 3
NOTES:
Falco agents are spinning up on each node in your cluster. After a few
seconds, they are going to start monitoring your containers looking for
security issues.


No further action should be required.
Info

N'oubliez pas de remplacer l'AWSAccessKeyID et l'AWSSecretAccessKey (dans la commande helm upgrade, et plus particulièrement dans les paramètres --set falcosidekick.config.aws.accesskeyid et --set falcosidekick.config.aws.secretaccesskey) par les identifiants récupérés lors de la création du conteneur OVHcloud Object Storage.

Exécutez la commande qui génère un événement Falco afin d'envoyer la sortie dans le bucket :

$ kubectl exec -it demo-falco -- sh -c "ls -al"
total 64
drwxr-xr-x    1 root     root          4096 Apr  4 08:51 .
drwxr-xr-x    1 root     root          4096 Apr  4 08:51 ..
drwxr-xr-x    2 root     root          4096 Jan 26 17:53 bin
drwxr-xr-x    5 root     root           360 Apr  4 08:51 dev
drwxr-xr-x    1 root     root          4096 Apr  4 08:51 etc
drwxr-xr-x    2 root     root          4096 Jan 26 17:53 home
drwxr-xr-x    7 root     root          4096 Jan 26 17:53 lib
drwxr-xr-x    5 root     root          4096 Jan 26 17:53 media
drwxr-xr-x    2 root     root          4096 Jan 26 17:53 mnt
drwxr-xr-x    2 root     root          4096 Jan 26 17:53 opt
dr-xr-xr-x  203 root     root             0 Apr  4 08:51 proc
drwx------    2 root     root          4096 Jan 26 17:53 root
drwxr-xr-x    1 root     root          4096 Apr  4 08:51 run
drwxr-xr-x    2 root     root          4096 Jan 26 17:53 sbin
drwxr-xr-x    2 root     root          4096 Jan 26 17:53 srv
dr-xr-xr-x   13 root     root             0 Apr  4 08:51 sys
drwxrwxrwt    2 root     root          4096 Jan 26 17:53 tmp
drwxr-xr-x    7 root     root          4096 Jan 26 17:53 usr
drwxr-xr-x   12 root     root          4096 Jan 26 17:53 var

Affichez les logs :

$ kubectl logs -l app.kubernetes.io/part-of=falcosidekick --all-containers -n falco -f
...
2024/04/05 12:46:45 [INFO]  : Falcosidekick is up and listening on :2801
2024/04/05 12:46:45 [INFO]  : Enabled Outputs : [AWSS3 WebUI]
...
2024/04/05 12:58:26 [INFO]  : WebUI - Post OK (200)
2024/04/05 12:58:27 [INFO]  : AWS S3 - Upload payload OK

Les logs confirment que les événements ont bien été envoyés à l'interface ainsi qu'au bucket OVHcloud Object Storage.

Vous pouvez vérifier, dans votre conteneur/bucket OVHcloud Object Storage falco, que la sortie a bien été stockée :

Bucket falco dans OVHcloud Object Storage

Aller plus loin

Nous avons installé Falco et falcosidekick, découvert comment le tester, visualiser les événements et transférer les alertes vers un bucket, mais nous n'avons pas vu toutes ses fonctionnalités. Si elles vous intéressent, consultez le site officiel de Falco.

Après avoir reçu des événements, nous pouvons par exemple transférer les alertes vers de nombreuses autres applications grâce à Falcosidekick :

  • Slack
  • Discord
  • Elasticsearch
  • Amazon S3 (fait)
  • SMTP
  • Opsgenie
  • Webhook
  • Prometheus
  • Grafana
  • Datadog
  • ...

Si vous avez des questions ou rencontrez des difficultés avec Falco, consultez la communauté Slack de Falco.

Suppression (nettoyage)

Commencez par supprimer le pod demo-falco avec la commande suivante :

kubectl delete pod demo-falco

Pour désinstaller Falco, puisque vous l'avez installé via Helm, vous pouvez utiliser la commande helm uninstall afin de supprimer le chart Helm installé de Falco :

helm uninstall falco -n falco

Aller plus loin

  • Si vous avez besoin d'une formation ou d'une assistance technique pour la mise en oeuvre de nos solutions, contactez votre commercial ou cliquez sur ce lien pour obtenir un devis et demander une analyse personnalisée de votre projet à nos experts de l’équipe Professional Services.

Échangez avec notre communauté d'utilisateurs.

1 : S3 est une marque déposée appartenant à Amazon Technologies, Inc. Les services de OVHcloud ne sont pas sponsorisés, approuvés, ou affiliés de quelque manière que ce soit.

Cette page vous a-t-elle aidé ?