Utilisation de politiques de sécurité de pod avec Kubernetes Engine (OKE)

Découvrez comment utiliser les politiques de sécurité des pods avec les grappes Kubernetes que vous avez créées à l'aide de Kubernetes Engine (OKE).

Note

Le projet Kubernetes en amont a abandonné les politiques de sécurité des pods dans Kubernetes version 1.21 et a supprimé la fonction dans Kubernetes version 1.25. Par conséquent, Kubernetes Engine ne prend pas en charge les politiques de sécurité des pods et le contrôleur d'admission PodSecurityPolicy dans les grappes exécutant Kubernetes version 1.25 et ultérieure.

Si vous avez besoin de fonctionnalités similaires, envisagez plutôt d'utiliser les normes de sécurité des pods Kubernetes et le contrôleur d'admission PodSecurity (ainsi que les politiques Privilégié, Référence et Limité). Par défaut, le moteur Kubernetes active le contrôleur d'admission PodSecurity dans les grappes exécutant Kubernetes version 1.23 et ultérieure, afin de prendre en charge les normes de sécurité des pods. Pour plus d'informations sur les normes de sécurité de pod Kubernetes et le contrôleur d'admission PodSecurity, voir Normes de sécurité de pod dans la documentation sur Kubernetes.

Vous pouvez également envisager d'utiliser d'autres alternatives en cours de développement dans l'écosystème Kubernetes pour appliquer des politiques.

