Groupes de sécurité par pod - Amazon EKS

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Groupes de sécurité par pod

Un groupe AWS de sécurité agit comme un pare-feu virtuel pour les EC2 instances afin de contrôler le trafic entrant et sortant. Par défaut, Amazon VPC CNI utilisera des groupes de sécurité associés au principal ENI sur le nœud. Plus précisément, tous les groupes ENI associés à l'instance auront les mêmes groupes EC2 de sécurité. Ainsi, chaque pod d'un nœud partage les mêmes groupes de sécurité que le nœud sur lequel il s'exécute.

Comme le montre l'image ci-dessous, tous les pods d'applications fonctionnant sur des nœuds de travail auront accès au service de RDS base de données (si l'on considère que l'RDSentrée autorise le groupe de sécurité des nœuds). Les groupes de sécurité sont trop grossiers car ils s'appliquent à tous les pods exécutés sur un nœud. Les groupes de sécurité pour Pods permettent de segmenter le réseau pour les charges de travail, élément essentiel d'une bonne stratégie de défense en profondeur.

illustration d'un nœud avec un groupe de sécurité se connectant à RDS

Avec les groupes de sécurité pour Pods, vous pouvez améliorer l'efficacité du calcul en exécutant des applications répondant à des exigences de sécurité réseau variables sur des ressources informatiques partagées. Plusieurs types de règles de sécurité, tels que Pod-to-Pod les Pod-to-External AWS services, peuvent être définis en un seul endroit avec des groupes de EC2 sécurité et appliqués aux charges de travail avec Kubernetes native. APIs L'image ci-dessous montre les groupes de sécurité appliqués au niveau du Pod et montre comment ils simplifient le déploiement de vos applications et l'architecture de vos nœuds. Le Pod peut désormais accéder à la RDS base de données Amazon.

illustration du pod et du nœud auxquels différents groupes de sécurité se connectent RDS

Vous pouvez activer les groupes de sécurité pour les pods en configurant ENABLE_POD_ENI=true pour VPCCNI. Une fois activé, le contrôleur de VPC ressources exécuté sur le plan de contrôle (géré parEKS) crée et attache une interface de liaison appelée « aws-k8 s-trunk-eni » au nœud. L'interface de jonction agit comme une interface réseau standard attachée à l'instance. Pour gérer les interfaces de jonction, vous devez ajouter la politique AmazonEKSVPCResourceController gérée au rôle de cluster associé à votre EKS cluster Amazon.

Le contrôleur crée également des interfaces de branche nommées « aws-k8 s-branch-eni » et les associe à l'interface de jonction. Un groupe de sécurité est attribué aux pods à l'aide de la ressource SecurityGroupPolicypersonnalisée et sont associés à une interface de branche. Les groupes de sécurité étant spécifiés à l'aide d'interfaces réseau, nous sommes désormais en mesure de planifier des pods nécessitant des groupes de sécurité spécifiques sur ces interfaces réseau supplémentaires. Consultez la section du guide de EKS l'utilisateur sur les groupes de sécurité pour les pods, y compris les conditions préalables au déploiement.

illustration du sous-réseau de travail avec les groupes de sécurité associés à ENIs

La capacité de l'interface des succursales s'ajoute aux limites de types d'instances existantes pour les adresses IP secondaires. Les pods qui utilisent des groupes de sécurité ne sont pas pris en compte dans la formule max-pods et lorsque vous utilisez un groupe de sécurité pour des pods, vous devez envisager d'augmenter la valeur max-pods ou accepter d'exécuter moins de pods que le nœud ne peut réellement en supporter.

Un m5.large peut avoir jusqu'à 9 interfaces réseau de succursales et jusqu'à 27 adresses IP secondaires attribuées à ses interfaces réseau standard. Comme le montre l'exemple ci-dessous, le nombre maximum de pods par défaut pour un m5.large est de 29 et EKS compte le nombre de pods utilisant des groupes de sécurité dans le calcul du nombre maximum de pods. Consultez le guide de EKS l'utilisateur pour savoir comment modifier les max-pods pour les nœuds.

Lorsque des groupes de sécurité pour Pods sont utilisés en combinaison avec un réseau personnalisé, le groupe de sécurité défini dans les groupes de sécurité pour Pods est utilisé plutôt que le groupe de sécurité spécifié dans leENIConfig. Par conséquent, lorsque la mise en réseau personnalisée est activée, évaluez soigneusement l'ordre des groupes de sécurité lors de l'utilisation de groupes de sécurité par pod.

