Aller au contenu principal

kubescape un outil d'audit de cluster K8S

· 9 minutes de lecture
Stéphane ROBERT
Consultant DevOps

Kubernetes prend une place de plus en plus importante dans les infrastructures, même s'il est assez facile de déployer et de garantir la disponibilité des applications, sa mécanique est réellement complexe. Et comme on dit souvent "sans maîtrise, la puissance n'est rien". En effet, installé et configuré par défaut un cluster kubernetes est vulnérable aux attaques.

Je vous propose de découvrir kubescape, un outil open source de contrôle de sécurité de clusters Kubernetes, développé par la société ARMO. Cet outil est un véritable couteau suisse de la sécurité des infrastructures cloud native, en effet il permet :

  • d'analyser les clusters de Kubernetes;
  • d'inspecter les registres de conteneurs dont Elastic Container Registry, Google Container Registry, Quay, ...;
  • d'analyser les manifests au format YAML mais aussi les charts HELM;

Attention c'est plus qu'un outil d'analyse, kubescape fournit sur son site toutes les documentations pour remédier aux failles découvertes. Pour ceux qui veulent progresser sur kubernetes cet outil est une véritable mine d'or.

Son écosystème est très important, car Armo fournit :

  • Une CLI qui peut être utiliser dans la plupart des outils de CI/CD;
  • Une extension Visual Code qui vous assiste dans la rédaction des Charts HELM et des manifests YAML;
  • Un espace Cloud qui permet entre autre de stocker les résultats des scans;

Nous allons nous concentrer sur l'utilisation de la CLI et de l'interprétation des résultats.

Installation de kubescape

L'installation est assez simple puisqu'elle peut être faite via une simple commande curl :

curl -s https://raw.githubusercontent.com/kubescape/kubescape/master/install.sh | /bin/bash

Une fois installée, vous pouvez vérifier la version installée :

kubescape version
Your current version is: v2.0.176

Fonctionnement de kubescape

kubescape utilise toute une série de contrôles basés sur les directives de sécurité fournies par la NSA, la CISA et Microsoft, entre autres. Ces contrôles sont regroupés en quatre catégories, appelées des cadres :

  • NSA: suit les directives d'hardening de Kubernetes fournies par la NSA, qui se concentre sur la sécurité des applications.
  • MITRE: suit les directives fournies par le framework MITRE de Microsoft. MITRE vise principalement à protéger les clusters de Kubernetes.
  • ArmoBest: le Cadre ARMO est maintenu par les mêmes personnes derrière kubescape. Le cadre tente de couvrir les angles morts entre les cadres MITRE et NSA.
  • DevOpsBest: un cadre minimal couvrant les points les plus essentiels pour la sécurité des infrastructures et des applications.
  • ...

Par défaut, kubescape exécutera tous ces frameworks et indiquera un niveau de risque pour chacun d'entre eux.

Pour affichier les frameworks disponibles :

kubescape list frameworks
+----------------------+
| SUPPORTED FRAMEWORKS |
+----------------------+
|     AllControls      |
+----------------------+
|       ArmoBest       |
+----------------------+
|         CIS          |
+----------------------+
|      DevOpsBest      |
+----------------------+
|        MITRE         |
+----------------------+
|         NSA          |
+----------------------+

Nos Premiers scans avec kubescape

Plutôt que de lancer tous les contrôles, nous allons découper notre analyse sous deux angles. En effet, l'analyse peut se faire soit sur l'état de santé du Cluster, soit de celui des applications qu'il héberge.

Analyse d'un Cluster Kubernetes avec kubescape

En premier lieu, pour assurer la sécurité des applications hébergées au sein de nos clusters Kubernetes contre les attaques, il est important que ceux-ci soient correctement hardener (durci).

kubescape permet :

  • D'identifier des nodes non sécurisés (clients Kubelet sans authentification TLS)
  • De rechercher les interfaces exposées et non sécurisées, par ex. une API.
  • De détecter si le cluster est affecté par des CVE connues.
  • De détecter les politiques réseau manquantes.
  • ...

