Sécurité dans Kubernetes avec MetalLB : Isolation des Locataires via Politiques Réseau et RBAC

Dans un environnement Kubernetes multi-locataires, garantir l'isolation réseau et la sécurité des accès aux ressources est primordial. MetalLB, un équilibreur de charge réseau open-source, peut être sécurisé de manière efficace en combinant les Politiques Réseau (Network Policies) et le contrôle d'accès basé sur les rôles (RBAC). Cette approche crée un modèle de sécurité robuste pour séparer les différents locataires au sein d'un même cluster.

L'adoption croissante de Kubernetes pour les applications d'entreprise rend le multi-locataire de plus en plus courant. Les locataires (départements, équipes, clients) partageant un cluster Kubernetes nécessitent une isolation stricte de leur trafic réseau et de leurs permissions d'accès aux ressources afin de prévenir les accès non autorisés et les fuites de données. MetalLB, étant un composant de mise en réseau au niveau du cluster, doit lui-même être sécurisé pour garantir la sécurité globale du réseau.

Bien que MetalLB soit stable et utilisé en production, les fonctionnalités de sécurité telles que l'isolation des locataires requièrent une configuration manuelle par l'administrateur. Il est important de noter que les formats de configuration de MetalLB peuvent évoluer, nécessitant une attention particulière à la compatibilité lors de l'implémentation des politiques de sécurité.

Contrôle des Communications Pod à Pod avec les Politiques Réseau

Les Politiques Réseau de Kubernetes offrent un mécanisme natif d'isolation réseau, permettant de définir des règles de communication fines entre les Pods. Le projet MetalLB inclut des politiques réseau par défaut pour restreindre le trafic. Le fichier config/networkpolicies/deny_all.yaml définit une politique qui, par défaut, bloque tout trafic entrant et sortant pour les Pods dans le namespace metallb-system :

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
  namespace: metallb-system
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

Sur cette base, des politiques plus spécifiques peuvent être créées. Par exemple, config/networkpolicies/controller.yaml autorise le Pod du contrôleur MetalLB à communiquer avec le serveur API Kubernetes (port 6443) et expose les ports metricshttps et webhook-server pour les connexions entrantes :

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: controller
  namespace: metallb-system
spec:
  podSelector:
    matchLabels:
     app: metallb
     component: controller
  egress:
   - ports:
       - protocol: TCP
         port: 6443
  ingress:
    - ports:
        - protocol: TCP
          port: metricshttps
        - protocol: TCP
          port: webhook-server
  policyTypes:
    - Egress
    - Ingress

Ces politiques limitent le Pod du contrôleur aux communications nécessaires, réduisant ainsi la surface d'attaque. Les Pods Speaker, utilisant le réseau hôte, ne nécessitent généralement pas de politiques réseau.

Contrôle d'Accès Granulaire avec RBAC

Le contrôle d'accès basé sur les rôles (RBAC) régit les permissions d'accès des utilisateurs et des composants au niveau de l'API Kubernetes. Les configurations RBAC de MetalLB se trouvent dans le répertoire config/rbac/.

Définitions de Rôles

Les fichiers role.yaml définissent les rôles (ClusterRole et Role) nécessaires aux composants de MetalLB. Par exemple, le ClusterRole du contrôleur inclut des permissions pour accéder et surveiller les services, les namespaces, et gérer les ressources personnalisées comme les ipaddresspools.metallb.io. Le ClusterRole du Speaker est principalement utilisé pour accéder aux informations sur l'état des services et des nœuds.

Voici un extrait du ClusterRole du contrôleur :

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    app: metallb
  name: metallb-system:controller
rules:
  - apiGroups:
      - ""
    resources:
      - services
      - namespaces
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - metallb.io
    resources:
      - ipaddresspools
      - ipaddresspools/status
    verbs:
      - get
      - list
      - watch
      - update

Comptes de Service (Service Accounts)

Le fichier config/rbac/service-accounts.yaml crée des ServiceAccount dédiés pour le contrôleur et le Speaker :

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app: metallb
  name: controller
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app: metallb
  name: speaker

En liant ces comptes de service à leurs rôles respectifs via RoleBinding et ClusterRoleBinding, on s'assure que les composants de MetalLB n'accèdent qu'aux resssources dont ils ont besoin.

Synergie entre Politiquse Réseau et RBAC

Les Politiques Réseau contrôlent le trafic réseau, tandis que RBAC gère l'accès à l'API. Leur combinaison offre une défense en profondeur.

Isolation du Plan de Contrôle

Le contrôleur MetalLB, en tant que composant du plan de contrôle, est limité par les Politiques Réseau à la communication avec le serveur API Kubernetes. RBAC restreint davantage ses permissions API. Ce double contrôle empêche l'accès réseau non autorisé et l'abus des permissions.

Isolation du Plan de Données

Pour le trafic des services des locataires, des namespaces distincts peuvent être créés. Les Politiques Réseau peuvent alors restreindre le trafic inter-namespaces. RBAC limite les locataires à la gestion des ressources MetalLB au sein de leurs propres namespaces (par exemple, pools d'adresses IP, annonces BGP), assurant l'isolation des accès aux ressources.

Exemple de Mise en Œuvre du Modèle de Sécurité

Voici un scénario typique de multi-locataire :

  1. Création des Namespaces Locataires : Créer des namespaces dédiés, par exemple tenant-a et tenant-b.
  2. Configuration des Politiques Réseau : Dans le namespace metallb-system, autoriser les communications nécessaires du contrôleur vers les namespaces locataires. Dans les namespaces locataires, définir des Politiques Réseau pour refuser le trafic inter-locataires.
  3. Définition des Rôles RBAC : Créer des rôles pour chaque locataire, autorisant uniquement la gestion des ressources MetalLB dans leur namespace, et lier ces rôles à leurs comptes de service.
  4. Isolation Physique des Ressources : Utiliser les sélecteurs de nœuds dans les pools d'adresses IP de MetalLB pour allouer des pools spécifiques à des nœuds distincts, isolant ainsi davantage les ressources réseau sous-jacentes. Le contrôleur de pools d'adresses IP de MetalLB (internal/k8s/controllers/pool_controller.go) prend en charge la sélection de nœuds spécifiques.

Meilleures Pratiques de Sécurité

  • Principe du Moindre Privilège : Accorder uniquement les permissions réseau et RBAC strictement nécessaires à MetalLB et aux locataires.
  • Audit Régulier : Examiner périodiquement les configurations de Politiques Réseau et RBAC pour s'assurer qu'aucune règle n'est trop permissive.
  • Gestion des Versions : Suivre les mises à jour de MetalLB et appliquer les correctifs de sécurité ainsi que les changements de configuraton pertinents.
  • Surveillance et Journalisation : Activer les métriques Prometheus de MetalLB pour surveiller le trafic réseau et l'accès API, afin de détecter rapidement toute activité anormale.

En combinant les Politiques Réseau et RBAC, MetalLB peut fournir une isolation multi-locataires robuste pour les clusters Kubernetes. Cette approche crée un modèle de sécurité multicouche qui contrôle à la fois le trafic réseau et l'accès aux ressources API. Les administrateurs doivent configurer judicieusement ces règles et suivre les meilleures pratiques de sécurité pour assurer un fonctionnement stable et sécurisé de MetalLB.

Étiquettes: kubernetes metallb network policy RBAC Sécurité

Publié le 13 juin à 17h30