Recommandations

Désactiver le démultiplexage TCP anticipé pour Liveness Probe

Si vous utilisez des sondes Liveness ou Readiness, vous devez également désactiver le démultiplexage TCP anticipé, afin que le kubelet puisse se connecter aux Pods sur les interfaces réseau des succursales via. TCP Cela n'est requis qu'en mode strict. Pour ce faire, exécutez la commande suivante :

kubectl edit daemonset aws-node -n kube-system

Dans la initContainer section, modifiez la valeur DISABLE_TCP_EARLY_DEMUX de true.

Utilisez Security Group For Pods pour tirer parti des investissements AWS de configuration existants.

Les groupes de sécurité facilitent la restriction de l'accès réseau aux VPC ressources, telles que les RDS bases de données ou EC2 les instances. L'un des avantages évidents des groupes de sécurité par pod est la possibilité de réutiliser les ressources des groupes AWS de sécurité existants. Si vous utilisez des groupes de sécurité comme pare-feu réseau pour limiter l'accès à vos AWS services, nous vous proposons d'appliquer des groupes de sécurité aux pods utilisant une brancheENIs. Envisagez d'utiliser des groupes de sécurité pour les pods si vous transférez des applications depuis des EC2 instances vers d'autres services dotés de groupes de sécurité EKS et si vous limitez l'accès à d'autres AWS services dotés de groupes de sécurité.

Configurer le mode d'application du groupe de sécurité Pod