Pour lancer une analyse, il suffit de lancer la commande scan :

kubescape scan

[info] Kubescape scanner starting
[warning] Kubernetes cluster nodes scanning is disabled. This is required to collect valuable data for certain controls. You can enable it using  the --enable-host-scan flag
[info] Downloading/Loading policy definitions
[success] Downloaded/Loaded policy
[info] Accessing Kubernetes objects
[success] Accessed to Kubernetes objects
[info] Requesting images vulnerabilities results
[warning] failed to collect image vulnerabilities. error: credentials are not configured for any registry adaptor
[success] Requested images vulnerabilities results
[info] Requesting Host scanner data
[info] Scanning. Cluster: default
[success] Done scanning. Cluster: default
...

Pour simplifier la lecture et je préfère cette solution, car elle fournit les liens de remédiations des erreurs rencontrées, j'utilise la sortie au format html.

kubescape scan  --format html --output results.html

Un exemple de remédiation proposé :

Il suffit de suivre le lien.

Limiter le scan à un framework, un namespace

Par exemple pour limiter le scan au framework Dev

kubescape scan framework DevOpsBest --enable-host-scan
[info] Kubescape scanner starting
[info] Installing host scanner
[info] Downloading/Loading policy definitions
[success] Downloaded/Loaded policy
[info] Accessing Kubernetes objects
[success] Accessed to Kubernetes objects
[info] Scanning. Cluster: default
[success] Done scanning. Cluster: default

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Controls: 11 (Failed: 8, Excluded: 0, Skipped: 0)
Failed Resources by Severity: Critical — 0, High — 16, Medium — 8, Low — 22

+----------+------------------------------------+------------------+--------------------+---------------+--------------+
| SEVERITY |            CONTROL NAME            | FAILED RESOURCES | EXCLUDED RESOURCES | ALL RESOURCES | % RISK-SCORE |
+----------+------------------------------------+------------------+--------------------+---------------+--------------+
| High     | Resources CPU limit and request    |        8         |         2          |      11       |     73%      |
| High     | Resources memory limit and request |        8         |         1          |      11       |     73%      |
| Medium   | Configured liveness probe          |        7         |         0          |      11       |     64%      |
| Medium   | Container hostPort                 |        1         |         0          |      11       |      9%      |
| Low      | Configured readiness probe         |        7         |         0          |      11       |     64%      |
| Low      | K8s common labels usage            |        6         |         2          |      11       |     55%      |
| Low      | Label usage for resources          |        8         |         2          |      11       |     73%      |
| Low      | Pods in default namespace          |        1         |         0          |      11       |      9%      |
+----------+------------------------------------+------------------+--------------------+---------------+--------------+
|          |          RESOURCE SUMMARY          |        9         |         2          |      22       |    43.80%    |
+----------+------------------------------------+------------------+--------------------+---------------+--------------+
FRAMEWORK DevOpsBest

A un namespace :

kubescape scan --include-namespaces default framework DevOpsBest

Cet outil regorge d'options. Pour les découvrir, il suffit d'utiliser l'option --help, cela fonctionne avec toutes les commandes.

kubescape list --help
List frameworks/controls will list the supported frameworks and controls

Usage:
  kubescape list <policy> [flags]

Examples:

  # List default supported frameworks names
  kubescape list frameworks

  # List all supported frameworks names
  kubescape list frameworks --account <account id>

  # List all supported controls names with ids
  kubescape list controls

  Control documentation:
  https://hub.armosec.io/docs/controls
  ...

Analyse des manifests YAML et des charts HELM

Kubescape permet d'analyser les manifests YAML mais aussi les Charts HELM. Il permet même de le faire directement dans le dépôt du code source.

