Utilisation des stratégies de sécurité de pod avec Kubernetes Engine (OKE)
Découvrez comment utiliser les stratégies de sécurité de pod avec les clusters Kubernetes que vous avez créés à l'aide de Kubernetes Engine (OKE).
Le projet Kubernetes en amont a abandonné les stratégies de sécurité de pod dans Kubernetes version 1.21 et a enlevé la fonctionnalité dans la version 1.25 de Kubernetes. Par conséquent, Kubernetes Engine ne prend pas en charge les stratégies de sécurité de pod et le contrôleur d'admission PodSecurityPolicy dans les clusters exécutant Kubernetes versions 1.25 et ultérieures.
Si vous avez besoin de fonctionnalités similaires, envisagez plutôt d'utiliser les normes de sécurité de pod Kubernetes et le contrôleur d'admission PodSecurity (avec les stratégies privilégiées, de référence et restreintes). Par défaut, Kubernetes Engine active le contrôleur d'admission PodSecurity dans les clusters exécutant Kubernetes version 1.23 et ultérieure, afin de prendre en charge les normes de sécurité de pod. Pour plus d'informations sur les normes de sécurité de pod Kubernetes et le contrôleur d'admission PodSecurity, reportez-vous à Normes de sécurité de pod dans la documentation Kubernetes.
Vous pouvez également envisager d'utiliser d'autres alternatives développées dans l'écosystème Kubernetes pour appliquer les stratégies.
Si vous décidez de passer de l'utilisation des stratégies de sécurité de pod et du contrôleur d'admission PodSecurityPolicy à l'utilisation des normes de sécurité de pod et du contrôleur d'admission PodSecurity, reportez-vous à Migration de PodSecurityPolicy vers le contrôleur d'admission PodSecurity intégré dans la documentation Kubernetes. Il est important de terminer la migration avant de créer un cluster exécutant Kubernetes version 1.25 ou avant de mettre à niveau un cluster Kubernetes version 1.24 existant 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 clusters Kubernetes existants créés et gérés par Kubernetes Engine (reportez-vous à 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 un cluster que vous avez créé avec Kubernetes Engine en configurant des stratégies de sécurité de pod pour le cluster. Les stratégies de sécurité de pod permettent de s'assurer que les pods répondent aux conditions liées à la sécurité pour pouvoir être acceptés par un cluster. Par exemple, vous pouvez utiliser des stratégies de sécurité de pod pour :
- limiter les choix de stockage disponibles pour les pods,
- restreindre les fonctions de réseau hôte et les ports auxquels les pods peuvent accéder,
- empêcher l'exécution des pods en tant qu'utilisateur root,
- empêcher l'exécution des pods en mode privilégié.
Vous pouvez également utiliser des stratégies de sécurité de pod pour fournir les valeurs par défaut des pods, en effectuant une "mutation" du pod.
Une fois que vous avez défini une stratégie de sécurité de pod pour un cluster, vous devez autoriser l'utilisateur à l'origine de la demande ou le compte de service du pod cible à l'utiliser. Pour ce faire, créez un rôle (ou clusterrole) pour accéder à la stratégie de sécurité de pod, puis créez une liaison de rôle (ou clusterrolebinding) entre le rôle (ou clusterrole) et l'utilisateur à l'origine de la demande ou le compte de service du pod cible. Pour plus d'informations sur les rôles, les rôles de cluster et les liaisons, reportez-vous à A propos du contrôle d'accès et du moteur Kubernetes (OKE).
Pour indiquer qu'un cluster applique les stratégies de sécurité de pod définies pour lui, vous devez activer le contrôleur d'admission PodSecurityPolicy du cluster. Le contrôleur d'admission PodSecurityPolicy agit sur la création et la modification d'un pod, et détermine si le pod doit être admis dans le cluster en fonction du contexte de sécurité demandé dans les spécifications de pod et les stratégies de sécurité de pod du cluster. S'il existe plusieurs stratégies de sécurité de pod, le contrôleur d'admission PodSecurityPolicy compare d'abord le pod aux stratégies sans mutation par ordre alphabétique et utilise la première stratégie qui valide le pod. Si aucun pod sans mutation ne valide le pod, le contrôleur d'admission PodSecurityPolicy compare le pod aux stratégies avec mutation par ordre alphabétique et utilise la première stratégie qui valide le pod.
Attention 1 :
Lorsque vous activez le contrôleur d'admission PodSecurityPolicy d'un cluster, aucun pod d'application ne peut démarrer sur le cluster, sauf s'il existe des stratégies de sécurité de pod appropriées, ainsi que des rôles (ou clusterroles) et des liaisons de rôle (ou clusterrolebindings) permettant d'associer les pods aux stratégies. Vous ne pourrez pas exécuter de pod d'application sur un cluster avec un contrôleur d'admission PodSecurityPolicy activé si ces prérequis ne sont pas respectés.
Nous vous recommandons vivement d'utiliser les contrôleurs d'admission PodSecurityPolicy comme suit :
- Chaque fois que vous créez un cluster, activez le contrôleur d'admission de sécurité de pod.
- Immédiatement après avoir créé un cluster, créez des stratégies de sécurité de pod, ainsi que des objets roles (ou clusterroles) et rolebindings (ou clusterrolebindings).
Attention 2 :
Vous devez créer des stratégies de sécurité de pod avant d'activer le contrôleur d'admission PodSecurityPolicy d'un cluster existant déjà en production (c'est-à-dire quelque temps après sa création). Si vous décidez d'activer le contrôleur d'admission PodSecurityPolicy d'un cluster existant, nous vous recommandons vivement de vérifier d'abord les stratégies de sécurité de pod du cluster dans un environnement de développement ou de test. De cette façon, vous pouvez être sûr que les stratégies de sécurité de pod fonctionnent comme vous le souhaitez et autorisent correctement les pods à démarrer sur le cluster (ou le leur interdisent).
Lorsque vous activez le contrôleur d'admission PodSecurityPolicy d'un cluster que vous avez créé avec Kubernetes Engine, une stratégie de sécurité de pod pour les pods de système Kubernetes dotés de privilèges est créée automatiquement (avec les objets Clusterrole et Clusterrolebinding associés). Cette stratégie de sécurité de pod, ainsi que les objets clusterrole et clusterrolebinding, permettent d'exécuter les pods du système Kubernetes. La stratégie de sécurité de pod, l'objet clusterrole et l'objet clusterrolebinding sont définis dans le fichier kube-system.yaml (reportez-vous à Référence pour kube-system.yaml).
Vous pouvez créer des stratégies de sécurité de pod pour un cluster avant d'activer le contrôleur d'admission PodSecurityPolicy du cluster. Vous pouvez également désactiver le contrôleur d'admission PodSecurityPolicy d'un cluster ayant été activé précédemment. Dans ce cas, les stratégies de sécurité de pod, les rôles (ou clusterroles) et les liaisons de rôle (ou clusterrolebindings) créés précédemment ne sont pas supprimés. Les stratégies de sécurité de pod ne sont simplement pas appliquées. Tout pod d'application peut être exécuté sur le cluster.
Pour plus d'informations sur les stratégies de sécurité de pod et le contrôleur d'admission PodSecurityPolicy, reportez-vous à la documentation Kubernetes.
Création d'une stratégie de sécurité de pod pour les pods d'application
Afin de créer une stratégie de sécurité de pod pour les pods d'application, créez un rôle permettant d'accéder à la stratégie de sécurité de pod et créez une liaison de rôle pour autoriser les pods d'application à utiliser cette stratégie :
- Créez la stratégie de sécurité de pod pour les pods d'application :
Définissez et enregistrez la stratégie de sécurité de pod dans un fichier. Par exemple, dans
acme-app-psp.yaml
.Par exemple, cette stratégie (issue de la documentation Kubernetes) empêche simplement la création de pods dotés de privilèges :
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: - '*'
Saisissez la commande suivante pour créer la stratégie de sécurité de pod :
kubectl create -f <filename>.yaml
Par exemple :
kubectl create -f acme-app-psp.yaml
- Créez le rôle (ou clusterrole) pour accéder à la stratégie de sécurité de pod :
Définissez et enregistrez un rôle (ou clusterrole) 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
Saisissez la commande suivante pour créer le rôle (ou clusterrole) :
kubectl create -f <filename>.yaml
Par exemple :
kubectl create -f acme-app-psp-crole.yaml
- Créez la liaison de rôle (ou clusterrolebinding) pour autoriser les pods d'application à utiliser la stratégie de sécurité de pod :
Définissez et enregistrez la liaison de rôle (ou clusterrolebinding) 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
Saisissez la commande suivante pour créer la liaison de rôle (ou clusterrolebinding) :
kubectl create -f <filename>.yaml
Par exemple :
kubectl create -f acme-app-psp-crole-bind.yaml
Après avoir défini une stratégie de sécurité de pod et autorisé les pods d'application à l'utiliser en créant un objet role et un objet rolebinding (ou clusterrole et clusterrolebinding), activez le contrôleur d'admission PodSecurityPolicy du cluster (s'il n'est pas déjà activé) afin d'appliquer la stratégie de sécurité de pod.
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 clusters via la console, procédez comme suit :
- Connectez-vous à la console.
-
Suivez les instructions de création d'un cluster dans Utilisation de la console pour créer un cluster avec les paramètres définis explicitement dans le workflow Création personnalisée, sélectionnez Afficher les options avancées, puis sélectionnez l'option Stratégies de sécurité de Pod - Appliqué. Cette option active le contrôleur d'admission PodSecurityPolicy.
Aucun pod d'application ne sera accepté dans le nouveau cluster, sauf s'il existe des stratégies de sécurité de pod appropriées, ainsi que des rôles (ou clusterroles) et des liaisons de rôle (ou clusterrolebindings) permettant d'associer les pods aux stratégies.
- Suivez les instructions pour définir les autres détails du cluster, puis sélectionnez Créer un cluster afin de créer le cluster.
-
Suivez les instructions dans Création d'une stratégie de sécurité de pod pour les pods d'application afin de créer des stratégies de sécurité de pod pour le contrôleur d'admission PodSecurityPolicy, à appliquer lors de l'acceptation de pods dans le nouveau cluster.
Pour activer le contrôleur d'admission PodSecurityPolicy dans des clusters existants via la console, procédez comme suit :
-
Suivez les instructions dans Création d'une stratégie de sécurité de pod pour les pods d'application afin de créer des stratégies de sécurité de pod pour le contrôleur d'admission PodSecurityPolicy, à appliquer lors de l'acceptation de pods dans le cluster existant.
Nous vous recommandons vivement de vérifier d'abord les stratégies de sécurité de pod dans un environnement de développement ou de test. De cette façon, vous pouvez être sûr que les stratégies de sécurité de pod fonctionnent comme vous le souhaitez et autorisent correctement les pods à démarrer sur le cluster (ou le leur interdisent).
- Ouvrez le menu de navigation et sélectionnez Services de développeur. Sous Conteneurs et artefacts, sélectionnez Clusters Kubernetes (OKE).
- Choisissez un compartiment sur lequel vous êtes autorisé à travailler.
- Sur la page Liste des groupes, sélectionnez le nom du cluster à modifier.
- Dans l'onglet Détails du cluster, sélectionnez Non appliqué en regard de Stratégies de sécurité de Pod.
-
Dans la fenêtre Stratégies de sécurité de pod, sélectionnez Appliqué.
Désormais, aucun nouveau pod d'application ne sera accepté dans le cluster, sauf s'il existe des stratégies de sécurité de pod appropriées, ainsi que des objets roles (ou clusterroles) et rolebindings (ou clusterrolebindings) permettant d'associer les pods aux stratégies. Tous les pods actuellement en cours d'exécution continueront de l'être.
- 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 clusters où il était précédemment activé :
- Ouvrez le menu de navigation et sélectionnez Services de développeur. Sous Conteneurs et artefacts, sélectionnez Clusters Kubernetes (OKE).
- Choisissez un compartiment sur lequel vous êtes autorisé à travailler.
- Sur la page Liste des groupes, sélectionnez le nom du cluster à modifier.
- Dans l'onglet Détails du cluster, sélectionnez Non appliqué en regard de Stratégies de sécurité de Pod.
-
Dans la fenêtre Stratégies de sécurité de Pod, sélectionnez Non appliqué.
A partir de maintenant, les nouveaux pods d'application seront acceptés dans le cluster sans que des stratégies de sécurité de pod, des rôles (ou clusterroles) et des liaisons de rôle (ou clusterrolebindings) soient requis. Tous les pods actuellement en cours d'exécution continueront de l'être.
- Sélectionnez Enregistrer les modifications.
Utilisation de l'API
Pour plus d'informations sur l'utilisation de l'API et la signature des demandes, reportez-vous à la documentation relative à l'API REST et à Informations d'identification de sécurité. Pour plus d'informations sur les kits SDK, reportez-vous à Kits SDK et interface de ligne de commande.
Pour activer le contrôleur d'admission PodSecurityPolicy, utilisez l'une des opérations ci-dessous :
- Opération CreateCluster lors de la création de clusters.
- Opération UpdateCluster lors de la modification de clusters existants.
Référence pour kube-system.yaml
La stratégie de sécurité pod, ainsi que les objets clusterrole et clusterrolebinding associés, des pods du système Kubernetes dotés de privilèges sont automatiquement créés lorsque vous activez le contrôleur d'admission PodSecurityPolicy d'un cluster. Cela autorise l'exécution de tous les pods 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