La version 1.11 du VPC CNI plugin Amazon a ajouté un nouveau paramètre nommé POD_SECURITY_GROUP_ENFORCING_MODE (« mode d'application »). Le mode d'application contrôle à la fois quels groupes de sécurité s'appliquent au module et si la source NAT est activée. Vous pouvez définir le mode d'application comme strict ou standard. Strict est la valeur par défaut, reflétant le comportement précédent du VPC CNI with ENABLE_POD_ENI set totrue.

En mode strict, seuls les groupes ENI de sécurité des succursales sont appliqués. La source NAT est également désactivée.

En mode standard, les groupes de sécurité associés à la fois au serveur principal ENI et à la branche ENI (associés au module) sont appliqués. Le trafic réseau doit respecter les deux groupes de sécurité.

Avertissement

Tout changement de mode n'aura d'impact que sur les pods récemment lancés. Les pods existants utiliseront le mode configuré lors de la création du pod. Les clients devront recycler les pods existants avec des groupes de sécurité s'ils souhaitent modifier le comportement du trafic.

Mode d'application : utilisez le mode strict pour isoler le trafic des pods et des nœuds :

Par défaut, les groupes de sécurité pour Pods sont définis sur le « mode strict ». Utilisez ce paramètre si vous devez complètement séparer le trafic du pod du reste du trafic du nœud. En mode strict, la source NAT est désactivée afin que les groupes de sécurité ENI sortants des branches puissent être utilisés.

Avertissement

Lorsque le mode strict est activé, tout le trafic sortant d'un pod quitte le nœud et entre dans le VPC réseau. Le trafic entre les pods d'un même nœud passera par leVPC. Cela augmente le VPC trafic et limite les fonctionnalités basées sur les nœuds. Le n' NodeLocal DNSCacheest pas pris en charge avec le mode strict.

Mode d'application : utilisez le mode standard dans les situations suivantes

IP source du client visible par les conteneurs du Pod

Si vous devez que l'adresse IP source du client reste visible pour les conteneurs du Pod, pensez POD_SECURITY_GROUP_ENFORCING_MODE à la définir surstandard. Les services Kubernetes prennent en charge externalTrafficPolicy =local pour permettre la préservation de l'adresse IP source du client (cluster de type par défaut). Vous pouvez désormais exécuter des services Kubernetes de type NodePort et LoadBalancer utiliser des cibles d'instance externalTrafficPolicy définies sur Local en mode standard. Localpréserve l'adresse IP source du client et évite un second saut pour LoadBalancer et NodePort type Services.

Déploiement NodeLocal DNSCache

Lorsque vous utilisez des groupes de sécurité pour les pods, configurez le mode standard pour prendre en charge les pods qui les utilisent NodeLocal DNSCache. NodeLocal DNSCacheaméliore les DNS performances du cluster en exécutant un agent de DNS mise en cache sur les nœuds du cluster en tant DaemonSet que. Cela aidera les pods les plus DNS QPS exigeants à interroger le Kube-DNS/Core local DNS ayant un cache local, ce qui améliorera la latence.

NodeLocal DNSCachen'est pas pris en charge en mode strict car tout le trafic réseau, même à destination du nœud, entre dans leVPC.

Soutenir la politique réseau Kubernetes

Nous recommandons d'utiliser le mode d'application standard lorsque vous utilisez la politique réseau avec des pods auxquels des groupes de sécurité sont associés.

Nous vous recommandons vivement d'utiliser des groupes de sécurité pour les pods afin de limiter l'accès au niveau du réseau aux AWS services qui ne font pas partie d'un cluster. Envisagez des politiques réseau pour restreindre le trafic réseau entre les pods au sein d'un cluster, souvent connu sous le nom de trafic Est/Ouest.

Identifier les incompatibilités avec les groupes de sécurité par pod

Les instances basées sur Windows et autres que Nitro ne prennent pas en charge les groupes de sécurité pour les pods. Pour utiliser des groupes de sécurité avec des pods, les instances doivent être étiquetées avec isTrunkingEnabled. Utilisez les politiques réseau pour gérer l'accès entre les pods plutôt que les groupes de sécurité si vos pods ne dépendent d'aucun AWS service interne ou externe au vôtreVPC.

Utilisez des groupes de sécurité par pod pour contrôler efficacement le trafic vers les AWS services

Si une application exécutée au sein du EKS cluster doit communiquer avec une autre ressource au sein du clusterVPC, par exemple une RDS base de données, envisagez d'utiliser SGs for pods. Bien qu'il existe des moteurs de politiques qui vous permettent de spécifier un CIDR ou un DNS nom, ils constituent un choix moins optimal lorsque vous communiquez avec AWS des services dont les points de terminaison se trouvent dans unVPC.

En revanche, les politiques réseau de Kubernetes fournissent un mécanisme permettant de contrôler le trafic entrant et sortant à la fois à l'intérieur et à l'extérieur du cluster. Les politiques réseau Kubernetes doivent être prises en compte si les dépendances de votre application vis-à-vis d'autres services sont limitées. AWS Vous pouvez configurer des politiques réseau qui spécifient des règles de sortie basées sur des CIDR plages afin de limiter l'accès aux AWS services, par opposition à une sémantique AWS native telle que. SGs Vous pouvez utiliser les politiques réseau de Kubernetes pour contrôler le trafic réseau entre les pods (souvent appelé trafic est/ouest) et entre les pods et les services externes. Les politiques réseau Kubernetes sont mises en œuvre OSI aux niveaux 3 et 4.

Amazon vous EKS permet d'utiliser des moteurs de politique réseau tels que Calico et Cilium. Par défaut, les moteurs de politique réseau ne sont pas installés. Consultez les guides d'installation respectifs pour obtenir des instructions de configuration. Pour plus d'informations sur l'utilisation de la politique réseau, consultez la section Bonnes pratiques en matière EKS de sécurité. La fonctionnalité DNS des noms d'hôte est disponible dans les versions d'entreprise des moteurs de politique réseau, ce qui peut être utile pour contrôler le trafic entre les services/pods Kubernetes et les ressources qui s'exécutent en dehors de. AWS Vous pouvez également envisager de prendre en charge les DNS noms d'hôte pour les AWS services qui ne prennent pas en charge les groupes de sécurité par défaut.

Marquer un seul groupe de sécurité pour utiliser le AWS Loadbalancer Controller

Lorsque de nombreux groupes de sécurité sont alloués à un Pod, Amazon EKS recommande de baliser un seul groupe de sécurité avec la mention « kubernetes.io/cluster/$namepartagé » ou « possédé ». La balise permet au AWS Loadbalancer Controller de mettre à jour les règles des groupes de sécurité afin d'acheminer le trafic vers les Pods. Si un seul groupe de sécurité est attribué à un Pod, l'attribution d'une balise est facultative. Les autorisations définies dans un groupe de sécurité sont additives. Il suffit donc de baliser un seul groupe de sécurité pour que le contrôleur d'équilibrage de charge localise et réconcilie les règles. Cela permet également de respecter les quotas par défaut définis par les groupes de sécurité.

Configuration NAT pour le trafic sortant

NATLa source est désactivée pour le trafic sortant provenant des pods auxquels des groupes de sécurité ont été affectés. Pour les pods utilisant des groupes de sécurité qui nécessitent un accès à Internet, lancez des nœuds de travail sur des sous-réseaux privés configurés avec une NAT passerelle ou une instance et activez l'option externe SNAT dans leCNI.

kubectl set env daemonset -n kube-system aws-node AWS_VPC_K8S_CNI_EXTERNALSNAT=true

Déployer des pods avec des groupes de sécurité sur des sous-réseaux privés

Les pods auxquels des groupes de sécurité sont affectés doivent être exécutés sur des nœuds déployés sur des sous-réseaux privés. Notez que les pods auxquels des groupes de sécurité ont été assignés et déployés sur des sous-réseaux publics ne pourront pas accéder à Internet.

Vérifier les terminationGracePeriodsecondes dans le fichier de spécifications du pod

Assurez-vous que cette valeur terminationGracePeriodSeconds est différente de zéro dans le fichier de spécifications de votre Pod (30 secondes par défaut). Cela est essentiel pour qu'Amazon puisse VPC CNI supprimer le réseau Pod du nœud de travail. Lorsqu'il est réglé sur zéro, le CNI plug-in ne supprime pas le réseau Pod de l'hôte et la branche n'ENIest pas nettoyée efficacement.

Utilisation de groupes de sécurité pour les pods avec Fargate

Les groupes de sécurité pour les pods qui s'exécutent sur Fargate fonctionnent de manière très similaire aux pods qui s'exécutent EC2 sur des nœuds de travail. Par exemple, vous devez créer le groupe de sécurité avant de le référencer dans celui que SecurityGroupPolicy vous associez à votre Fargate Pod. Par défaut, le groupe de sécurité du cluster est attribué à tous les Fargate Pods lorsque vous n'en attribuez pas explicitement un SecurityGroupPolicy à un Fargate Pod. Pour des raisons de simplicité, vous pouvez ajouter le groupe de sécurité du cluster à celui d'un Fagate Pod SecurityGroupPolicy , sinon vous devrez ajouter les règles de groupe de sécurité minimales à votre groupe de sécurité. Vous pouvez trouver le groupe de sécurité du cluster à l'aide de la commande API describe-cluster.

aws eks describe-cluster --name CLUSTER_NAME --query 'cluster.resourcesVpcConfig.clusterSecurityGroupId'
cat >my-fargate-sg-policy.yaml <<EOF apiVersion: vpcresources.k8s.aws/v1beta1 kind: SecurityGroupPolicy metadata: name: my-fargate-sg-policy namespace: my-fargate-namespace spec: podSelector: matchLabels: role: my-fargate-role securityGroups: groupIds: - cluster_security_group_id - my_fargate_pod_security_group_id EOF

Les règles minimales relatives aux groupes de sécurité sont répertoriées ici. Ces règles permettent aux Fargate Pods de communiquer avec des services intégrés au cluster tels que kube-apiserver, kubelet et Core. DNS Vous devez également ajouter des règles pour autoriser les connexions entrantes et sortantes à destination et en provenance de votre Fargate Pod. Cela permettra à votre Pod de communiquer avec d'autres Pods ou ressources de votreVPC. En outre, vous devez inclure des règles permettant à Fargate d'extraire des images de conteneurs d'ECRAmazon ou d'autres registres de conteneurs tels que. DockerHub Pour plus d'informations, consultez la section Plages d'adresses AWS IP dans le manuel de référence AWS général.

Vous pouvez utiliser les commandes ci-dessous pour trouver les groupes de sécurité appliqués à un Fargate Pod.

kubectl get pod FARGATE_POD -o jsonpath='{.metadata.annotations.vpc\.amazonaws\.com/pod-eni}{"\n"}'

Notez la eniId commande ci-dessus.

aws ec2 describe-network-interfaces --network-interface-ids ENI_ID --query 'NetworkInterfaces[*].Groups[*]'

Les pods Fargate existants doivent être supprimés et recréés pour que de nouveaux groupes de sécurité puissent être appliqués. Par exemple, la commande suivante lance le déploiement de l'application d'exemple. Pour mettre à jour des pods spécifiques, vous pouvez modifier l'espace de noms et le nom du déploiement dans la commande ci-dessous.

kubectl rollout restart -n example-ns deployment example-pod

📝 Modifiez cette page sur GitHub