kubescape scan framework DevOpsBest https://github.com/kubescape/kubescape
[info] Kubescape scanner starting
[info] Downloading/Loading policy definitions
[success] Downloaded/Loaded policy
[info] Accessing local objects
[info] cloning. repository url: https://github.com/kubescape/kubescape
[warning] failed to collect images vulnerabilities. error: credentials are not configured for any registry adaptor
[success] Done accessing local objects
[info] Scanning Repo
[success] Done scanning Repo

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Controls: 10 (Failed: 8, Excluded: 0, Skipped: 0)
Failed Resources by Severity: Critical — 0, High — 2, Medium — 4, Low — 43

+----------+------------------------------------+------------------+--------------------+---------------+--------------+
| SEVERITY |            CONTROL NAME            | FAILED RESOURCES | EXCLUDED RESOURCES | ALL RESOURCES | % RISK-SCORE |
+----------+------------------------------------+------------------+--------------------+---------------+--------------+
| High     | Resources CPU limit and request    |        1         |         0          |      16       |      6%      |
| High     | Resources memory limit and request |        1         |         0          |      16       |      6%      |
| Medium   | Configured liveness probe          |        3         |         0          |      16       |     19%      |
| Medium   | Container hostPort                 |        1         |         0          |      16       |      6%      |
| Low      | Configured readiness probe         |        2         |         0          |      16       |     13%      |
| Low      | K8s common labels usage            |        14        |         2          |      16       |     88%      |
| Low      | Label usage for resources          |        14        |         0          |      16       |     88%      |
| Low      | Pods in default namespace          |        13        |         0          |      16       |     81%      |
+----------+------------------------------------+------------------+--------------------+---------------+--------------+
|          |          RESOURCE SUMMARY          |        14        |         2          |      16       |    20.27%    |
+----------+------------------------------------+------------------+--------------------+---------------+--------------+
FRAMEWORK DevOpsBest
...

Pour analyser des manifests YAML :

kubescape scan *.yaml

Pour analyser un une chart HELM :

kubescape scan https://github.com/AdminTurnedDevOps/PearsonCourses/tree/main/Helm-Charts-For-Kubernetes/Segment3/nginxupdate

En analysant les manifests, kubescape peut détecter des problèmes de type :

  • Services SSH non sécurisés fonctionnant à l'intérieur d'un conteneur
  • Utilisation de sudo des dans la commande de démarrage d'un conteneur
  • Exécution de conteneurs en tant que root ou avec des capacités excessives
  • Pods prenant trop de ressources CPU et Mémoire.
  • ...

A la fin de l'analyse kubescape fourni un score de risque de 0% ( très sécurisé ) à 100% ( non sécurisé ).

Utilisation dans les outils de CI/CD

kubescape peut être utilisé dans la plupart des outils de CI/CD dont :

  • Gitlab-CI
  • ArgoCD
  • CircleCI
  • Azure Devops Pipeline
  • Github Actions
  • Jenkins
  • ...

Un exemple de pipeline avec Github Actions :

name: Kubescape scanning for misconfigurations
on: [push, pull_request]
jobs:
  kubescape:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - uses: kubescape/github-action@main
      continue-on-error: true
      with:
        format: sarif
        outputFile: results.sarif
        # # Optional: Specify the Kubescape cloud account ID
        # account: ${{secrets.KUBESCAPE_ACCOUNT}}
        # # Optional: Scan a specific path. Default will scan the whole repository
        # files: "examples/*.yaml"
    - name: Upload Kubescape scan results to Github Code Scanning
      uses: github/codeql-action/upload-sarif@v2
      with:
        sarif_file: results.sarif

Tout est envisageable avec kubescape!

Utilisation de l'extension VSCode

kubescape fournit également une extension VSCode qui permet d'analyser à la volée un manifest.

Conclusion

kubescape est vraiment un bel outil qui mérite qu'on s'y attarde. Je n'ai pas essayé de l'installer dans mon cluster Kubernetes, car c'est possible, mais je vais pousser mon analyse plus loin.

Lien vers le projet kubescape