Sécurisation du moteur Kubernetes
Cette rubrique fournit des recommandations de sécurité pour l'utilisation du moteur Kubernetes d'Oracle Cloud Infrastructure (aussi appelé OKE).
Grappes multilocataires
Charges de travail mutuellement fiables
Pour le moment, il n'est pas recommandé d'exécuter des charges de travail qui ne sont pas approuvées mutuellement dans la même grappe. Par exemple, vous ne devez pas exécuter les charges de travail suivantes dans la même grappe :
- Charges de développement et charges de production
- Plan de contrôle et plan de données
- Charges de travail exécutant du code client arbitraire
Charges de travail avec différents niveaux de confiance
Envisagez d'avoir des grappes distinctes si vous avez plusieurs locataires, équipes ou utilisateurs qui accèdent à la même grappe avec des niveaux d'approbation différents. Comme mentionné dans les sections suivantes, Kubernetes et OKE offrent des méthodes pour isoler les charges de travail. Toutefois, ces méthodes ne sont actuellement pas suffisantes pour une architecture multilocation regroupant plusieurs entreprises.
Les kubelets ont un accès en lecture aux ressources
Un kubelet exécuté sur un noeud de travail d'une grappe créée par OKE ne peut pas modifier des ressources qui n'appartiennent pas au noeud du kubelet. Pour plus d'informations, voir les détails sur le contrôleur d'admission NodeRestriction dans la documentation sur Kubernetes.
Notez, en particulier lors de l'exécution de charges de travail multilocataires, que même si un kubelet ne peut pas modifier des ressources qui n'appartiennent pas à son noeud, il peut toujours lire ces ressources. Ces ressources peuvent comprendre :
- services
- points d'extrémité
- noeuds
- pods
- clés secrètes, mappages de configuration et volumes persistants liés au noeud du kubelet
Pour plus d'informations, voir Utilisation de l'autorisation de noeud dans la documentation sur Kubernetes.
Chiffrement des clés secrètes au repos dans etcd
Pour plus d'informations sur la configuration du chiffrement des clés secrètes, voir Chiffrement des clés secrètes Kubernetes au repos dans etcd.
Contrôle d'accès basé sur les rôles
Kubernetes est fourni avec un composant intégré de contrôle d'accès basé sur les rôles qui met en correspondance un utilisateur ou un groupe entrant avec un jeu d'autorisations regroupées en rôles. Ces autorisations combinent des verbes (obtenir, créer, supprimer) avec des ressources (pods, services, noeuds) et leur portée peut être définie au niveau d'un espace de noms ou d'une grappe. Un jeu de rôles préconfigurés est fourni pour offrir une séparation de responsabilité par défaut raisonnable, selon les actions qu'un client peut vouloir exécuter.
Il est important de comprendre comment les mises à jour d'un objet peuvent provoquer des actions dans d'autres endroits. Par exemple, un utilisateur peut ne pas être autorisé à créer des pods directement. Toutefois, s'il est autorisé à créer un déploiement (qui crée des pods en son nom), il pourra créer ces pods indirectement. De la même façon, la suppression d'un noeud de l'API entraînera l'interruption des pods programmés sur ce noeud et leur recréation sur d'autres noeuds. Les rôles préconfigurés offrent un équilibre entre flexibilité et cas d'utilisation communs. En revanche, il convient de vérifier les rôles plus limités avec attention pour éviter l'escalade accidentelle des privilèges. Vous pouvez affecter des rôles spécifiques à votre cas d'utilisation si les rôles préconfigurés ne répondent pas à vos besoins.
Vous devez toujours appliquer le principe du moindre privilège pour garantir que les utilisateurs et les comptes du service Kubernetes disposent du jeu minimal de privilèges requis. Par défaut, tout utilisateur disposant d'un accès USE CLUSTER dans Oracle Cloud Infrastructure IAM ou tout compte de service Kubernetes n'aura pas accès à l'API Kubernetes, sauf aux rôles de détection. Voir À propos du contrôle d'accès et du moteur Kubernetes (OKE) pour savoir comment IAM s'intègre à OKE.
Vous devez utiliser l'OCID du principal lors de la création des liaisons RBAC (par exemple, OCID de l'utilisateur, OCID de l'instance et nom du service).
Sécurité de la grappe
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. Ces politiques de sécurité permettent de s'assurer que les pods satisfont les conditions de sécurité associées 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é
Après avoir défini une politique de sécurité de pod pour une grappe, vous devez autoriser l'utilisateur ou le pod demandeur à utiliser la politique en créant des rôles et des liaisons. Vous pouvez alors spécifier si une grappe applique les politiques de sécurité de pod définies pour le pod en activant le contrôleur d'admission PodSecurityPolicy pour la grappe.
Pour plus d'informations, voir Utilisation de politiques de sécurité de pod avec Kubernetes Engine (OKE).
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 d'utiliser les normes de sécurité des pods Kubernetes et le contrôleur d'admission PodSecurity à la place (ainsi que les politiques Privileged, Baseline et Restricted). 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é des pods Kubernetes et le contrôleur d'admission PodSecurity, voir Normes de sécurité des pods 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 de l'utilisation des politiques de sécurité des pods et du contrôleur d'admission PodSecurityPolicy à l'utilisation des normes de sécurité des pods et du contrôleur d'admission PodSecurity, voir Migrer de PodSecurityPolicy vers le contrôleur d'admission PodSecurity intégré dans la documentation 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).
Sécurité du groupe de noeuds
Compartiments du groupe de noeuds
Les groupes de noeuds d'une grappe peuvent couvrir des compartiments. Toutefois, si l'utilisation de plusieurs compartiments offre un moyen pratique de regrouper et de gérer des noeuds de travail, elle ne fournit aucun isolement entre les noeuds de travail dans la grappe. Toute charge de travail peut être programmée pour n'importe quel groupe de noeuds, quel que soit le compartiment. Un cas d'utilisation valide pour l'utilisation de plusieurs compartiments pour un groupe de noeuds consiste à créer facilement des groupes dynamiques et des politiques IAM pour les noeuds de travail. Cas d'utilisation non valide : Placer chaque groupe de noeuds exécutant une charge de travail de client dans un compartiment distinct, en partant de l'hypothèse que les compartiments fournissent un certain niveau de sécurité ou d'isolement.
Sous-réseaux du groupe de noeuds
Nous recommandons d'utiliser uniquement des sous-réseaux privés pour les groupes de noeuds. Une passerelle de service doit être configurée pour fournir l'accès aux services Oracle Cloud Infrastructure. A service gateway cannot be used if the subnets are public with an internet gateway . Si vos sous-réseaux privés ont besoin d'accéder à Internet, utilisez une passerelle NAT .
Contrôler les noeuds auxquels les pods peuvent accéder
Par défaut, un pod peut être programmé sur n'importe quel noeud de la grappe. Kubernetes met à la disposition des utilisateurs finaux un large jeu de politiques pour contrôler le placement des pods dans des noeuds ainsi que le placement et l'éviction des pods en fonction de marques. Pour de nombreuses grappes, l'utilisation de ces politiques pour séparer les charges de travail peut être une convention que les auteurs adoptent ou appliquent au moyen d'outils. Ces contrôles de placement ne sont pas appropriés dans un environnement multilocataire où les utilisateurs disposant de fonctionnalités de déploiement ne sont pas des utilisateurs de confiance. Si vous avez des utilisateurs non approuvés qui déploient du code,envisagez d'utiliser une grappe par groupe non approuvé.
Limiter l'accès accordé aux principaux d'instance
Par défaut, tous les pods figurant sur un noeud peuvent accéder aux certificats du principal d'instance à l'aide du point d'extrémité des métadonnées d'instance. Pour éviter l'escalade de privilèges au moyen de principaux d'instance, vous devez isoler les charges de travail des groupes de noeuds avec des groupes dynamiques différents afin que les pods d'un groupe de noeuds donné disposent seulement du jeu minimal de privilèges requis pour fonctionner.
Par exemple, supposons que vous ayez les deux charges de travail suivantes, qui nécessitent un accès différent :
- LogArchiver - Requiert l'accès pour la gestion des seaux et des objets dans le service de stockage d'objets.
- HostMonitor - Nécessite l'accès à l'API du service de calcul pour gérer les instances
L'approche la plus simple consiste à les programmer dans le même groupe de noeuds et à fournir au principal d'instance tous les accès requis. Toutefois, cette approche accroît l'incidence potentielle si l'une des charges de travail est compromise. Une meilleure approche consisterait à programmer les charges de travail dans des groupes de noeuds séparés, avec le jeu de droits d'accès limité requis par les principaux d'instance pour la charge de travail concernée.
Accès du conteneur par blocs aux métadonnées d'instance
Le meilleur moyen de bloquer l'accès consiste à utiliser un plugiciel de politique de réseau comportant une politique par défaut de type "Tout refuser". Ensuite, vous pouvez accorder l'accès aux pods et aux réseaux, de manière explicite, à l'aide de ressources NetworkPolicy dans Kubernetes au moyen des sélecteurs d'étiquette. Si aucun plugiciel de politique de réseau n'est installé, vous pouvez utiliser une règle IPTables pour limiter l'accès de tous les pods sur l'hôte. Il est recommandé de ne pas utiliser cette approche pour bloquer un sous-jeu de pods sur un hôte.
Important : Le type de ressource NetworkPolicys et la règle IPTables suivante s'appliquent uniquement aux conteneurs situés dans le réseau superposé au pod. Les conteneurs et services s'exécutant dans le réseau hôte ne sont pas touchés par l'une ou l'autre des options suivantes :
iptables --insert FORWARD 1 --in-interface veth+ --destination 169.254.0.0/16 --jump DROPSécurité du réseau
Les pods s'exécutant dans votre grappe OKE doivent souvent communiquer avec d'autres pods dans la grappe ou avec des services en dehors de la grappe. Kubernetes Engine offre plusieurs options pour sécuriser la communication vers et depuis les charges de travail de votre grappe. Pour assurer la meilleure sécurité possible du réseau, vous devez évaluer la situation à l'aide d'une combinaison de politiques de réseau (pour sécuriser la communication réseau de niveau pod) et de listes de sécurité (pour sécuriser la communication réseau de niveau hôte).
Politiques de réseau
Les politiques de réseau dans Kubernetes permettent aux administrateurs de définir la façon dont les groupes de pods peuvent communiquer avec d'autres pods dans la grappe. En outre, les politiques de réseau permettent de définir la façon dont les groupes de pods peuvent communiquer avec les services en dehors de la grappe (par exemple, services Oracle Cloud Infrastructure).
Pour restreindre l'accès à l'aide de politiques de réseau, vous devez installer un plugiciel de réseau. Les plugiciels de réseau configurent et appliquent les politiques de réseau définies dans Kubernetes. De nombreuses options de plugiciel réseau sont disponibles. Vous pouvez suivre les instructions fournies ici pour installer et configurer Calico dans votre grappe. Les plugiciels de politique de réseau fonctionnent en limitant l'accès à l'hôte. Pour plus d'informations sur l'installation de Calico dans OKE, voir Exemple : Installation de Calico et configuration de politiques de réseau.
Listes de sécurité du groupe de noeuds
Les administrateurs de réseau peuvent définir des règles de liste de sécurité sur les sous-réseaux du groupe de noeuds pour restreindre l'accès depuis et vers les noeuds de travail. La définition de règles de liste de sécurité permet aux administrateurs d'appliquer des restrictions de réseau qui ne peuvent pas être remplacées sur les hôtes dans votre grappe.
Comme la communication de pod à pod a lieu dans un réseau superposé VXLAN sur les noeuds de travail, vous ne pouvez pas utiliser des règles de liste de sécurité pour la restreindre. Toutefois, vous pouvez utiliser des listes de sécurité pour limiter l'accès depuis et vers vos noeuds de travail.
Important : Un jeu minimal de règles de liste de sécurité doit exister sur les sous-réseaux du groupe de noeuds pour garantir que la grappe peut fonctionner. Voir Exemples de configurations de ressources de réseau pour plus d'informations sur le jeu minimal de règles de liste de sécurité à définir avant de modifier vos règles de liste de sécurité.
Meilleures pratiques en matière de sécurité de charge de travail
Utiliser des condensés d'image au lieu de marqueurs
Nous vous recommandons d'extraire uniquement des images à l'aide de condensés d'image et non à l'aide de marqueurs (car les marqueurs d'image sont mutables). Un condensé d'image est un condensé sha256 de votre image, qui permet à Docker de vérifier si l'image qu'il a téléchargée correspond à vos attentes.
Exemple d'ID condensé d'image :
sha256:77af4d6b9913e693e8d0b4b294fa62ade6054e6b2f1ffb617ac955dd63fb0182
Extrayez l'image comme illustré dans l'exemple suivant :
docker pull acme@sha256:77af4d6b9913e693e8d0b4b294fa62ade6054e6b2f1ffb617ac955dd63fb0182
Vous pouvez utiliser la commande suivante pour afficher tous les condensés de vos images locales :
docker images --digestsLimiter l'utilisation des ressources
Le quota de ressource limite le nombre ou la capacité des ressources octroyées à un espace de noms. Les quotas sont généralement utilisés pour limiter la quantité d'UC, de mémoire ou de disque persistant qu'un espace de noms peut affecter. Ils permettent également de contrôler le nombre de pods, de services ou de volumes dans chaque espace de noms.
Les intervalles de limite restreignent la taille maximale ou minimale de certaines des ressources ci-dessus, afin d'empêcher les utilisateurs d'indiquer des valeurs trop élevées ou trop faibles lorsqu'ils demandent des ressources communément réservées (mémoire par exemple) ou pour fournir des limites par défaut lorsqu'aucune limite n'est spécifiée.
L'accès aux quotas de ressource peut être restreint au moyen de politiques RBAC dans Kubernetes. Un administrateur peut ainsi s'assurer que les utilisateurs d'une grappe ne peuvent pas utiliser des ressources auxquelles ils n'ont pas le droit d'accéder. Pour plus d'informations, voir Limitation de l'utilisation des ressources dans une grappe dans la documentation Kubernetes.
Désactivation du module complémentaire Tiller
OKE propose un module complémentaire Tiller facultatif. Ainsi, il est facile d'installer et d'utiliser Helm+Tiller afin de pouvoir provisionner et exécuter rapidement Kubernetes. Il n'est pas recommandé d'utiliser ce module complémentaire pour les grappes de production en raison des risques de sécurité associés à Tiller. Les grappes provisionnées avec Tiller n'ont pas d'authentification ou d'autorisation pour les appels d'API effectués vers Tiller, ce qui signifie qu'elles ne peuvent pas fournir d'attribution pour les demandes. Ainsi, tout opérateur ou service pouvant atteindre Tiller peut appeler ses API avec un accès à Tiller.
Pour résoudre les problèmes de sécurité associés à Tiller, la version Helm V3 a été développée. La version Helm V3 a complètement supprimé Tiller de Helm. Nous vous recommandons d'utiliser Helm V3 si vous souhaitez utiliser les fonctionnalités offertes par Helm+Tiller.
Pour désactiver le module complémentaire Tiller sur une grappe existante, communiquez avec Oracle Support.
Désactivation du module complémentaire de tableau de bord Kubernetes
OKE offre un module complémentaire de tableau de bord Kubernetes facultatif qui permet d'installer facilement le tableau de bord Kubernetes. Le tableau de bord Kubernetes est installé par OKE avec le jeu minimal de privilèges requis pour l'exécuter. Vous ne pouvez pas utiliser le tableau de bord sans fournir de données d'identification supplémentaires. Pour plus d'informations, voir Accès à une grappe à l'aide du tableau de bord Kubernetes.
Le tableau de bord est particulièrement utile pour les nouveaux utilisateurs de Kubernetes. Toutefois, nous ne recommandons pas d'installer ce module complémentaire sur les grappes de production en raison du manque de prise en charge de l'authentification extensible. Par conséquent, vous ne pouvez pas spécifier que vous souhaitez installer le tableau de bord Kubernetes lors de la création d'une grappe à l'aide de la console. Si vous décidez d'installer le tableau de bord Kubernetes, créez la grappe à l'aide de l'API et réglez l'attribut isKubernetesDashboardEnabled à Vrai.
Si vous installez le tableau de bord Kubernetes, nous vous recommandons d'en restreindre l'accès à votre grappe plutôt que de l'exposer à l'externe au moyen d'un équilibreur de charge ou d'un contrôleur de trafic entrant. Le tableau de bord Kubernetes est un vecteur d'attaque commun utilisé pour accéder à une grappe Kubernetes.
Pour désactiver le module complémentaire de tableau de bord Kubernetes sur une grappe existante, communiquez avec Oracle Support.