Si vous décidez de passer des politiques de sécurité de pod et du contrôleur d'admission PodSecurityPolicy aux normes de sécurité de pod et au contrôleur d'admission PodSecurity, voir Migrer de PodSecurityPolicy vers le contrôleur d'admission PodSecurity intégré dans la documentation sur Kubernetes. Notez qu'il est important de terminer la migration avant de créer une nouvelle grappe exécutant Kubernetes version 1.25, ou avant de mettre à niveau une grappe Kubernetes version 1.24 existante pour exécuter Kubernetes version 1.25. Notez également que la console offre un moyen pratique de désactiver l'utilisation du contrôleur d'admission PodSecurityPolicy dans les grappes Kubernetes existantes créées et gérées par le moteur Kubernetes (voir Utilisation de la console pour désactiver le contrôleur d'admission PodSecurityPolicy).

Vous pouvez contrôler les opérations que les pods sont autorisés à effectuer sur une grappe que vous avez créée avec Kubernetes Engine en configurant des politiques de sécurité de pod pour la grappe. Les politiques de sécurité de pod permettent de s'assurer que les pods répondent aux conditions de sécurité avant d'être acceptés par une grappe. Par exemple, vous pouvez utiliser des politiques de sécurité de pod pour :

  • limiter les choix de stockage disponibles pour les pods
  • limiter les ports et les réseaux hôtes auxquels les pods peuvent accéder
  • empêcher l'exécution des pods en tant qu'utilisateur racine
  • empêcher l'exécution des pods en mode privilégié

Vous pouvez également utiliser les politiques de sécurité de pod pour fournir des valeurs par défaut pour les pods, en les 'mutant'.

Après avoir défini une politique de sécurité de pod pour une grappe, vous devez autoriser le compte de service de l'utilisateur demandeur ou du pod cible à utiliser cette politique. Pour ce faire, vous devez créer un rôle (ou rôle de grappe) pour accéder à la politique de sécurité de pod, puis créer une liaison de rôle de grappe entre le rôle (ou rôle de grappe) et le compte de service de l'utilisateur demandeur ou du pod cible. Pour plus d'informations sur les rôles, les rôles de grappe et les liaisons, voir À propos du contrôle d'accès et de Kubernetes Engine (OKE).

Vous indiquez si une grappe applique les politiques de sécurité de pod définies pour elle en activant le contrôleur d'admission PodSecurityPolicy pour la grappe. Le contrôleur d'admission PodSecurityPolicy agit lors de la création et de la modification d'un pod et détermine si le pod doit être admis dans la grappe en fonction du contexte de sécurité demandé dans la spécification du pod et des politiques de sécurité de pod de la grappe. Si plusieurs politiques de sécurité de pod existent, le contrôleur d'admission PodSecurityPolicy compare d'abord le pod aux politiques sans mutation par ordre alphabétique et utilise la première politique qui valide le pod. Si aucune politique sans mutation ne valide le pod, le contrôleur d'admission PodSecurityPolicy compare le pod aux politiques avec mutation par en ordre alphabétique et utilise la première politique qui valide le pod.

Attention

Attention 1 :

Il est très important de noter que lorsque vous activez le contrôleur d'admission PodSecurityPolicy d'une grappe, aucun pod d'application ne peut démarrer sur la grappe à moins que les politiques de sécurité de pod appropriées n'existent, ainsi que les rôles (ou rôles de grappe) et les liaisons de rôle de grappe pour associer les pods aux politiques. Vous ne pourrez pas exécuter les pods d'application sur une grappe avec un contrôleur d'admission PodSecurityPolicy activé, à moins que ces préalables ne soient respectés.

Nous vous recommandons vivement d'utiliser les contrôleurs d'admission PodSecurityPolicy comme suit :

  • Lorsque vous créez une nouvelle grappe, activez le contrôleur d'admission de sécurité des pods.
  • Immédiatement après la création d'une nouvelle grappe, créez des politiques de sécurité des pods, ainsi que des rôles (ou rôles de grappe) et des liaisons de rôle (ou liaisons de rôle de grappe).

Attention 2 :

Vous devez créer des politiques de sécurité des pods avant d'activer le contrôleur d'admission PodSecurityPolicy d'une grappe existante déjà en production (quelque temps après sa création). Si vous décidez d'activer le contrôleur d'admission PodSecurityPolicy d'une grappe existante, nous vous recommandons vivement de vérifier d'abord les politiques de sécurité des pods de la grappe dans un environnement de développement ou de test. Cela vous permettra de vérifier que les politiques de sécurité des pods fonctionnent comme vous l'attendez et autorisent (ou interdisent) correctement le démarrage des pods dans la grappe.

Lorsque vous activez le contrôleur d'admission PodSecurityPolicy d'une grappe que vous avez créée avec le moteur Kubernetes, une politique de sécurité de pod pour les pods privilégiés du système Kubernetes est créée automatiquement (ainsi que le rôle de grappe et la liaison de rôle de grappe associés). Cette politique de sécurité de pod, ainsi que le rôle de grappe et la liaison de rôle de grappe, permettent aux pods du système Kubernetes de s'exécuter. La politique de sécurité de pod, le rôle de grappe et la liaison de rôle de grappe sont définis dans le fichier kube-system.yaml (voir Informations de référence sur le fichier kube-system.yaml).

Notez que vous pouvez créer des politiques de sécurité des pods pour une grappe avant d'activer le contrôleur d'admission PodSecurityPolicy de la grappe. Notez également que vous pouvez désactiver le contrôleur d'admission PodSecurityPolicy d'une grappe qui avait été activé précédemment. Dans un tel cas, les politiques de sécurité de pods, les rôles (ou rôles de grappe) et les liaisons de rôle de grappe précédemment créés ne sont pas supprimés. Les politiques de sécurité de pod ne sont tout simplement pas appliquées. Tout pod d'application pourra être exécuté sur la grappe.

Pour plus d'informations sur les politiques de sécurité de pod et le contrôleur d'admission de PodSecurityPolicy, voir documentation relative à Kubernetes.

Création d'une politique de sécurité de pod pour les pods d'application

Pour créer une politique de sécurité pour les pods d'application, créez un rôle pour accéder à la politique de sécurité de pod et créez une liaison de rôle pour permettre aux pods d'application d'utiliser la politique de sécurité de pod :

  1. Créez la politique de sécurité de pod pour les pods d'application :
    1. Définissez la politique de sécurité de pod et enregistrez-la dans un fichier. Par exemple, dans acme-app-psp.yaml.

      À titre d'exemple, cette politique (tirée de la documentation de Kubernetes) empêche simplement la création de pods préférés :

      
      apiVersion: policy/v1beta1
      kind: PodSecurityPolicy
      metadata:
        name: acme-app-psp
      spec:
        privileged: false  # Don't allow privileged pods!
        # The rest fills in some required fields.
        seLinux:
          rule: RunAsAny
        supplementalGroups:
          rule: RunAsAny
        runAsUser:
          rule: RunAsAny
        fsGroup:
          rule: RunAsAny
        volumes:
        - '*'
    2. Entrez la commande suivante pour créer la politique de sécurité de pod :

      kubectl create -f <filename>.yaml

      Par exemple :

      kubectl create -f acme-app-psp.yaml
  2. Créez le rôle (ou rôle de grappe) pour accéder à la politique de sécurité de pod :
    1. Définissez un rôle (ou rôle de grappe) et enregistrez-le dans un fichier. Par exemple, dans acme-app-psp-crole.yaml.

      Par exemple :

      # Cluster role which grants access to the app pod security policy
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        name: acme-app-psp-crole
      rules:
      - apiGroups:
        - policy
        resourceNames:
        - acme-app-psp
        resources:
        - podsecuritypolicies
        verbs:
        - use
      
    2. Entrez la commande suivante pour créer le rôle de grappe :

      kubectl create -f <filename>.yaml

      Par exemple :

      kubectl create -f acme-app-psp-crole.yaml
  3. Créez la liaison de rôle de grappe pour autoriser les pods d'application à utiliser la politique de sécurité de pod :
    1. Définissez la liaison de rôle de grappe et enregistrez-la dans un fichier. Par exemple, dans acme-app-psp-crole-bind.yaml.

      Par exemple :

      
      # Role binding which grants access to the app pod security policy
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: acme-app-psp-binding
        namespace: acme-namespace
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: acme-app-psp-crole
      subjects:
      # For all service accounts in acme-namespace
      - apiGroup: rbac.authorization.k8s.io
        kind: Group
        name: system:serviceaccounts:acme-namespace
    2. Entrez la commande suivante pour créer la liaison de rôle de grappe :

      kubectl create -f <filename>.yaml

      Par exemple :

      kubectl create -f acme-app-psp-crole-bind.yaml

Après avoir défini une politique de sécurité de pod et autorisé les pods d'application à l'utiliser en créant un rôle de grappe et une liaison de rôle de grappe, activez le contrôleur d'application PodSecurityPolicy pour appliquer la politique de sécurité de pod (s'il n'est pas déjà activé).

Utilisation de la console pour activer le contrôleur d'admission PodSecurityPolicy

Pour activer le contrôleur d'admission PodSecurityPolicy lors de la création de nouvelles grappes à l'aide de la console :

  1. Connectez-vous à la console.
  2. Pour créer une grappe, suivez les instructions sous Utilisation de la console pour créer une grappe avec des paramètres définis explicitement dans le flux de création personnalisée, sélectionnez Afficher les options avancées et sélectionnez l'option Politiques de sécurité des pods - Mise en oeuvre. Cette option active le contrôleur d'admission PodSecurityPolicy.

    Aucun pod d'application ne sera accepté dans la nouvelle grappe, sauf si les politiques de sécurité de pod appropriées existent, ainsi que les rôles de grappe et les liaisons de rôle de grappe associant les pods aux politiques.

  3. Suivez les instructions pour définir les détails restants de la grappe et sélectionnez Créer une grappe pour créer la nouvelle grappe.
  4. Suivez les instructions décrites dans Création d'une politique de sécurité de pod pour les pods d'application afin de créer des politiques de sécurité des pods pour le contrôleur d'admission PodSecurityPolicy à appliquer lors de l'acceptation de pods dans la nouvelle grappe.

Pour activer le contrôleur d'admission PodSecurityPolicy dans des grappes existantes au moyen de la console :

  1. Suivez les instructions décrites dans Création d'une politique de sécurité de pod pour les pods d'application afin de créer des politiques de sécurité de pods pour le contrôleur d'admission PodSecurityPolicy à appliquer lors de l'acceptation de pods dans la grappe existante.

    Nous vous recommandons vivement de vérifier d'abord les politiques de sécurité des pods dans un environnement de développement ou de test. Cela vous permettra de vérifier que les politiques de sécurité des pods fonctionnent comme vous l'attendez et autorisent (ou interdisent) correctement le démarrage des pods dans la grappe.

  2. Dans la page de liste Grappes, sélectionnez le nom de la grappe à modifier. Si vous avez besoin d'aide pour trouver la page de liste ou la grappe, voir Liste des grappes.
  3. Dans l'onglet Détails de la grappe, sélectionnez Pas de mise en oeuvre à côté de Politiques de sécurité des pods.
  4. Dans la fenêtre Politiques de sécurité des pods, sélectionnez Mise en oeuvre.

    Dorénavant, aucun nouveau pod d'application ne sera accepté dans la grappe, sauf si les politiques de sécurité des pods appropriées existent, ainsi que les rôles de grappe et les liaisons de rôle de grappe associant les pods aux politiques. Notez que tous les pods en cours continueront de s'exécuter.

  5. Sélectionnez Enregistrer les modifications.

Utilisation de la console pour désactiver le contrôleur d'admission PodSecurityPolicy

Pour désactiver le contrôleur d'admission PodSecurityPolicy dans les grappes où il était précédemment activé :

  1. Dans la page de liste Grappes, sélectionnez le nom de la grappe à modifier. Si vous avez besoin d'aide pour trouver la page de liste ou la grappe, voir Liste des grappes.
  2. Dans l'onglet Détails de la grappe, sélectionnez Mise en oeuvre à côté de Politiques de sécurité des pods.
  3. Dans la fenêtre Politiques de sécurité des pods, sélectionnez Non mis en oeuvre.

    À partir de maintenant, les nouveaux pods d'application seront acceptés dans la grappe sans que les politiques de sécurité des pods, les rôles de grappe et les liaisons de rôle de grappe soient requis. Notez que tous les pods en cours continueront de s'exécuter.

  4. Sélectionnez Enregistrer les modifications.

Utilisation de l'API

Pour plus d'informations sur l'utilisation de l'API et sur les demandes de signature, voir la documentation de l'API REST et Données d'identification de sécurité. Pour plus d'informations sur les trousses SDK, voir Trousses SDK et interface de ligne de commande.

Pour activer le contrôleur d'admission PodSecurityPolicy, utilisez l'une des opérations suivantes :

  • Opération CreateCluster lors de la création de nouvelles grappes
  • Opération Update Cluster lors de la modification de grappes existantes

Informations de référence sur kube-system.yaml

La politique de sécurité de pod, ainsi que le rôle de grappe et la liaison de rôle de grappe associés, pour les pods privilégiés du système Kubernetes sont créés automatiquement lors de l'activation du contrôleur d'admission PodSecurityPolicy d'une grappe. Ils permettent l'exécution de tout pod dans l'espace de noms kube-system. Ils sont créés à partir des définitions dans le fichier kube-system.yaml indiqué ci-dessous :


apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  annotations:
    # See https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp
    seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'
  name: oke-privileged
spec:
  allowedCapabilities:
  - '*'
  allowPrivilegeEscalation: true
  fsGroup:
    rule: 'RunAsAny'
  hostIPC: true
  hostNetwork: true
  hostPID: true
  hostPorts:
  - min: 0
    max: 65535
  privileged: true
  readOnlyRootFilesystem: false
  runAsUser:
    rule: 'RunAsAny'
  seLinux:
    rule: 'RunAsAny'
  supplementalGroups:
    rule: 'RunAsAny'
  volumes:
  - '*'
  
---
  
# Cluster role which grants access to the privileged pod security policy
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: oke-privileged-psp
rules:
- apiGroups:
  - policy
  resourceNames:
  - oke-privileged
  resources:
  - podsecuritypolicies
  verbs:
  - use
  
---
  
# Role binding for kube-system - allow kube-system service accounts - should take care of CNI i.e. flannel running in the kube-system namespace
# Assumes access to the kube-system is restricted
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kube-system-psp
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: oke-privileged-psp
subjects:
# For all service accounts in the kube-system namespace
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: system:serviceaccounts:kube-system