{"version":"1.1","schema_version":"1.1.0","plugin_version":"1.1.2","url":"https://tutos-gameserver.fr/2019/04/22/kubernetes-identity-management-authentification-journal-linux/","llm_html_url":"https://tutos-gameserver.fr/2019/04/22/kubernetes-identity-management-authentification-journal-linux/llm","llm_json_url":"https://tutos-gameserver.fr/2019/04/22/kubernetes-identity-management-authentification-journal-linux/llm.json","manifest_url":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","language":"fr-FR","locale":"fr_FR","title":"Kubernetes Identity Management: Authentification | Journal Linux","site":{"name":"Tutos GameServer","url":"https://tutos-gameserver.fr/"},"author":{"id":1,"name":"Titanfall","url":"https://tutos-gameserver.fr/author/titanfall/"},"published_at":"2019-04-22T11:26:15+00:00","modified_at":"2019-04-22T11:26:15+00:00","word_count":3254,"reading_time_seconds":977,"summary":"Vous avez déployé Kubernetes, mais maintenant, comment allez-vous le mettre entre les mains de vos développeurs et administrateurs en toute sécurité? Kubernetes a pris d&#39;assaut le monde. En quelques années, Kubernetes (aka k8s) est passé d&#39;un projet intéressant à un moteur de la technologie et l&#39;innovation. L’un des moyens les plus simples d’illustrer ce point [&hellip;]","summary_points":["Vous avez déployé Kubernetes, mais maintenant, comment allez-vous le mettre entre les mains de\nvos développeurs et administrateurs en toute sécurité?","Kubernetes a pris d&#39;assaut le monde.","En quelques années, Kubernetes\n(aka k8s) est passé d&#39;un projet intéressant à un moteur de la technologie\net l&#39;innovation.","L’un des moyens les plus simples d’illustrer ce point est\nla différence de fréquentation dans les deux fois KubeCon Amérique du Nord a\nété à Seattle."],"topics":["Non classé"],"entities":[],"entities_metadata":[{"id":1,"name":"Non classé","slug":"non-classe","taxonomy":"category","count":1038,"url":"https://tutos-gameserver.fr/category/non-classe/"}],"tags":["Non classé"],"content_hash":"784ec983ce9a8176a74413de98d4c76b","plain_text":"Vous avez déployé Kubernetes, mais maintenant, comment allez-vous le mettre entre les mains de\nvos développeurs et administrateurs en toute sécurité?\nKubernetes a pris d&#39;assaut le monde. En quelques années, Kubernetes\n(aka k8s) est passé d&#39;un projet intéressant à un moteur de la technologie\net l&#39;innovation. L’un des moyens les plus simples d’illustrer ce point est\nla différence de fréquentation dans les deux fois KubeCon Amérique du Nord a\nété à Seattle. Il y a deux ans, c&#39;était dans un hôtel avec moins de 20\ncabines de vendeurs. Cette année, c’était au Seattle Convention Center avec\n8 000 participants et plus de 100 fournisseurs!\n\nComme avec tout autre système complexe, k8s a son propre modèle de sécurité et\ndoit interagir avec les utilisateurs et les autres systèmes. Dans cet article,\nJe passe en revue les différentes options d’authentification et\nfournir des exemples et des conseils de mise en œuvre sur la façon dont vous devriez gérer\naccès à votre cluster.\n\n\nQu&#39;est-ce que l&#39;identité signifie pour Kubernetes?\nLa première chose à demander est &quot;qu&#39;est-ce qu&#39;une identité?&quot; en k8s. K8s est très\ndifférent de la plupart des autres systèmes et applications. C&#39;est un ensemble d&#39;API.\nIl n&#39;y a pas d &#39;&quot;interface Web&quot; (je discute du tableau de bord plus tard dans cet article).\nIl n&#39;y a aucun intérêt à &quot;se connecter&quot;. Il n&#39;y a pas de &quot;session&quot; ou de &quot;timeout&quot;.\nChaque demande d&#39;API est unique et distincte, et elle doit tout contenir\nk8s doit s&#39;authentifier et autoriser la demande.\n\nCela dit, la principale chose à retenir à propos des utilisateurs de k8s est qu’ils ne le font pas.\nexiste dans tout état persistant. Vous ne connectez pas k8 à un annuaire LDAP\nou Active Directory. Chaque demande doit attribuer une identité à K8 en une\nde multiples méthodes possibles. Je capitalise ASSERT car il deviendra\nimportant plus tard. La clé est de se rappeler que k8s ne s’authentifie pas\nutilisateurs; cela valide les assertions.\n\n\nComptes de service\n\nLes comptes de service sont les endroits où cette règle est légèrement déformée. C&#39;est vrai que k8s\nne stocke pas d&#39;informations sur les utilisateurs. Il stocke des comptes de service,\nqui ne sont pas destinés à représenter les gens. Ils sont censés représenter\ntout ce qui n&#39;est pas une personne. Tout ce qui interagit avec quelque chose\nsinon, dans k8s fonctionne comme un compte de service. Par exemple, si vous deviez\nsoumettre un pod très basique:\n\n\n\n\n\napiVersion: v1\ngenre: Pod\nmétadonnées:\n  nom: myapp-pod\n  Étiquettes:\n    app: myapp\nspec:\n  conteneurs:\n  - nom: myapp-container\n    image: busybox\n    commander: ['sh', '-c', 'echo Hello Kubernetes!\n     ↪&& sleep 3600']\n\n\nEt puis regardez-le dans K8S après le déploiement en exécutant kubectl get pod\nmyapp-pod -o yaml:\n\n\n\n\n\napiVersion: v1\ngenre: Pod\nmétadonnées:\n  creationTimestamp: 2018-12-25T19: 17: 53Z\n  Étiquettes:\n    app: myapp\n  nom: myapp-pod\n  namespace: default\n  resourceVersion: &quot;12499217&quot;\n  selfLink: / api / v1 / espaces de noms / default / pods / myapp-pod\n  uid: c6dd5181-0879-11e9-a289-525400616039\nspec:\n  conteneurs:\n  - commande:\n    - sh\n    - -c\n    - echo Bonjour Kubernetes! &amp;&amp; sommeil 3600\n    image: busybox\n    imagePullPolicy: toujours\n    nom: myapp-container\n.\n.\n.\n    volumeMounts:\n    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount\n      nom: default-token-bjzd4\n      readOnly: true\n.\n.\n.\n  serviceAccount: par défaut\n  serviceAccountName: default\n  .\n  .\n  .\n\n\nVous remarquerez qu&#39;il y a un serviceAccount et\nserviceAccountName attribut,\nqui sont tous deux défaut. Ce compte de service est injecté pour\nvous par la chaîne de contrôleur d&#39;admission. Vous pouvez définir votre propre service\ncompte sur les pods, mais c’est pour un article ultérieur sur l’autorisation dans k8s.\nPour l&#39;instant, je veux expliquer ce qu&#39;est un compte de service pour le distinguer\nà partir d&#39;un compte d&#39;utilisateur.\n\nIl est tentant d&#39;utiliser des comptes de service pour représenter des personnes. Ils sont simples\npour créer et facile à utiliser. Ils souffrent cependant de multiples inconvénients:\n\n\n\nLe jeton d&#39;un compte de service est une longue chaîne dont aucun humain ne peut se souvenir,\ndonc il sera probablement écrit, ce qui peut être exploité si pas fait\ncorrectement.\n\n\nLe seul moyen d&#39;autoriser les comptes de service est via des liaisons RBAC\ndirectement. (Je prévois d’entrer dans les détails dans un prochain article,\nmais imaginez avoir 2 000 développeurs pour suivre des dizaines de\nLes espaces de noms ont tous leurs propres politiques. L&#39;audit sera un cauchemar.)\n\n\nLes comptes de service n&#39;ont pas d&#39;expiration, donc s&#39;il y a une fuite et personne\nsait, on peut en abuser continuellement jusqu&#39;à ce qu&#39;on le découvre.\n\n\nSi votre application s&#39;exécute dans un pod et doit parler au serveur d&#39;API,\nvous pouvez récupérer le compte de service du pod via un secret monté\nà votre pod. Si vous regardez le yaml ci-dessus, vous verrez un montage de volume\na été ajouté à /var/run/secrets/kubernetes.io/serviceaccount où\nIl existe un fichier de jeton contenant le jeton du compte de service du pod.\nN&#39;intégrez pas de jetons de compte de service en tant que secrets ou configuration pour une\npod fonctionnant dans le cluster, car il est plus difficile d’utiliser la rotation\njetons et est généralement plus difficile à gérer.\n\n\nComptes utilisateur\n\nJ&#39;ai déjà mentionné que k8s ne se connecte à aucun type de magasin d&#39;utilisateurs (pas\ndirectement au moins). Cela signifie qu&#39;à chaque demande, vous devez fournir\nsuffisamment d’informations pour que k8s valide l’appelant. K8s ne se soucie pas comment\nvous établissez l&#39;identité, il se soucie seulement de savoir comment prouver que l&#39;identité est valide.\nPlusieurs mécanismes existent pour le faire. Je couvre le\nle plus populaire ici.\n\n\nComment Kubernetes sait qui vous êtes\n\nOpenID Connect\n\nC’est l’option que vous devriez utiliser (à l’exception du cloud\nsolution basée sur le fournisseur pour une distribution gérée) pour authentifier les utilisateurs.\n\n\n\nLes jetons OpenID Connect peuvent être de très courte durée, donc s&#39;ils sont interceptés\net exfiltré, au moment où les attaquants savent ce qu&#39;ils ont, le jeton\nest inutile.\n\n\nUtiliser OpenID Connect, k8s jamais a les informations d&#39;identification de l&#39;utilisateur, il est donc\nimpossible de faire fuir quelque chose qu&#39;il n&#39;a pas.\n\n\nUne identité d’utilisateur présentée par OpenID Connect peut fournir non seulement\ninformations de nom d&#39;utilisateur, mais aussi informations de groupe. Cela fait beaucoup\ngestion plus facile des accès via un annuaire LDAP ou une base de données externe\nsans avoir à créer des liaisons RBAC pour des utilisateurs individuels.\n\n\nEn ajoutant un &quot;proxy&quot; entre k8s et la couche d&#39;identité, il permet\nil est plus facile d&#39;ajouter plusieurs types d&#39;authentification, tels que le multi-facteur\nauthentification.\n\n\nUne pléthore d&#39;implémentations open source OpenID Connect\ntravaillera avec k8s.\n\nOpenID Connect Primer\nAvant d’explorer comment travailler avec OpenID Connect, laissez-moi vous expliquer.\nle protocole. Il y a deux concepts de base à comprendre avec\nOpenID Connect:\n\n\n\nOpenID Connect est un protocole de génération d&#39;assertions construit sur le dessus\nde OAuth2.\n\nOAuth2 est un protocole d&#39;autorisation permettant de transférer des jetons au porteur.\n\nIl semble qu&#39;il manque un mot dans ces deux points:\nauthentification! C&#39;est parce que OpenID Connect n&#39;est pas une authentification\nprotocole. Peu importe comment vous vous authentifiez. Peu importe si\nl&#39;utilisateur connecté avec un nom d&#39;utilisateur et un mot de passe, une carte à puce ou tout simplement\nregardé vraiment digne de confiance. OpenID Connect est un protocole permettant de générer,\nrécupérer et actualiser des assertions concernant un utilisateur. Il y a aussi\ncertaines normes sur ce à quoi l&#39;assertion ressemble, mais comment l&#39;utilisateur\nauthentifie est finalement à la mise en œuvre OpenID Connect.\n\nLe deuxième point sur OAuth2 est important car ces deux protocoles\nsont souvent confondus les uns avec les autres ou mal représentés. OAuth2 est un\nprotocole de transfert de jetons. Il ne définit pas ce que le jeton est\nou comment il devrait être utilisé. Il définit simplement comment le jeton est passé\nentre porteurs et parties en instance.\n\n\nComment Kubernetes fonctionne-t-il avec OpenID Connect?\nLa figure 1 montre le graphique des k8s authentification\npage.\n\n\n\nFigure 1. Open8 Connect Flow de k8s\n\nJe ne vais pas répéter les mots exacts du site, mais voici les\nbases:\n\n\n\nL&#39;utilisateur se connecte au fournisseur d&#39;identité de l&#39;utilisateur.\n\nLe fournisseur d&#39;identité génère un id_token et un\nrefresh_token.\n\nle id_token est utilisé pour affirmer l&#39;identité de l&#39;utilisateur à k8s.\n\nQuand le id_token a expiré, le refresh_token est utilisé pour\ngénérer un nouveau id_token.\n\nUn id_token est un jeton Web JSON (JWT) qui dit:\n\n\n\nQui est l&#39;utilisateur?\n\nÀ quels groupes l&#39;utilisateur appartient-il (facultativement)?\n\nCombien de temps le jeton est valide.\n\nEt, il contient une signature numérique pour valider que le JWT n&#39;a pas été\naltéré.\n\nL&#39;attribut id de l&#39;utilisateur, sous, est généralement l&#39;identifiant unique de l&#39;utilisateur.\nIl est courant d&#39;utiliser l&#39;identifiant de connexion d&#39;Active Directory (ou samAccountName), ou\nde nombreux développeurs préfèrent utiliser une adresse électronique. En général, ce n&#39;est pas\nla meilleure pratique. L&#39;identifiant d&#39;un utilisateur doit être à la fois unique et immuable.\nBien qu’une adresse électronique soit unique, elle n’est pas toujours immuable (par exemple, parfois\ndes noms\nchangement).\n\nLe JWT est transmis à chaque demande de Kubectl à k8s. le\nid_token\nest appelé &quot;jeton porteur&quot;, car il donne au porteur l&#39;accès\nsans aucun contrôle supplémentaire. Cela signifie que si un système dans le\nflux d&#39;un appel d&#39;API, tel qu&#39;un proxy de service, validant webhook\nwebhook en mutation &#8211; devaient laisser échapper ce jeton, il pourrait être abusé par un\nattaquant. Parce que ces jetons sont si facilement maltraités, ils devraient avoir\ndurée de vie très courte. Je recommande une minute. De cette façon, si un jeton\nest exfiltré au moment où quelqu&#39;un le voit, sait ce que c&#39;est et est\ncapable de l&#39;utiliser, le jeton a expiré et est donc inutile. Lors de l&#39;utilisation\nces jetons de courte durée, il est important de configurer un\nrefresh_token\npour mettre à jour votre id_token après son expiration.\n\n\nKubectl sait comment rafraîchir la id_token jeton en utilisant le\nrefresh_token appeler l&#39;URL du service d&#39;autorisation du fournisseur d&#39;identité.\nle refresh_token est un jeton que le serveur API du k8s n&#39;utilise jamais et\ndoit être traité comme un secret par l&#39;utilisateur. Ce jeton est utilisé pour obtenir un\nnouveau JWT, à quel point un nouveau refresh_token est disponible. Où le\nid_token devrait avoir une durée de vie très courte, le\nrefresh_token\ntimeout doit être similaire à un délai d&#39;inactivité, généralement compris entre 15 et 20.\nminutes. De cette façon, la mise en œuvre de votre K8 sera conforme à\nles stratégies de votre entreprise se concentrent sur les délais d&#39;inactivité. Utilisant un\nrefresh_token pour obtenir un nouveau id_token est plus sécurisé\nqu&#39;une vie plus longue\nid_token parce que le refresh_token signifie le\nSuivant:\n\n\n\nIl ne peut être utilisé qu&#39;une seule fois. une fois qu&#39;il est utilisé, un nouveau est généré.\n\n\nIl est uniquement transmis entre l&#39;utilisateur et le fournisseur d&#39;identité,\nil y a donc beaucoup moins d&#39;acteurs qui pourraient potentiellement la laisser couler.\n\n\nIl ne vous identifie pas; s&#39;il est exfiltré seul, il ne peut pas être utilisé\npour vous identifier car il est opaque, afin qu&#39;un attaquant ne sache pas quoi\nfaire avec sans informations supplémentaires.\n\n\nLe tableau de bord Kubernetes\nLe tableau de bord ne dispose pas de son propre système de connexion. Tout ce qu&#39;il peut faire utilise un\njeton existant agissant au nom de l&#39;utilisateur. Cela signifie souvent mettre un\nproxy inverse devant le tableau de bord qui injectera le\nid_token\nsur chaque demande. Le proxy inverse est alors responsable de l&#39;actualisation\nle jeton au besoin.\n\n\nQuel fournisseur d&#39;identité devrais-je utiliser?\nLors du choix d&#39;un fournisseur d&#39;identité, k8s n&#39;a en réalité que deux exigences:\n\n\n\nIl doit supporte la découverte OpenID Connect.\n\nIl fournit un mécanisme pour générer des jetons et les injecter dans votre\n~ / .kube / config.\n\nC&#39;est à peu près ça! La découverte est importante car elle vous garde\nd&#39;avoir à dire à K8 où les différentes URL sont manuellement, quelles sont les clés\nsont utilisés pour la signature et ainsi de suite. Il est beaucoup plus facile de pointer le k8s vers une découverte\nURL qui contient toutes ces informations. C’est une norme commune, et la plupart\nLes fournisseurs d&#39;identité le prennent en charge immédiatement.\n\nLe point 2 est l&#39;endroit où les choses deviennent intéressantes. Il y a différentes écoles\nde penser à comment obtenir vos informations de jeton à partir de votre point de connexion\n(généralement un navigateur Web) dans votre ~ / .kube / config.\n\n\nInjection de navigateur Web\nDans ce modèle, tout se concentre sur votre navigateur Web. Vous\ns&#39;authentifier via votre navigateur, puis des commandes sont fournies à\nconfigurez votre Kubectl client correctement. Par exemple, OpenUnison (notre propre projet)\nvous fournit une seule commande pour définir votre configuration de cluster\nune fois authentifié (Figure 2).\n\n\n\nFigure 2. Jeton de navigateur\n\nTu utilises KubectlLa capacité intégrée de configurer le fichier de configuration à partir de\nla ligne de commande pour terminer la configuration.\n\nCette méthode a plusieurs avantages:\n\n\n\nLes navigateurs ont le plus d&#39;options pour l&#39;authentification. En plus de\nnom d&#39;utilisateur et mot de passe, vous pouvez intégrer Kerberos, multi-facteurs, etc.\n\n\nVous n&#39;avez pas besoin de gérer des configurations complexes de K8; ils sont gérés\npour vous.\n\n\nCela fonctionne avec stock Kubectl commandes, donc il n&#39;y a rien de plus à déployer pour\npostes de travail.\n\n\n\nLe plugin kubectl\nVous pouvez prolonger le Kubectl commande utilisant des plugins.\nÀ l&#39;aide d&#39;un plugin, vous pouvez collecter les informations d&#39;identification d&#39;un utilisateur, puis générer\nun jeton. J&#39;ai vu des plugins qui vont collecter vos identifiants\nla CLI et d’autres plug-ins qui lanceront un navigateur pour vous demander de\nun login. Cette méthode est bonne du point de vue de la CLI car elle permet à votre CLI\npilotez votre expérience utilisateur. L’inconvénient majeur de cette approche est-il\nnécessite l&#39;installation du plug-in sur chaque poste de travail.\n\nTélécharger la configuration\nAvec cette méthode, le fournisseur d’identité (ou une application personnalisée)\nvous fournit un fichier de configuration entièrement généré que vous pouvez télécharger.\nCela peut créer un problème de support si quelque chose n&#39;est pas enregistré dans\nau bon endroit.\n\nUne fois que vous avez choisi un fournisseur d’identité, suivez ses instructions.\nl&#39;intégration. Les éléments clés d’importance sont l’URL de découverte, le\nl&#39;identifiant &quot;claim&quot; et la &quot;claim&quot; du groupe.\n\n\nCertificats X509\n\nL’authentification par certificat exploite la négociation TLS entre les\nclient (généralement le Kubectl commande) et le serveur API k8s\npour affirmer une identité en présentant un certificat au serveur API.\nÀ l&#39;exception d&#39;un cas d&#39;utilisation, cette méthode n&#39;est pas une &quot;meilleure pratique&quot;\net devrait être découragé pour plusieurs raisons:\n\n\n\nLes certificats ne peuvent pas être révoqués en k8. Vous devez soit attendre jusqu&#39;à\nle certificat a expiré ou ressaisissez l&#39;intégralité du cluster.\n\n\nLa clé privée d&#39;un certificat doit jamais quitter le support sécurisé\noù c&#39;était\ngénéré. Habituellement, on vous &quot;donne&quot; une paire de clés et un certificat à utiliser.\n\n\nIl est difficile d&#39;utiliser des groupes avec des certificats. Vous devez les intégrer\ndans le sujet, et si ces groupes doivent changer, bien, voir n ° 1 ci-dessus.\n\n\nLa seule situation où vous devriez utiliser des certificats X509 pour\nl&#39;authentification est lorsque vous démarrez votre cluster ou en cas de\nurgence et votre fournisseur d&#39;identité n&#39;est pas disponible. La plupart des distributions\ndéployer une paire de clés sur chaque maître, donc si vous ssh dans ce maître, vous pouvez\nutilisation Kubectl gérer le cluster. Cela signifie que vous devez verrouiller\naccès au maître (je prévois de couvrir cela dans un prochain article).\n\n\nWebhooks\n\nCette méthode vous permet d’intégrer une connexion tierce ou un système de jeton via\nun Webhook. Au lieu de dire à k8s comment valider une identité, k8s\nappelle un webhook et demande &quot;qui est-ce?&quot;\n\nNe le faites pas sauf si vous êtes un fournisseur de cloud et que vous avez votre propre identité.\nSolution. À peu près toutes les mises en œuvre que j&#39;ai vues de cela se transforment en\n&quot;passons les mots de passe&quot; ou un OpenID Connect mal pensé.\n\n\nProxy inverse avec emprunt d&#39;identité\n\nIci, le client (kubectl ou autre) ne communique pas avec l&#39;API\nserveur directement. Au lieu de cela, il communique avec un proxy inverse, qui\ninjecte des en-têtes dans la requête pour représenter l&#39;utilisateur. C&#39;est souvent\nsouligné comme un moyen de gérer les scénarios d’authentification avancée,\ncela demande le moins de travail possible du point de vue du serveur d&#39;API.\nLes étapes de la mise en œuvre sont les suivantes:\n\n\n\nCréez un compte de service.\n\n\nAutorisez le compte de service à effectuer l&#39;emprunt d&#39;identité.\n\n\nConfigurez un proxy inverse pour injecter le compte de service et\nen-têtes d&#39;emprunt d&#39;identité dans chaque demande.\n\n\nCette solution fournit ces problèmes ainsi que les mêmes pièges que Webhooks.\nIl est fort probable que les normes existantes satisferont vos besoins et seront plus faciles à\ngérer et maintenir.\n\n\nLe tirer ensemble\nPour intégrer l&#39;identité dans les k8, suivez cette liste de contrôle de base:\n\n\n\nUtilisez les comptes de service uniquement pour les systèmes, pas pour les utilisateurs.\n\n\nUtilisez OpenID Connect pour les personnes; il est bien vérifié et soutenu par\nplusieurs systèmes, à la fois open-source et propriétaires.\n\n\nUtilisez l&#39;authentification par certificat uniquement pour &quot;briser le verre en cas de\nsituations d&#39;urgence.\n\n\nSuivez ces règles et vous constaterez que vos développeurs sont heureux de\navoir un mot de passe de moins à retenir, et votre équipe de sécurité sera heureuse\nvous suivez les meilleures pratiques et les exigences de conformité.\n\n\nRessources\n\nClick to rate this post!\r\n                                   \r\n                               [Total: 0  Average: 0]","paragraphs":["Vous avez déployé Kubernetes, mais maintenant, comment allez-vous le mettre entre les mains de\nvos développeurs et administrateurs en toute sécurité?\nKubernetes a pris d&#39;assaut le monde. En quelques années, Kubernetes\n(aka k8s) est passé d&#39;un projet intéressant à un moteur de la technologie\net l&#39;innovation. L’un des moyens les plus simples d’illustrer ce point est\nla différence de fréquentation dans les deux fois KubeCon Amérique du Nord a\nété à Seattle. Il y a deux ans, c&#39;était dans un hôtel avec moins de 20\ncabines de vendeurs. Cette année, c’était au Seattle Convention Center avec\n8 000 participants et plus de 100 fournisseurs!","Comme avec tout autre système complexe, k8s a son propre modèle de sécurité et\ndoit interagir avec les utilisateurs et les autres systèmes. Dans cet article,\nJe passe en revue les différentes options d’authentification et\nfournir des exemples et des conseils de mise en œuvre sur la façon dont vous devriez gérer\naccès à votre cluster.","Qu&#39;est-ce que l&#39;identité signifie pour Kubernetes?\nLa première chose à demander est &quot;qu&#39;est-ce qu&#39;une identité?&quot; en k8s. K8s est très\ndifférent de la plupart des autres systèmes et applications. C&#39;est un ensemble d&#39;API.\nIl n&#39;y a pas d &#39;&quot;interface Web&quot; (je discute du tableau de bord plus tard dans cet article).\nIl n&#39;y a aucun intérêt à &quot;se connecter&quot;. Il n&#39;y a pas de &quot;session&quot; ou de &quot;timeout&quot;.\nChaque demande d&#39;API est unique et distincte, et elle doit tout contenir\nk8s doit s&#39;authentifier et autoriser la demande.","Cela dit, la principale chose à retenir à propos des utilisateurs de k8s est qu’ils ne le font pas.\nexiste dans tout état persistant. Vous ne connectez pas k8 à un annuaire LDAP\nou Active Directory. Chaque demande doit attribuer une identité à K8 en une\nde multiples méthodes possibles. Je capitalise ASSERT car il deviendra\nimportant plus tard. La clé est de se rappeler que k8s ne s’authentifie pas\nutilisateurs; cela valide les assertions.","Comptes de service","Les comptes de service sont les endroits où cette règle est légèrement déformée. C&#39;est vrai que k8s\nne stocke pas d&#39;informations sur les utilisateurs. Il stocke des comptes de service,\nqui ne sont pas destinés à représenter les gens. Ils sont censés représenter\ntout ce qui n&#39;est pas une personne. Tout ce qui interagit avec quelque chose\nsinon, dans k8s fonctionne comme un compte de service. Par exemple, si vous deviez\nsoumettre un pod très basique:","apiVersion: v1\ngenre: Pod\nmétadonnées:\n  nom: myapp-pod\n  Étiquettes:\n    app: myapp\nspec:\n  conteneurs:\n  - nom: myapp-container\n    image: busybox\n    commander: ['sh', '-c', 'echo Hello Kubernetes!\n     ↪&& sleep 3600']","Et puis regardez-le dans K8S après le déploiement en exécutant kubectl get pod\nmyapp-pod -o yaml:","apiVersion: v1\ngenre: Pod\nmétadonnées:\n  creationTimestamp: 2018-12-25T19: 17: 53Z\n  Étiquettes:\n    app: myapp\n  nom: myapp-pod\n  namespace: default\n  resourceVersion: &quot;12499217&quot;\n  selfLink: / api / v1 / espaces de noms / default / pods / myapp-pod\n  uid: c6dd5181-0879-11e9-a289-525400616039\nspec:\n  conteneurs:\n  - commande:\n    - sh\n    - -c\n    - echo Bonjour Kubernetes! &amp;&amp; sommeil 3600\n    image: busybox\n    imagePullPolicy: toujours\n    nom: myapp-container\n.\n.\n.\n    volumeMounts:\n    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount\n      nom: default-token-bjzd4\n      readOnly: true\n.\n.\n.\n  serviceAccount: par défaut\n  serviceAccountName: default\n  .\n  .\n  .","Vous remarquerez qu&#39;il y a un serviceAccount et\nserviceAccountName attribut,\nqui sont tous deux défaut. Ce compte de service est injecté pour\nvous par la chaîne de contrôleur d&#39;admission. Vous pouvez définir votre propre service\ncompte sur les pods, mais c’est pour un article ultérieur sur l’autorisation dans k8s.\nPour l&#39;instant, je veux expliquer ce qu&#39;est un compte de service pour le distinguer\nà partir d&#39;un compte d&#39;utilisateur.","Il est tentant d&#39;utiliser des comptes de service pour représenter des personnes. Ils sont simples\npour créer et facile à utiliser. Ils souffrent cependant de multiples inconvénients:","Le jeton d&#39;un compte de service est une longue chaîne dont aucun humain ne peut se souvenir,\ndonc il sera probablement écrit, ce qui peut être exploité si pas fait\ncorrectement.","Le seul moyen d&#39;autoriser les comptes de service est via des liaisons RBAC\ndirectement. (Je prévois d’entrer dans les détails dans un prochain article,\nmais imaginez avoir 2 000 développeurs pour suivre des dizaines de\nLes espaces de noms ont tous leurs propres politiques. L&#39;audit sera un cauchemar.)","Les comptes de service n&#39;ont pas d&#39;expiration, donc s&#39;il y a une fuite et personne\nsait, on peut en abuser continuellement jusqu&#39;à ce qu&#39;on le découvre.","Si votre application s&#39;exécute dans un pod et doit parler au serveur d&#39;API,\nvous pouvez récupérer le compte de service du pod via un secret monté\nà votre pod. Si vous regardez le yaml ci-dessus, vous verrez un montage de volume\na été ajouté à /var/run/secrets/kubernetes.io/serviceaccount où\nIl existe un fichier de jeton contenant le jeton du compte de service du pod.\nN&#39;intégrez pas de jetons de compte de service en tant que secrets ou configuration pour une\npod fonctionnant dans le cluster, car il est plus difficile d’utiliser la rotation\njetons et est généralement plus difficile à gérer.","Comptes utilisateur","J&#39;ai déjà mentionné que k8s ne se connecte à aucun type de magasin d&#39;utilisateurs (pas\ndirectement au moins). Cela signifie qu&#39;à chaque demande, vous devez fournir\nsuffisamment d’informations pour que k8s valide l’appelant. K8s ne se soucie pas comment\nvous établissez l&#39;identité, il se soucie seulement de savoir comment prouver que l&#39;identité est valide.\nPlusieurs mécanismes existent pour le faire. Je couvre le\nle plus populaire ici.","Comment Kubernetes sait qui vous êtes","OpenID Connect","C’est l’option que vous devriez utiliser (à l’exception du cloud\nsolution basée sur le fournisseur pour une distribution gérée) pour authentifier les utilisateurs.","Les jetons OpenID Connect peuvent être de très courte durée, donc s&#39;ils sont interceptés\net exfiltré, au moment où les attaquants savent ce qu&#39;ils ont, le jeton\nest inutile.","Utiliser OpenID Connect, k8s jamais a les informations d&#39;identification de l&#39;utilisateur, il est donc\nimpossible de faire fuir quelque chose qu&#39;il n&#39;a pas.","Une identité d’utilisateur présentée par OpenID Connect peut fournir non seulement\ninformations de nom d&#39;utilisateur, mais aussi informations de groupe. Cela fait beaucoup\ngestion plus facile des accès via un annuaire LDAP ou une base de données externe\nsans avoir à créer des liaisons RBAC pour des utilisateurs individuels.","En ajoutant un &quot;proxy&quot; entre k8s et la couche d&#39;identité, il permet\nil est plus facile d&#39;ajouter plusieurs types d&#39;authentification, tels que le multi-facteur\nauthentification.","Une pléthore d&#39;implémentations open source OpenID Connect\ntravaillera avec k8s.","OpenID Connect Primer\nAvant d’explorer comment travailler avec OpenID Connect, laissez-moi vous expliquer.\nle protocole. Il y a deux concepts de base à comprendre avec\nOpenID Connect:","OpenID Connect est un protocole de génération d&#39;assertions construit sur le dessus\nde OAuth2.","OAuth2 est un protocole d&#39;autorisation permettant de transférer des jetons au porteur.","Il semble qu&#39;il manque un mot dans ces deux points:\nauthentification! C&#39;est parce que OpenID Connect n&#39;est pas une authentification\nprotocole. Peu importe comment vous vous authentifiez. Peu importe si\nl&#39;utilisateur connecté avec un nom d&#39;utilisateur et un mot de passe, une carte à puce ou tout simplement\nregardé vraiment digne de confiance. OpenID Connect est un protocole permettant de générer,\nrécupérer et actualiser des assertions concernant un utilisateur. Il y a aussi\ncertaines normes sur ce à quoi l&#39;assertion ressemble, mais comment l&#39;utilisateur\nauthentifie est finalement à la mise en œuvre OpenID Connect.","Le deuxième point sur OAuth2 est important car ces deux protocoles\nsont souvent confondus les uns avec les autres ou mal représentés. OAuth2 est un\nprotocole de transfert de jetons. Il ne définit pas ce que le jeton est\nou comment il devrait être utilisé. Il définit simplement comment le jeton est passé\nentre porteurs et parties en instance.","Comment Kubernetes fonctionne-t-il avec OpenID Connect?\nLa figure 1 montre le graphique des k8s authentification\npage.","Figure 1. Open8 Connect Flow de k8s","Je ne vais pas répéter les mots exacts du site, mais voici les\nbases:","L&#39;utilisateur se connecte au fournisseur d&#39;identité de l&#39;utilisateur.","Le fournisseur d&#39;identité génère un id_token et un\nrefresh_token.","le id_token est utilisé pour affirmer l&#39;identité de l&#39;utilisateur à k8s.","Quand le id_token a expiré, le refresh_token est utilisé pour\ngénérer un nouveau id_token.","Un id_token est un jeton Web JSON (JWT) qui dit:","Qui est l&#39;utilisateur?","À quels groupes l&#39;utilisateur appartient-il (facultativement)?","Combien de temps le jeton est valide.","Et, il contient une signature numérique pour valider que le JWT n&#39;a pas été\naltéré.","L&#39;attribut id de l&#39;utilisateur, sous, est généralement l&#39;identifiant unique de l&#39;utilisateur.\nIl est courant d&#39;utiliser l&#39;identifiant de connexion d&#39;Active Directory (ou samAccountName), ou\nde nombreux développeurs préfèrent utiliser une adresse électronique. En général, ce n&#39;est pas\nla meilleure pratique. L&#39;identifiant d&#39;un utilisateur doit être à la fois unique et immuable.\nBien qu’une adresse électronique soit unique, elle n’est pas toujours immuable (par exemple, parfois\ndes noms\nchangement).","Le JWT est transmis à chaque demande de Kubectl à k8s. le\nid_token\nest appelé &quot;jeton porteur&quot;, car il donne au porteur l&#39;accès\nsans aucun contrôle supplémentaire. Cela signifie que si un système dans le\nflux d&#39;un appel d&#39;API, tel qu&#39;un proxy de service, validant webhook\nwebhook en mutation &#8211; devaient laisser échapper ce jeton, il pourrait être abusé par un\nattaquant. Parce que ces jetons sont si facilement maltraités, ils devraient avoir\ndurée de vie très courte. Je recommande une minute. De cette façon, si un jeton\nest exfiltré au moment où quelqu&#39;un le voit, sait ce que c&#39;est et est\ncapable de l&#39;utiliser, le jeton a expiré et est donc inutile. Lors de l&#39;utilisation\nces jetons de courte durée, il est important de configurer un\nrefresh_token\npour mettre à jour votre id_token après son expiration.","Kubectl sait comment rafraîchir la id_token jeton en utilisant le\nrefresh_token appeler l&#39;URL du service d&#39;autorisation du fournisseur d&#39;identité.\nle refresh_token est un jeton que le serveur API du k8s n&#39;utilise jamais et\ndoit être traité comme un secret par l&#39;utilisateur. Ce jeton est utilisé pour obtenir un\nnouveau JWT, à quel point un nouveau refresh_token est disponible. Où le\nid_token devrait avoir une durée de vie très courte, le\nrefresh_token\ntimeout doit être similaire à un délai d&#39;inactivité, généralement compris entre 15 et 20.\nminutes. De cette façon, la mise en œuvre de votre K8 sera conforme à\nles stratégies de votre entreprise se concentrent sur les délais d&#39;inactivité. Utilisant un\nrefresh_token pour obtenir un nouveau id_token est plus sécurisé\nqu&#39;une vie plus longue\nid_token parce que le refresh_token signifie le\nSuivant:","Il ne peut être utilisé qu&#39;une seule fois. une fois qu&#39;il est utilisé, un nouveau est généré.","Il est uniquement transmis entre l&#39;utilisateur et le fournisseur d&#39;identité,\nil y a donc beaucoup moins d&#39;acteurs qui pourraient potentiellement la laisser couler.","Il ne vous identifie pas; s&#39;il est exfiltré seul, il ne peut pas être utilisé\npour vous identifier car il est opaque, afin qu&#39;un attaquant ne sache pas quoi\nfaire avec sans informations supplémentaires.","Le tableau de bord Kubernetes\nLe tableau de bord ne dispose pas de son propre système de connexion. Tout ce qu&#39;il peut faire utilise un\njeton existant agissant au nom de l&#39;utilisateur. Cela signifie souvent mettre un\nproxy inverse devant le tableau de bord qui injectera le\nid_token\nsur chaque demande. Le proxy inverse est alors responsable de l&#39;actualisation\nle jeton au besoin.","Quel fournisseur d&#39;identité devrais-je utiliser?\nLors du choix d&#39;un fournisseur d&#39;identité, k8s n&#39;a en réalité que deux exigences:","Il doit supporte la découverte OpenID Connect.","Il fournit un mécanisme pour générer des jetons et les injecter dans votre\n~ / .kube / config.","C&#39;est à peu près ça! La découverte est importante car elle vous garde\nd&#39;avoir à dire à K8 où les différentes URL sont manuellement, quelles sont les clés\nsont utilisés pour la signature et ainsi de suite. Il est beaucoup plus facile de pointer le k8s vers une découverte\nURL qui contient toutes ces informations. C’est une norme commune, et la plupart\nLes fournisseurs d&#39;identité le prennent en charge immédiatement.","Le point 2 est l&#39;endroit où les choses deviennent intéressantes. Il y a différentes écoles\nde penser à comment obtenir vos informations de jeton à partir de votre point de connexion\n(généralement un navigateur Web) dans votre ~ / .kube / config.","Injection de navigateur Web\nDans ce modèle, tout se concentre sur votre navigateur Web. Vous\ns&#39;authentifier via votre navigateur, puis des commandes sont fournies à\nconfigurez votre Kubectl client correctement. Par exemple, OpenUnison (notre propre projet)\nvous fournit une seule commande pour définir votre configuration de cluster\nune fois authentifié (Figure 2).","Figure 2. Jeton de navigateur","Tu utilises KubectlLa capacité intégrée de configurer le fichier de configuration à partir de\nla ligne de commande pour terminer la configuration.","Cette méthode a plusieurs avantages:","Les navigateurs ont le plus d&#39;options pour l&#39;authentification. En plus de\nnom d&#39;utilisateur et mot de passe, vous pouvez intégrer Kerberos, multi-facteurs, etc.","Vous n&#39;avez pas besoin de gérer des configurations complexes de K8; ils sont gérés\npour vous.","Cela fonctionne avec stock Kubectl commandes, donc il n&#39;y a rien de plus à déployer pour\npostes de travail.","Le plugin kubectl\nVous pouvez prolonger le Kubectl commande utilisant des plugins.\nÀ l&#39;aide d&#39;un plugin, vous pouvez collecter les informations d&#39;identification d&#39;un utilisateur, puis générer\nun jeton. J&#39;ai vu des plugins qui vont collecter vos identifiants\nla CLI et d’autres plug-ins qui lanceront un navigateur pour vous demander de\nun login. Cette méthode est bonne du point de vue de la CLI car elle permet à votre CLI\npilotez votre expérience utilisateur. L’inconvénient majeur de cette approche est-il\nnécessite l&#39;installation du plug-in sur chaque poste de travail.","Télécharger la configuration\nAvec cette méthode, le fournisseur d’identité (ou une application personnalisée)\nvous fournit un fichier de configuration entièrement généré que vous pouvez télécharger.\nCela peut créer un problème de support si quelque chose n&#39;est pas enregistré dans\nau bon endroit.","Une fois que vous avez choisi un fournisseur d’identité, suivez ses instructions.\nl&#39;intégration. Les éléments clés d’importance sont l’URL de découverte, le\nl&#39;identifiant &quot;claim&quot; et la &quot;claim&quot; du groupe.","Certificats X509","L’authentification par certificat exploite la négociation TLS entre les\nclient (généralement le Kubectl commande) et le serveur API k8s\npour affirmer une identité en présentant un certificat au serveur API.\nÀ l&#39;exception d&#39;un cas d&#39;utilisation, cette méthode n&#39;est pas une &quot;meilleure pratique&quot;\net devrait être découragé pour plusieurs raisons:","Les certificats ne peuvent pas être révoqués en k8. Vous devez soit attendre jusqu&#39;à\nle certificat a expiré ou ressaisissez l&#39;intégralité du cluster.","La clé privée d&#39;un certificat doit jamais quitter le support sécurisé\noù c&#39;était\ngénéré. Habituellement, on vous &quot;donne&quot; une paire de clés et un certificat à utiliser.","Il est difficile d&#39;utiliser des groupes avec des certificats. Vous devez les intégrer\ndans le sujet, et si ces groupes doivent changer, bien, voir n ° 1 ci-dessus.","La seule situation où vous devriez utiliser des certificats X509 pour\nl&#39;authentification est lorsque vous démarrez votre cluster ou en cas de\nurgence et votre fournisseur d&#39;identité n&#39;est pas disponible. La plupart des distributions\ndéployer une paire de clés sur chaque maître, donc si vous ssh dans ce maître, vous pouvez\nutilisation Kubectl gérer le cluster. Cela signifie que vous devez verrouiller\naccès au maître (je prévois de couvrir cela dans un prochain article).","Webhooks","Cette méthode vous permet d’intégrer une connexion tierce ou un système de jeton via\nun Webhook. Au lieu de dire à k8s comment valider une identité, k8s\nappelle un webhook et demande &quot;qui est-ce?&quot;","Ne le faites pas sauf si vous êtes un fournisseur de cloud et que vous avez votre propre identité.\nSolution. À peu près toutes les mises en œuvre que j&#39;ai vues de cela se transforment en\n&quot;passons les mots de passe&quot; ou un OpenID Connect mal pensé.","Proxy inverse avec emprunt d&#39;identité","Ici, le client (kubectl ou autre) ne communique pas avec l&#39;API\nserveur directement. Au lieu de cela, il communique avec un proxy inverse, qui\ninjecte des en-têtes dans la requête pour représenter l&#39;utilisateur. C&#39;est souvent\nsouligné comme un moyen de gérer les scénarios d’authentification avancée,\ncela demande le moins de travail possible du point de vue du serveur d&#39;API.\nLes étapes de la mise en œuvre sont les suivantes:","Créez un compte de service.","Autorisez le compte de service à effectuer l&#39;emprunt d&#39;identité.","Configurez un proxy inverse pour injecter le compte de service et\nen-têtes d&#39;emprunt d&#39;identité dans chaque demande.","Cette solution fournit ces problèmes ainsi que les mêmes pièges que Webhooks.\nIl est fort probable que les normes existantes satisferont vos besoins et seront plus faciles à\ngérer et maintenir.","Le tirer ensemble\nPour intégrer l&#39;identité dans les k8, suivez cette liste de contrôle de base:","Utilisez les comptes de service uniquement pour les systèmes, pas pour les utilisateurs.","Utilisez OpenID Connect pour les personnes; il est bien vérifié et soutenu par\nplusieurs systèmes, à la fois open-source et propriétaires.","Utilisez l&#39;authentification par certificat uniquement pour &quot;briser le verre en cas de\nsituations d&#39;urgence.","Suivez ces règles et vous constaterez que vos développeurs sont heureux de\navoir un mot de passe de moins à retenir, et votre équipe de sécurité sera heureuse\nvous suivez les meilleures pratiques et les exigences de conformité.","Ressources","Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"],"content_blocks":[{"id":"text-1","type":"text","heading":"","plain_text":"Vous avez déployé Kubernetes, mais maintenant, comment allez-vous le mettre entre les mains de\nvos développeurs et administrateurs en toute sécurité?\nKubernetes a pris d&#39;assaut le monde. En quelques années, Kubernetes\n(aka k8s) est passé d&#39;un projet intéressant à un moteur de la technologie\net l&#39;innovation. L’un des moyens les plus simples d’illustrer ce point est\nla différence de fréquentation dans les deux fois KubeCon Amérique du Nord a\nété à Seattle. Il y a deux ans, c&#39;était dans un hôtel avec moins de 20\ncabines de vendeurs. Cette année, c’était au Seattle Convention Center avec\n8 000 participants et plus de 100 fournisseurs!","html":"<p>Vous avez déployé Kubernetes, mais maintenant, comment allez-vous le mettre entre les mains de\nvos développeurs et administrateurs en toute sécurité?\nKubernetes a pris d&#039;assaut le monde. En quelques années, Kubernetes\n(aka k8s) est passé d&#039;un projet intéressant à un moteur de la technologie\net l&#039;innovation. L’un des moyens les plus simples d’illustrer ce point est\nla différence de fréquentation dans les deux fois KubeCon Amérique du Nord a\nété à Seattle. Il y a deux ans, c&#039;était dans un hôtel avec moins de 20\ncabines de vendeurs. Cette année, c’était au Seattle Convention Center avec\n8 000 participants et plus de 100 fournisseurs!</p>"},{"id":"text-2","type":"text","heading":"","plain_text":"Comme avec tout autre système complexe, k8s a son propre modèle de sécurité et\ndoit interagir avec les utilisateurs et les autres systèmes. Dans cet article,\nJe passe en revue les différentes options d’authentification et\nfournir des exemples et des conseils de mise en œuvre sur la façon dont vous devriez gérer\naccès à votre cluster.","html":"<p>Comme avec tout autre système complexe, k8s a son propre modèle de sécurité et\ndoit interagir avec les utilisateurs et les autres systèmes. Dans cet article,\nJe passe en revue les différentes options d’authentification et\nfournir des exemples et des conseils de mise en œuvre sur la façon dont vous devriez gérer\naccès à votre cluster.</p>"},{"id":"text-3","type":"text","heading":"","plain_text":"Qu&#39;est-ce que l&#39;identité signifie pour Kubernetes?\nLa première chose à demander est &quot;qu&#39;est-ce qu&#39;une identité?&quot; en k8s. K8s est très\ndifférent de la plupart des autres systèmes et applications. C&#39;est un ensemble d&#39;API.\nIl n&#39;y a pas d &#39;&quot;interface Web&quot; (je discute du tableau de bord plus tard dans cet article).\nIl n&#39;y a aucun intérêt à &quot;se connecter&quot;. Il n&#39;y a pas de &quot;session&quot; ou de &quot;timeout&quot;.\nChaque demande d&#39;API est unique et distincte, et elle doit tout contenir\nk8s doit s&#39;authentifier et autoriser la demande.","html":"<p>Qu&#039;est-ce que l&#039;identité signifie pour Kubernetes?\nLa première chose à demander est &quot;qu&#039;est-ce qu&#039;une identité?&quot; en k8s. K8s est très\ndifférent de la plupart des autres systèmes et applications. C&#039;est un ensemble d&#039;API.\nIl n&#039;y a pas d &#039;&quot;interface Web&quot; (je discute du tableau de bord plus tard dans cet article).\nIl n&#039;y a aucun intérêt à &quot;se connecter&quot;. Il n&#039;y a pas de &quot;session&quot; ou de &quot;timeout&quot;.\nChaque demande d&#039;API est unique et distincte, et elle doit tout contenir\nk8s doit s&#039;authentifier et autoriser la demande.</p>"},{"id":"text-4","type":"text","heading":"","plain_text":"Cela dit, la principale chose à retenir à propos des utilisateurs de k8s est qu’ils ne le font pas.\nexiste dans tout état persistant. Vous ne connectez pas k8 à un annuaire LDAP\nou Active Directory. Chaque demande doit attribuer une identité à K8 en une\nde multiples méthodes possibles. Je capitalise ASSERT car il deviendra\nimportant plus tard. La clé est de se rappeler que k8s ne s’authentifie pas\nutilisateurs; cela valide les assertions.","html":"<p>Cela dit, la principale chose à retenir à propos des utilisateurs de k8s est qu’ils ne le font pas.\nexiste dans tout état persistant. Vous ne connectez pas k8 à un annuaire LDAP\nou Active Directory. Chaque demande doit attribuer une identité à K8 en une\nde multiples méthodes possibles. Je capitalise ASSERT car il deviendra\nimportant plus tard. La clé est de se rappeler que k8s ne s’authentifie pas\nutilisateurs; cela valide les assertions.</p>"},{"id":"text-5","type":"text","heading":"","plain_text":"Comptes de service","html":"<p>Comptes de service</p>"},{"id":"text-6","type":"text","heading":"","plain_text":"Les comptes de service sont les endroits où cette règle est légèrement déformée. C&#39;est vrai que k8s\nne stocke pas d&#39;informations sur les utilisateurs. Il stocke des comptes de service,\nqui ne sont pas destinés à représenter les gens. Ils sont censés représenter\ntout ce qui n&#39;est pas une personne. Tout ce qui interagit avec quelque chose\nsinon, dans k8s fonctionne comme un compte de service. Par exemple, si vous deviez\nsoumettre un pod très basique:","html":"<p>Les comptes de service sont les endroits où cette règle est légèrement déformée. C&#039;est vrai que k8s\nne stocke pas d&#039;informations sur les utilisateurs. Il stocke des comptes de service,\nqui ne sont pas destinés à représenter les gens. Ils sont censés représenter\ntout ce qui n&#039;est pas une personne. Tout ce qui interagit avec quelque chose\nsinon, dans k8s fonctionne comme un compte de service. Par exemple, si vous deviez\nsoumettre un pod très basique:</p>"},{"id":"text-7","type":"text","heading":"","plain_text":"apiVersion: v1\ngenre: Pod\nmétadonnées:\n  nom: myapp-pod\n  Étiquettes:\n    app: myapp\nspec:\n  conteneurs:\n  - nom: myapp-container\n    image: busybox\n    commander: ['sh', '-c', 'echo Hello Kubernetes!\n     ↪&& sleep 3600']","html":"<p>apiVersion: v1\ngenre: Pod\nmétadonnées:\n  nom: myapp-pod\n  Étiquettes:\n    app: myapp\nspec:\n  conteneurs:\n  - nom: myapp-container\n    image: busybox\n    commander: [&#039;sh&#039;, &#039;-c&#039;, &#039;echo Hello Kubernetes!\n     ↪&amp;&amp; sleep 3600&#039;]</p>"},{"id":"text-8","type":"text","heading":"","plain_text":"Et puis regardez-le dans K8S après le déploiement en exécutant kubectl get pod\nmyapp-pod -o yaml:","html":"<p>Et puis regardez-le dans K8S après le déploiement en exécutant kubectl get pod\nmyapp-pod -o yaml:</p>"},{"id":"text-9","type":"text","heading":"","plain_text":"apiVersion: v1\ngenre: Pod\nmétadonnées:\n  creationTimestamp: 2018-12-25T19: 17: 53Z\n  Étiquettes:\n    app: myapp\n  nom: myapp-pod\n  namespace: default\n  resourceVersion: &quot;12499217&quot;\n  selfLink: / api / v1 / espaces de noms / default / pods / myapp-pod\n  uid: c6dd5181-0879-11e9-a289-525400616039\nspec:\n  conteneurs:\n  - commande:\n    - sh\n    - -c\n    - echo Bonjour Kubernetes! &amp;&amp; sommeil 3600\n    image: busybox\n    imagePullPolicy: toujours\n    nom: myapp-container\n.\n.\n.\n    volumeMounts:\n    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount\n      nom: default-token-bjzd4\n      readOnly: true\n.\n.\n.\n  serviceAccount: par défaut\n  serviceAccountName: default\n  .\n  .\n  .","html":"<p>apiVersion: v1\ngenre: Pod\nmétadonnées:\n  creationTimestamp: 2018-12-25T19: 17: 53Z\n  Étiquettes:\n    app: myapp\n  nom: myapp-pod\n  namespace: default\n  resourceVersion: &quot;12499217&quot;\n  selfLink: / api / v1 / espaces de noms / default / pods / myapp-pod\n  uid: c6dd5181-0879-11e9-a289-525400616039\nspec:\n  conteneurs:\n  - commande:\n    - sh\n    - -c\n    - echo Bonjour Kubernetes! &amp;&amp; sommeil 3600\n    image: busybox\n    imagePullPolicy: toujours\n    nom: myapp-container\n.\n.\n.\n    volumeMounts:\n    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount\n      nom: default-token-bjzd4\n      readOnly: true\n.\n.\n.\n  serviceAccount: par défaut\n  serviceAccountName: default\n  .\n  .\n  .</p>"},{"id":"text-10","type":"text","heading":"","plain_text":"Vous remarquerez qu&#39;il y a un serviceAccount et\nserviceAccountName attribut,\nqui sont tous deux défaut. Ce compte de service est injecté pour\nvous par la chaîne de contrôleur d&#39;admission. Vous pouvez définir votre propre service\ncompte sur les pods, mais c’est pour un article ultérieur sur l’autorisation dans k8s.\nPour l&#39;instant, je veux expliquer ce qu&#39;est un compte de service pour le distinguer\nà partir d&#39;un compte d&#39;utilisateur.","html":"<p>Vous remarquerez qu&#039;il y a un serviceAccount et\nserviceAccountName attribut,\nqui sont tous deux défaut. Ce compte de service est injecté pour\nvous par la chaîne de contrôleur d&#039;admission. Vous pouvez définir votre propre service\ncompte sur les pods, mais c’est pour un article ultérieur sur l’autorisation dans k8s.\nPour l&#039;instant, je veux expliquer ce qu&#039;est un compte de service pour le distinguer\nà partir d&#039;un compte d&#039;utilisateur.</p>"},{"id":"text-11","type":"text","heading":"","plain_text":"Il est tentant d&#39;utiliser des comptes de service pour représenter des personnes. Ils sont simples\npour créer et facile à utiliser. Ils souffrent cependant de multiples inconvénients:","html":"<p>Il est tentant d&#039;utiliser des comptes de service pour représenter des personnes. Ils sont simples\npour créer et facile à utiliser. Ils souffrent cependant de multiples inconvénients:</p>"},{"id":"text-12","type":"text","heading":"","plain_text":"Le jeton d&#39;un compte de service est une longue chaîne dont aucun humain ne peut se souvenir,\ndonc il sera probablement écrit, ce qui peut être exploité si pas fait\ncorrectement.","html":"<p>Le jeton d&#039;un compte de service est une longue chaîne dont aucun humain ne peut se souvenir,\ndonc il sera probablement écrit, ce qui peut être exploité si pas fait\ncorrectement.</p>"},{"id":"text-13","type":"text","heading":"","plain_text":"Le seul moyen d&#39;autoriser les comptes de service est via des liaisons RBAC\ndirectement. (Je prévois d’entrer dans les détails dans un prochain article,\nmais imaginez avoir 2 000 développeurs pour suivre des dizaines de\nLes espaces de noms ont tous leurs propres politiques. L&#39;audit sera un cauchemar.)","html":"<p>Le seul moyen d&#039;autoriser les comptes de service est via des liaisons RBAC\ndirectement. (Je prévois d’entrer dans les détails dans un prochain article,\nmais imaginez avoir 2 000 développeurs pour suivre des dizaines de\nLes espaces de noms ont tous leurs propres politiques. L&#039;audit sera un cauchemar.)</p>"},{"id":"text-14","type":"text","heading":"","plain_text":"Les comptes de service n&#39;ont pas d&#39;expiration, donc s&#39;il y a une fuite et personne\nsait, on peut en abuser continuellement jusqu&#39;à ce qu&#39;on le découvre.","html":"<p>Les comptes de service n&#039;ont pas d&#039;expiration, donc s&#039;il y a une fuite et personne\nsait, on peut en abuser continuellement jusqu&#039;à ce qu&#039;on le découvre.</p>"},{"id":"text-15","type":"text","heading":"","plain_text":"Si votre application s&#39;exécute dans un pod et doit parler au serveur d&#39;API,\nvous pouvez récupérer le compte de service du pod via un secret monté\nà votre pod. Si vous regardez le yaml ci-dessus, vous verrez un montage de volume\na été ajouté à /var/run/secrets/kubernetes.io/serviceaccount où\nIl existe un fichier de jeton contenant le jeton du compte de service du pod.\nN&#39;intégrez pas de jetons de compte de service en tant que secrets ou configuration pour une\npod fonctionnant dans le cluster, car il est plus difficile d’utiliser la rotation\njetons et est généralement plus difficile à gérer.","html":"<p>Si votre application s&#039;exécute dans un pod et doit parler au serveur d&#039;API,\nvous pouvez récupérer le compte de service du pod via un secret monté\nà votre pod. Si vous regardez le yaml ci-dessus, vous verrez un montage de volume\na été ajouté à /var/run/secrets/kubernetes.io/serviceaccount où\nIl existe un fichier de jeton contenant le jeton du compte de service du pod.\nN&#039;intégrez pas de jetons de compte de service en tant que secrets ou configuration pour une\npod fonctionnant dans le cluster, car il est plus difficile d’utiliser la rotation\njetons et est généralement plus difficile à gérer.</p>"},{"id":"text-16","type":"text","heading":"","plain_text":"Comptes utilisateur","html":"<p>Comptes utilisateur</p>"},{"id":"text-17","type":"text","heading":"","plain_text":"J&#39;ai déjà mentionné que k8s ne se connecte à aucun type de magasin d&#39;utilisateurs (pas\ndirectement au moins). Cela signifie qu&#39;à chaque demande, vous devez fournir\nsuffisamment d’informations pour que k8s valide l’appelant. K8s ne se soucie pas comment\nvous établissez l&#39;identité, il se soucie seulement de savoir comment prouver que l&#39;identité est valide.\nPlusieurs mécanismes existent pour le faire. Je couvre le\nle plus populaire ici.","html":"<p>J&#039;ai déjà mentionné que k8s ne se connecte à aucun type de magasin d&#039;utilisateurs (pas\ndirectement au moins). Cela signifie qu&#039;à chaque demande, vous devez fournir\nsuffisamment d’informations pour que k8s valide l’appelant. K8s ne se soucie pas comment\nvous établissez l&#039;identité, il se soucie seulement de savoir comment prouver que l&#039;identité est valide.\nPlusieurs mécanismes existent pour le faire. Je couvre le\nle plus populaire ici.</p>"},{"id":"text-18","type":"text","heading":"","plain_text":"Comment Kubernetes sait qui vous êtes","html":"<p>Comment Kubernetes sait qui vous êtes</p>"},{"id":"text-19","type":"text","heading":"","plain_text":"OpenID Connect","html":"<p>OpenID Connect</p>"},{"id":"text-20","type":"text","heading":"","plain_text":"C’est l’option que vous devriez utiliser (à l’exception du cloud\nsolution basée sur le fournisseur pour une distribution gérée) pour authentifier les utilisateurs.","html":"<p>C’est l’option que vous devriez utiliser (à l’exception du cloud\nsolution basée sur le fournisseur pour une distribution gérée) pour authentifier les utilisateurs.</p>"},{"id":"text-21","type":"text","heading":"","plain_text":"Les jetons OpenID Connect peuvent être de très courte durée, donc s&#39;ils sont interceptés\net exfiltré, au moment où les attaquants savent ce qu&#39;ils ont, le jeton\nest inutile.","html":"<p>Les jetons OpenID Connect peuvent être de très courte durée, donc s&#039;ils sont interceptés\net exfiltré, au moment où les attaquants savent ce qu&#039;ils ont, le jeton\nest inutile.</p>"},{"id":"text-22","type":"text","heading":"","plain_text":"Utiliser OpenID Connect, k8s jamais a les informations d&#39;identification de l&#39;utilisateur, il est donc\nimpossible de faire fuir quelque chose qu&#39;il n&#39;a pas.","html":"<p>Utiliser OpenID Connect, k8s jamais a les informations d&#039;identification de l&#039;utilisateur, il est donc\nimpossible de faire fuir quelque chose qu&#039;il n&#039;a pas.</p>"},{"id":"text-23","type":"text","heading":"","plain_text":"Une identité d’utilisateur présentée par OpenID Connect peut fournir non seulement\ninformations de nom d&#39;utilisateur, mais aussi informations de groupe. Cela fait beaucoup\ngestion plus facile des accès via un annuaire LDAP ou une base de données externe\nsans avoir à créer des liaisons RBAC pour des utilisateurs individuels.","html":"<p>Une identité d’utilisateur présentée par OpenID Connect peut fournir non seulement\ninformations de nom d&#039;utilisateur, mais aussi informations de groupe. Cela fait beaucoup\ngestion plus facile des accès via un annuaire LDAP ou une base de données externe\nsans avoir à créer des liaisons RBAC pour des utilisateurs individuels.</p>"},{"id":"text-24","type":"text","heading":"","plain_text":"En ajoutant un &quot;proxy&quot; entre k8s et la couche d&#39;identité, il permet\nil est plus facile d&#39;ajouter plusieurs types d&#39;authentification, tels que le multi-facteur\nauthentification.","html":"<p>En ajoutant un &quot;proxy&quot; entre k8s et la couche d&#039;identité, il permet\nil est plus facile d&#039;ajouter plusieurs types d&#039;authentification, tels que le multi-facteur\nauthentification.</p>"},{"id":"text-25","type":"text","heading":"","plain_text":"Une pléthore d&#39;implémentations open source OpenID Connect\ntravaillera avec k8s.","html":"<p>Une pléthore d&#039;implémentations open source OpenID Connect\ntravaillera avec k8s.</p>"},{"id":"text-26","type":"text","heading":"","plain_text":"OpenID Connect Primer\nAvant d’explorer comment travailler avec OpenID Connect, laissez-moi vous expliquer.\nle protocole. Il y a deux concepts de base à comprendre avec\nOpenID Connect:","html":"<p>OpenID Connect Primer\nAvant d’explorer comment travailler avec OpenID Connect, laissez-moi vous expliquer.\nle protocole. Il y a deux concepts de base à comprendre avec\nOpenID Connect:</p>"},{"id":"text-27","type":"text","heading":"","plain_text":"OpenID Connect est un protocole de génération d&#39;assertions construit sur le dessus\nde OAuth2.","html":"<p>OpenID Connect est un protocole de génération d&#039;assertions construit sur le dessus\nde OAuth2.</p>"},{"id":"text-28","type":"text","heading":"","plain_text":"OAuth2 est un protocole d&#39;autorisation permettant de transférer des jetons au porteur.","html":"<p>OAuth2 est un protocole d&#039;autorisation permettant de transférer des jetons au porteur.</p>"},{"id":"text-29","type":"text","heading":"","plain_text":"Il semble qu&#39;il manque un mot dans ces deux points:\nauthentification! C&#39;est parce que OpenID Connect n&#39;est pas une authentification\nprotocole. Peu importe comment vous vous authentifiez. Peu importe si\nl&#39;utilisateur connecté avec un nom d&#39;utilisateur et un mot de passe, une carte à puce ou tout simplement\nregardé vraiment digne de confiance. OpenID Connect est un protocole permettant de générer,\nrécupérer et actualiser des assertions concernant un utilisateur. Il y a aussi\ncertaines normes sur ce à quoi l&#39;assertion ressemble, mais comment l&#39;utilisateur\nauthentifie est finalement à la mise en œuvre OpenID Connect.","html":"<p>Il semble qu&#039;il manque un mot dans ces deux points:\nauthentification! C&#039;est parce que OpenID Connect n&#039;est pas une authentification\nprotocole. Peu importe comment vous vous authentifiez. Peu importe si\nl&#039;utilisateur connecté avec un nom d&#039;utilisateur et un mot de passe, une carte à puce ou tout simplement\nregardé vraiment digne de confiance. OpenID Connect est un protocole permettant de générer,\nrécupérer et actualiser des assertions concernant un utilisateur. Il y a aussi\ncertaines normes sur ce à quoi l&#039;assertion ressemble, mais comment l&#039;utilisateur\nauthentifie est finalement à la mise en œuvre OpenID Connect.</p>"},{"id":"text-30","type":"text","heading":"","plain_text":"Le deuxième point sur OAuth2 est important car ces deux protocoles\nsont souvent confondus les uns avec les autres ou mal représentés. OAuth2 est un\nprotocole de transfert de jetons. Il ne définit pas ce que le jeton est\nou comment il devrait être utilisé. Il définit simplement comment le jeton est passé\nentre porteurs et parties en instance.","html":"<p>Le deuxième point sur OAuth2 est important car ces deux protocoles\nsont souvent confondus les uns avec les autres ou mal représentés. OAuth2 est un\nprotocole de transfert de jetons. Il ne définit pas ce que le jeton est\nou comment il devrait être utilisé. Il définit simplement comment le jeton est passé\nentre porteurs et parties en instance.</p>"},{"id":"text-31","type":"text","heading":"","plain_text":"Comment Kubernetes fonctionne-t-il avec OpenID Connect?\nLa figure 1 montre le graphique des k8s authentification\npage.","html":"<p>Comment Kubernetes fonctionne-t-il avec OpenID Connect?\nLa figure 1 montre le graphique des k8s authentification\npage.</p>"},{"id":"text-32","type":"text","heading":"","plain_text":"Figure 1. Open8 Connect Flow de k8s","html":"<p>Figure 1. Open8 Connect Flow de k8s</p>"},{"id":"text-33","type":"text","heading":"","plain_text":"Je ne vais pas répéter les mots exacts du site, mais voici les\nbases:","html":"<p>Je ne vais pas répéter les mots exacts du site, mais voici les\nbases:</p>"},{"id":"text-34","type":"text","heading":"","plain_text":"L&#39;utilisateur se connecte au fournisseur d&#39;identité de l&#39;utilisateur.","html":"<p>L&#039;utilisateur se connecte au fournisseur d&#039;identité de l&#039;utilisateur.</p>"},{"id":"text-35","type":"text","heading":"","plain_text":"Le fournisseur d&#39;identité génère un id_token et un\nrefresh_token.","html":"<p>Le fournisseur d&#039;identité génère un id_token et un\nrefresh_token.</p>"},{"id":"text-36","type":"text","heading":"","plain_text":"le id_token est utilisé pour affirmer l&#39;identité de l&#39;utilisateur à k8s.","html":"<p>le id_token est utilisé pour affirmer l&#039;identité de l&#039;utilisateur à k8s.</p>"},{"id":"text-37","type":"text","heading":"","plain_text":"Quand le id_token a expiré, le refresh_token est utilisé pour\ngénérer un nouveau id_token.","html":"<p>Quand le id_token a expiré, le refresh_token est utilisé pour\ngénérer un nouveau id_token.</p>"},{"id":"text-38","type":"text","heading":"","plain_text":"Un id_token est un jeton Web JSON (JWT) qui dit:","html":"<p>Un id_token est un jeton Web JSON (JWT) qui dit:</p>"},{"id":"text-39","type":"text","heading":"","plain_text":"Qui est l&#39;utilisateur?","html":"<p>Qui est l&#039;utilisateur?</p>"},{"id":"text-40","type":"text","heading":"","plain_text":"À quels groupes l&#39;utilisateur appartient-il (facultativement)?","html":"<p>À quels groupes l&#039;utilisateur appartient-il (facultativement)?</p>"},{"id":"text-41","type":"text","heading":"","plain_text":"Combien de temps le jeton est valide.","html":"<p>Combien de temps le jeton est valide.</p>"},{"id":"text-42","type":"text","heading":"","plain_text":"Et, il contient une signature numérique pour valider que le JWT n&#39;a pas été\naltéré.","html":"<p>Et, il contient une signature numérique pour valider que le JWT n&#039;a pas été\naltéré.</p>"},{"id":"text-43","type":"text","heading":"","plain_text":"L&#39;attribut id de l&#39;utilisateur, sous, est généralement l&#39;identifiant unique de l&#39;utilisateur.\nIl est courant d&#39;utiliser l&#39;identifiant de connexion d&#39;Active Directory (ou samAccountName), ou\nde nombreux développeurs préfèrent utiliser une adresse électronique. En général, ce n&#39;est pas\nla meilleure pratique. L&#39;identifiant d&#39;un utilisateur doit être à la fois unique et immuable.\nBien qu’une adresse électronique soit unique, elle n’est pas toujours immuable (par exemple, parfois\ndes noms\nchangement).","html":"<p>L&#039;attribut id de l&#039;utilisateur, sous, est généralement l&#039;identifiant unique de l&#039;utilisateur.\nIl est courant d&#039;utiliser l&#039;identifiant de connexion d&#039;Active Directory (ou samAccountName), ou\nde nombreux développeurs préfèrent utiliser une adresse électronique. En général, ce n&#039;est pas\nla meilleure pratique. L&#039;identifiant d&#039;un utilisateur doit être à la fois unique et immuable.\nBien qu’une adresse électronique soit unique, elle n’est pas toujours immuable (par exemple, parfois\ndes noms\nchangement).</p>"},{"id":"text-44","type":"text","heading":"","plain_text":"Le JWT est transmis à chaque demande de Kubectl à k8s. le\nid_token\nest appelé &quot;jeton porteur&quot;, car il donne au porteur l&#39;accès\nsans aucun contrôle supplémentaire. Cela signifie que si un système dans le\nflux d&#39;un appel d&#39;API, tel qu&#39;un proxy de service, validant webhook\nwebhook en mutation &#8211; devaient laisser échapper ce jeton, il pourrait être abusé par un\nattaquant. Parce que ces jetons sont si facilement maltraités, ils devraient avoir\ndurée de vie très courte. Je recommande une minute. De cette façon, si un jeton\nest exfiltré au moment où quelqu&#39;un le voit, sait ce que c&#39;est et est\ncapable de l&#39;utiliser, le jeton a expiré et est donc inutile. Lors de l&#39;utilisation\nces jetons de courte durée, il est important de configurer un\nrefresh_token\npour mettre à jour votre id_token après son expiration.","html":"<p>Le JWT est transmis à chaque demande de Kubectl à k8s. le\nid_token\nest appelé &quot;jeton porteur&quot;, car il donne au porteur l&#039;accès\nsans aucun contrôle supplémentaire. Cela signifie que si un système dans le\nflux d&#039;un appel d&#039;API, tel qu&#039;un proxy de service, validant webhook\nwebhook en mutation &#8211; devaient laisser échapper ce jeton, il pourrait être abusé par un\nattaquant. Parce que ces jetons sont si facilement maltraités, ils devraient avoir\ndurée de vie très courte. Je recommande une minute. De cette façon, si un jeton\nest exfiltré au moment où quelqu&#039;un le voit, sait ce que c&#039;est et est\ncapable de l&#039;utiliser, le jeton a expiré et est donc inutile. Lors de l&#039;utilisation\nces jetons de courte durée, il est important de configurer un\nrefresh_token\npour mettre à jour votre id_token après son expiration.</p>"},{"id":"text-45","type":"text","heading":"","plain_text":"Kubectl sait comment rafraîchir la id_token jeton en utilisant le\nrefresh_token appeler l&#39;URL du service d&#39;autorisation du fournisseur d&#39;identité.\nle refresh_token est un jeton que le serveur API du k8s n&#39;utilise jamais et\ndoit être traité comme un secret par l&#39;utilisateur. Ce jeton est utilisé pour obtenir un\nnouveau JWT, à quel point un nouveau refresh_token est disponible. Où le\nid_token devrait avoir une durée de vie très courte, le\nrefresh_token\ntimeout doit être similaire à un délai d&#39;inactivité, généralement compris entre 15 et 20.\nminutes. De cette façon, la mise en œuvre de votre K8 sera conforme à\nles stratégies de votre entreprise se concentrent sur les délais d&#39;inactivité. Utilisant un\nrefresh_token pour obtenir un nouveau id_token est plus sécurisé\nqu&#39;une vie plus longue\nid_token parce que le refresh_token signifie le\nSuivant:","html":"<p>Kubectl sait comment rafraîchir la id_token jeton en utilisant le\nrefresh_token appeler l&#039;URL du service d&#039;autorisation du fournisseur d&#039;identité.\nle refresh_token est un jeton que le serveur API du k8s n&#039;utilise jamais et\ndoit être traité comme un secret par l&#039;utilisateur. Ce jeton est utilisé pour obtenir un\nnouveau JWT, à quel point un nouveau refresh_token est disponible. Où le\nid_token devrait avoir une durée de vie très courte, le\nrefresh_token\ntimeout doit être similaire à un délai d&#039;inactivité, généralement compris entre 15 et 20.\nminutes. De cette façon, la mise en œuvre de votre K8 sera conforme à\nles stratégies de votre entreprise se concentrent sur les délais d&#039;inactivité. Utilisant un\nrefresh_token pour obtenir un nouveau id_token est plus sécurisé\nqu&#039;une vie plus longue\nid_token parce que le refresh_token signifie le\nSuivant:</p>"},{"id":"text-46","type":"text","heading":"","plain_text":"Il ne peut être utilisé qu&#39;une seule fois. une fois qu&#39;il est utilisé, un nouveau est généré.","html":"<p>Il ne peut être utilisé qu&#039;une seule fois. une fois qu&#039;il est utilisé, un nouveau est généré.</p>"},{"id":"text-47","type":"text","heading":"","plain_text":"Il est uniquement transmis entre l&#39;utilisateur et le fournisseur d&#39;identité,\nil y a donc beaucoup moins d&#39;acteurs qui pourraient potentiellement la laisser couler.","html":"<p>Il est uniquement transmis entre l&#039;utilisateur et le fournisseur d&#039;identité,\nil y a donc beaucoup moins d&#039;acteurs qui pourraient potentiellement la laisser couler.</p>"},{"id":"text-48","type":"text","heading":"","plain_text":"Il ne vous identifie pas; s&#39;il est exfiltré seul, il ne peut pas être utilisé\npour vous identifier car il est opaque, afin qu&#39;un attaquant ne sache pas quoi\nfaire avec sans informations supplémentaires.","html":"<p>Il ne vous identifie pas; s&#039;il est exfiltré seul, il ne peut pas être utilisé\npour vous identifier car il est opaque, afin qu&#039;un attaquant ne sache pas quoi\nfaire avec sans informations supplémentaires.</p>"},{"id":"text-49","type":"text","heading":"","plain_text":"Le tableau de bord Kubernetes\nLe tableau de bord ne dispose pas de son propre système de connexion. Tout ce qu&#39;il peut faire utilise un\njeton existant agissant au nom de l&#39;utilisateur. Cela signifie souvent mettre un\nproxy inverse devant le tableau de bord qui injectera le\nid_token\nsur chaque demande. Le proxy inverse est alors responsable de l&#39;actualisation\nle jeton au besoin.","html":"<p>Le tableau de bord Kubernetes\nLe tableau de bord ne dispose pas de son propre système de connexion. Tout ce qu&#039;il peut faire utilise un\njeton existant agissant au nom de l&#039;utilisateur. Cela signifie souvent mettre un\nproxy inverse devant le tableau de bord qui injectera le\nid_token\nsur chaque demande. Le proxy inverse est alors responsable de l&#039;actualisation\nle jeton au besoin.</p>"},{"id":"text-50","type":"text","heading":"","plain_text":"Quel fournisseur d&#39;identité devrais-je utiliser?\nLors du choix d&#39;un fournisseur d&#39;identité, k8s n&#39;a en réalité que deux exigences:","html":"<p>Quel fournisseur d&#039;identité devrais-je utiliser?\nLors du choix d&#039;un fournisseur d&#039;identité, k8s n&#039;a en réalité que deux exigences:</p>"},{"id":"text-51","type":"text","heading":"","plain_text":"Il doit supporte la découverte OpenID Connect.","html":"<p>Il doit supporte la découverte OpenID Connect.</p>"},{"id":"text-52","type":"text","heading":"","plain_text":"Il fournit un mécanisme pour générer des jetons et les injecter dans votre\n~ / .kube / config.","html":"<p>Il fournit un mécanisme pour générer des jetons et les injecter dans votre\n~ / .kube / config.</p>"},{"id":"text-53","type":"text","heading":"","plain_text":"C&#39;est à peu près ça! La découverte est importante car elle vous garde\nd&#39;avoir à dire à K8 où les différentes URL sont manuellement, quelles sont les clés\nsont utilisés pour la signature et ainsi de suite. Il est beaucoup plus facile de pointer le k8s vers une découverte\nURL qui contient toutes ces informations. C’est une norme commune, et la plupart\nLes fournisseurs d&#39;identité le prennent en charge immédiatement.","html":"<p>C&#039;est à peu près ça! La découverte est importante car elle vous garde\nd&#039;avoir à dire à K8 où les différentes URL sont manuellement, quelles sont les clés\nsont utilisés pour la signature et ainsi de suite. Il est beaucoup plus facile de pointer le k8s vers une découverte\nURL qui contient toutes ces informations. C’est une norme commune, et la plupart\nLes fournisseurs d&#039;identité le prennent en charge immédiatement.</p>"},{"id":"text-54","type":"text","heading":"","plain_text":"Le point 2 est l&#39;endroit où les choses deviennent intéressantes. Il y a différentes écoles\nde penser à comment obtenir vos informations de jeton à partir de votre point de connexion\n(généralement un navigateur Web) dans votre ~ / .kube / config.","html":"<p>Le point 2 est l&#039;endroit où les choses deviennent intéressantes. Il y a différentes écoles\nde penser à comment obtenir vos informations de jeton à partir de votre point de connexion\n(généralement un navigateur Web) dans votre ~ / .kube / config.</p>"},{"id":"text-55","type":"text","heading":"","plain_text":"Injection de navigateur Web\nDans ce modèle, tout se concentre sur votre navigateur Web. Vous\ns&#39;authentifier via votre navigateur, puis des commandes sont fournies à\nconfigurez votre Kubectl client correctement. Par exemple, OpenUnison (notre propre projet)\nvous fournit une seule commande pour définir votre configuration de cluster\nune fois authentifié (Figure 2).","html":"<p>Injection de navigateur Web\nDans ce modèle, tout se concentre sur votre navigateur Web. Vous\ns&#039;authentifier via votre navigateur, puis des commandes sont fournies à\nconfigurez votre Kubectl client correctement. Par exemple, OpenUnison (notre propre projet)\nvous fournit une seule commande pour définir votre configuration de cluster\nune fois authentifié (Figure 2).</p>"},{"id":"text-56","type":"text","heading":"","plain_text":"Figure 2. Jeton de navigateur","html":"<p>Figure 2. Jeton de navigateur</p>"},{"id":"text-57","type":"text","heading":"","plain_text":"Tu utilises KubectlLa capacité intégrée de configurer le fichier de configuration à partir de\nla ligne de commande pour terminer la configuration.","html":"<p>Tu utilises KubectlLa capacité intégrée de configurer le fichier de configuration à partir de\nla ligne de commande pour terminer la configuration.</p>"},{"id":"text-58","type":"text","heading":"","plain_text":"Cette méthode a plusieurs avantages:","html":"<p>Cette méthode a plusieurs avantages:</p>"},{"id":"text-59","type":"text","heading":"","plain_text":"Les navigateurs ont le plus d&#39;options pour l&#39;authentification. En plus de\nnom d&#39;utilisateur et mot de passe, vous pouvez intégrer Kerberos, multi-facteurs, etc.","html":"<p>Les navigateurs ont le plus d&#039;options pour l&#039;authentification. En plus de\nnom d&#039;utilisateur et mot de passe, vous pouvez intégrer Kerberos, multi-facteurs, etc.</p>"},{"id":"text-60","type":"text","heading":"","plain_text":"Vous n&#39;avez pas besoin de gérer des configurations complexes de K8; ils sont gérés\npour vous.","html":"<p>Vous n&#039;avez pas besoin de gérer des configurations complexes de K8; ils sont gérés\npour vous.</p>"},{"id":"text-61","type":"text","heading":"","plain_text":"Cela fonctionne avec stock Kubectl commandes, donc il n&#39;y a rien de plus à déployer pour\npostes de travail.","html":"<p>Cela fonctionne avec stock Kubectl commandes, donc il n&#039;y a rien de plus à déployer pour\npostes de travail.</p>"},{"id":"text-62","type":"text","heading":"","plain_text":"Le plugin kubectl\nVous pouvez prolonger le Kubectl commande utilisant des plugins.\nÀ l&#39;aide d&#39;un plugin, vous pouvez collecter les informations d&#39;identification d&#39;un utilisateur, puis générer\nun jeton. J&#39;ai vu des plugins qui vont collecter vos identifiants\nla CLI et d’autres plug-ins qui lanceront un navigateur pour vous demander de\nun login. Cette méthode est bonne du point de vue de la CLI car elle permet à votre CLI\npilotez votre expérience utilisateur. L’inconvénient majeur de cette approche est-il\nnécessite l&#39;installation du plug-in sur chaque poste de travail.","html":"<p>Le plugin kubectl\nVous pouvez prolonger le Kubectl commande utilisant des plugins.\nÀ l&#039;aide d&#039;un plugin, vous pouvez collecter les informations d&#039;identification d&#039;un utilisateur, puis générer\nun jeton. J&#039;ai vu des plugins qui vont collecter vos identifiants\nla CLI et d’autres plug-ins qui lanceront un navigateur pour vous demander de\nun login. Cette méthode est bonne du point de vue de la CLI car elle permet à votre CLI\npilotez votre expérience utilisateur. L’inconvénient majeur de cette approche est-il\nnécessite l&#039;installation du plug-in sur chaque poste de travail.</p>"},{"id":"text-63","type":"text","heading":"","plain_text":"Télécharger la configuration\nAvec cette méthode, le fournisseur d’identité (ou une application personnalisée)\nvous fournit un fichier de configuration entièrement généré que vous pouvez télécharger.\nCela peut créer un problème de support si quelque chose n&#39;est pas enregistré dans\nau bon endroit.","html":"<p>Télécharger la configuration\nAvec cette méthode, le fournisseur d’identité (ou une application personnalisée)\nvous fournit un fichier de configuration entièrement généré que vous pouvez télécharger.\nCela peut créer un problème de support si quelque chose n&#039;est pas enregistré dans\nau bon endroit.</p>"},{"id":"text-64","type":"text","heading":"","plain_text":"Une fois que vous avez choisi un fournisseur d’identité, suivez ses instructions.\nl&#39;intégration. Les éléments clés d’importance sont l’URL de découverte, le\nl&#39;identifiant &quot;claim&quot; et la &quot;claim&quot; du groupe.","html":"<p>Une fois que vous avez choisi un fournisseur d’identité, suivez ses instructions.\nl&#039;intégration. Les éléments clés d’importance sont l’URL de découverte, le\nl&#039;identifiant &quot;claim&quot; et la &quot;claim&quot; du groupe.</p>"},{"id":"text-65","type":"text","heading":"","plain_text":"Certificats X509","html":"<p>Certificats X509</p>"},{"id":"text-66","type":"text","heading":"","plain_text":"L’authentification par certificat exploite la négociation TLS entre les\nclient (généralement le Kubectl commande) et le serveur API k8s\npour affirmer une identité en présentant un certificat au serveur API.\nÀ l&#39;exception d&#39;un cas d&#39;utilisation, cette méthode n&#39;est pas une &quot;meilleure pratique&quot;\net devrait être découragé pour plusieurs raisons:","html":"<p>L’authentification par certificat exploite la négociation TLS entre les\nclient (généralement le Kubectl commande) et le serveur API k8s\npour affirmer une identité en présentant un certificat au serveur API.\nÀ l&#039;exception d&#039;un cas d&#039;utilisation, cette méthode n&#039;est pas une &quot;meilleure pratique&quot;\net devrait être découragé pour plusieurs raisons:</p>"},{"id":"text-67","type":"text","heading":"","plain_text":"Les certificats ne peuvent pas être révoqués en k8. Vous devez soit attendre jusqu&#39;à\nle certificat a expiré ou ressaisissez l&#39;intégralité du cluster.","html":"<p>Les certificats ne peuvent pas être révoqués en k8. Vous devez soit attendre jusqu&#039;à\nle certificat a expiré ou ressaisissez l&#039;intégralité du cluster.</p>"},{"id":"text-68","type":"text","heading":"","plain_text":"La clé privée d&#39;un certificat doit jamais quitter le support sécurisé\noù c&#39;était\ngénéré. Habituellement, on vous &quot;donne&quot; une paire de clés et un certificat à utiliser.","html":"<p>La clé privée d&#039;un certificat doit jamais quitter le support sécurisé\noù c&#039;était\ngénéré. Habituellement, on vous &quot;donne&quot; une paire de clés et un certificat à utiliser.</p>"},{"id":"text-69","type":"text","heading":"","plain_text":"Il est difficile d&#39;utiliser des groupes avec des certificats. Vous devez les intégrer\ndans le sujet, et si ces groupes doivent changer, bien, voir n ° 1 ci-dessus.","html":"<p>Il est difficile d&#039;utiliser des groupes avec des certificats. Vous devez les intégrer\ndans le sujet, et si ces groupes doivent changer, bien, voir n ° 1 ci-dessus.</p>"},{"id":"text-70","type":"text","heading":"","plain_text":"La seule situation où vous devriez utiliser des certificats X509 pour\nl&#39;authentification est lorsque vous démarrez votre cluster ou en cas de\nurgence et votre fournisseur d&#39;identité n&#39;est pas disponible. La plupart des distributions\ndéployer une paire de clés sur chaque maître, donc si vous ssh dans ce maître, vous pouvez\nutilisation Kubectl gérer le cluster. Cela signifie que vous devez verrouiller\naccès au maître (je prévois de couvrir cela dans un prochain article).","html":"<p>La seule situation où vous devriez utiliser des certificats X509 pour\nl&#039;authentification est lorsque vous démarrez votre cluster ou en cas de\nurgence et votre fournisseur d&#039;identité n&#039;est pas disponible. La plupart des distributions\ndéployer une paire de clés sur chaque maître, donc si vous ssh dans ce maître, vous pouvez\nutilisation Kubectl gérer le cluster. Cela signifie que vous devez verrouiller\naccès au maître (je prévois de couvrir cela dans un prochain article).</p>"},{"id":"text-71","type":"text","heading":"","plain_text":"Webhooks","html":"<p>Webhooks</p>"},{"id":"text-72","type":"text","heading":"","plain_text":"Cette méthode vous permet d’intégrer une connexion tierce ou un système de jeton via\nun Webhook. Au lieu de dire à k8s comment valider une identité, k8s\nappelle un webhook et demande &quot;qui est-ce?&quot;","html":"<p>Cette méthode vous permet d’intégrer une connexion tierce ou un système de jeton via\nun Webhook. Au lieu de dire à k8s comment valider une identité, k8s\nappelle un webhook et demande &quot;qui est-ce?&quot;</p>"},{"id":"text-73","type":"text","heading":"","plain_text":"Ne le faites pas sauf si vous êtes un fournisseur de cloud et que vous avez votre propre identité.\nSolution. À peu près toutes les mises en œuvre que j&#39;ai vues de cela se transforment en\n&quot;passons les mots de passe&quot; ou un OpenID Connect mal pensé.","html":"<p>Ne le faites pas sauf si vous êtes un fournisseur de cloud et que vous avez votre propre identité.\nSolution. À peu près toutes les mises en œuvre que j&#039;ai vues de cela se transforment en\n&quot;passons les mots de passe&quot; ou un OpenID Connect mal pensé.</p>"},{"id":"text-74","type":"text","heading":"","plain_text":"Proxy inverse avec emprunt d&#39;identité","html":"<p>Proxy inverse avec emprunt d&#039;identité</p>"},{"id":"text-75","type":"text","heading":"","plain_text":"Ici, le client (kubectl ou autre) ne communique pas avec l&#39;API\nserveur directement. Au lieu de cela, il communique avec un proxy inverse, qui\ninjecte des en-têtes dans la requête pour représenter l&#39;utilisateur. C&#39;est souvent\nsouligné comme un moyen de gérer les scénarios d’authentification avancée,\ncela demande le moins de travail possible du point de vue du serveur d&#39;API.\nLes étapes de la mise en œuvre sont les suivantes:","html":"<p>Ici, le client (kubectl ou autre) ne communique pas avec l&#039;API\nserveur directement. Au lieu de cela, il communique avec un proxy inverse, qui\ninjecte des en-têtes dans la requête pour représenter l&#039;utilisateur. C&#039;est souvent\nsouligné comme un moyen de gérer les scénarios d’authentification avancée,\ncela demande le moins de travail possible du point de vue du serveur d&#039;API.\nLes étapes de la mise en œuvre sont les suivantes:</p>"},{"id":"text-76","type":"text","heading":"","plain_text":"Créez un compte de service.","html":"<p>Créez un compte de service.</p>"},{"id":"text-77","type":"text","heading":"","plain_text":"Autorisez le compte de service à effectuer l&#39;emprunt d&#39;identité.","html":"<p>Autorisez le compte de service à effectuer l&#039;emprunt d&#039;identité.</p>"},{"id":"text-78","type":"text","heading":"","plain_text":"Configurez un proxy inverse pour injecter le compte de service et\nen-têtes d&#39;emprunt d&#39;identité dans chaque demande.","html":"<p>Configurez un proxy inverse pour injecter le compte de service et\nen-têtes d&#039;emprunt d&#039;identité dans chaque demande.</p>"},{"id":"text-79","type":"text","heading":"","plain_text":"Cette solution fournit ces problèmes ainsi que les mêmes pièges que Webhooks.\nIl est fort probable que les normes existantes satisferont vos besoins et seront plus faciles à\ngérer et maintenir.","html":"<p>Cette solution fournit ces problèmes ainsi que les mêmes pièges que Webhooks.\nIl est fort probable que les normes existantes satisferont vos besoins et seront plus faciles à\ngérer et maintenir.</p>"},{"id":"text-80","type":"text","heading":"","plain_text":"Le tirer ensemble\nPour intégrer l&#39;identité dans les k8, suivez cette liste de contrôle de base:","html":"<p>Le tirer ensemble\nPour intégrer l&#039;identité dans les k8, suivez cette liste de contrôle de base:</p>"},{"id":"text-81","type":"text","heading":"","plain_text":"Utilisez les comptes de service uniquement pour les systèmes, pas pour les utilisateurs.","html":"<p>Utilisez les comptes de service uniquement pour les systèmes, pas pour les utilisateurs.</p>"},{"id":"text-82","type":"text","heading":"","plain_text":"Utilisez OpenID Connect pour les personnes; il est bien vérifié et soutenu par\nplusieurs systèmes, à la fois open-source et propriétaires.","html":"<p>Utilisez OpenID Connect pour les personnes; il est bien vérifié et soutenu par\nplusieurs systèmes, à la fois open-source et propriétaires.</p>"},{"id":"text-83","type":"text","heading":"","plain_text":"Utilisez l&#39;authentification par certificat uniquement pour &quot;briser le verre en cas de\nsituations d&#39;urgence.","html":"<p>Utilisez l&#039;authentification par certificat uniquement pour &quot;briser le verre en cas de\nsituations d&#039;urgence.</p>"},{"id":"text-84","type":"text","heading":"","plain_text":"Suivez ces règles et vous constaterez que vos développeurs sont heureux de\navoir un mot de passe de moins à retenir, et votre équipe de sécurité sera heureuse\nvous suivez les meilleures pratiques et les exigences de conformité.","html":"<p>Suivez ces règles et vous constaterez que vos développeurs sont heureux de\navoir un mot de passe de moins à retenir, et votre équipe de sécurité sera heureuse\nvous suivez les meilleures pratiques et les exigences de conformité.</p>"},{"id":"text-85","type":"text","heading":"","plain_text":"Ressources","html":"<p>Ressources</p>"},{"id":"text-86","type":"text","heading":"","plain_text":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]","html":"<p>Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]</p>"}],"sections":[{"id":"text-1","heading":"Text","content":"Vous avez déployé Kubernetes, mais maintenant, comment allez-vous le mettre entre les mains de\nvos développeurs et administrateurs en toute sécurité?\nKubernetes a pris d&#39;assaut le monde. En quelques années, Kubernetes\n(aka k8s) est passé d&#39;un projet intéressant à un moteur de la technologie\net l&#39;innovation. L’un des moyens les plus simples d’illustrer ce point est\nla différence de fréquentation dans les deux fois KubeCon Amérique du Nord a\nété à Seattle. Il y a deux ans, c&#39;était dans un hôtel avec moins de 20\ncabines de vendeurs. Cette année, c’était au Seattle Convention Center avec\n8 000 participants et plus de 100 fournisseurs!"},{"id":"text-2","heading":"Text","content":"Comme avec tout autre système complexe, k8s a son propre modèle de sécurité et\ndoit interagir avec les utilisateurs et les autres systèmes. Dans cet article,\nJe passe en revue les différentes options d’authentification et\nfournir des exemples et des conseils de mise en œuvre sur la façon dont vous devriez gérer\naccès à votre cluster."},{"id":"text-3","heading":"Text","content":"Qu&#39;est-ce que l&#39;identité signifie pour Kubernetes?\nLa première chose à demander est &quot;qu&#39;est-ce qu&#39;une identité?&quot; en k8s. K8s est très\ndifférent de la plupart des autres systèmes et applications. C&#39;est un ensemble d&#39;API.\nIl n&#39;y a pas d &#39;&quot;interface Web&quot; (je discute du tableau de bord plus tard dans cet article).\nIl n&#39;y a aucun intérêt à &quot;se connecter&quot;. Il n&#39;y a pas de &quot;session&quot; ou de &quot;timeout&quot;.\nChaque demande d&#39;API est unique et distincte, et elle doit tout contenir\nk8s doit s&#39;authentifier et autoriser la demande."},{"id":"text-4","heading":"Text","content":"Cela dit, la principale chose à retenir à propos des utilisateurs de k8s est qu’ils ne le font pas.\nexiste dans tout état persistant. Vous ne connectez pas k8 à un annuaire LDAP\nou Active Directory. Chaque demande doit attribuer une identité à K8 en une\nde multiples méthodes possibles. Je capitalise ASSERT car il deviendra\nimportant plus tard. La clé est de se rappeler que k8s ne s’authentifie pas\nutilisateurs; cela valide les assertions."},{"id":"text-5","heading":"Text","content":"Comptes de service"},{"id":"text-6","heading":"Text","content":"Les comptes de service sont les endroits où cette règle est légèrement déformée. C&#39;est vrai que k8s\nne stocke pas d&#39;informations sur les utilisateurs. Il stocke des comptes de service,\nqui ne sont pas destinés à représenter les gens. Ils sont censés représenter\ntout ce qui n&#39;est pas une personne. Tout ce qui interagit avec quelque chose\nsinon, dans k8s fonctionne comme un compte de service. Par exemple, si vous deviez\nsoumettre un pod très basique:"},{"id":"text-7","heading":"Text","content":"apiVersion: v1\ngenre: Pod\nmétadonnées:\n  nom: myapp-pod\n  Étiquettes:\n    app: myapp\nspec:\n  conteneurs:\n  - nom: myapp-container\n    image: busybox\n    commander: ['sh', '-c', 'echo Hello Kubernetes!\n     ↪&& sleep 3600']"},{"id":"text-8","heading":"Text","content":"Et puis regardez-le dans K8S après le déploiement en exécutant kubectl get pod\nmyapp-pod -o yaml:"},{"id":"text-9","heading":"Text","content":"apiVersion: v1\ngenre: Pod\nmétadonnées:\n  creationTimestamp: 2018-12-25T19: 17: 53Z\n  Étiquettes:\n    app: myapp\n  nom: myapp-pod\n  namespace: default\n  resourceVersion: &quot;12499217&quot;\n  selfLink: / api / v1 / espaces de noms / default / pods / myapp-pod\n  uid: c6dd5181-0879-11e9-a289-525400616039\nspec:\n  conteneurs:\n  - commande:\n    - sh\n    - -c\n    - echo Bonjour Kubernetes! &amp;&amp; sommeil 3600\n    image: busybox\n    imagePullPolicy: toujours\n    nom: myapp-container\n.\n.\n.\n    volumeMounts:\n    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount\n      nom: default-token-bjzd4\n      readOnly: true\n.\n.\n.\n  serviceAccount: par défaut\n  serviceAccountName: default\n  .\n  .\n  ."},{"id":"text-10","heading":"Text","content":"Vous remarquerez qu&#39;il y a un serviceAccount et\nserviceAccountName attribut,\nqui sont tous deux défaut. Ce compte de service est injecté pour\nvous par la chaîne de contrôleur d&#39;admission. Vous pouvez définir votre propre service\ncompte sur les pods, mais c’est pour un article ultérieur sur l’autorisation dans k8s.\nPour l&#39;instant, je veux expliquer ce qu&#39;est un compte de service pour le distinguer\nà partir d&#39;un compte d&#39;utilisateur."},{"id":"text-11","heading":"Text","content":"Il est tentant d&#39;utiliser des comptes de service pour représenter des personnes. Ils sont simples\npour créer et facile à utiliser. Ils souffrent cependant de multiples inconvénients:"},{"id":"text-12","heading":"Text","content":"Le jeton d&#39;un compte de service est une longue chaîne dont aucun humain ne peut se souvenir,\ndonc il sera probablement écrit, ce qui peut être exploité si pas fait\ncorrectement."},{"id":"text-13","heading":"Text","content":"Le seul moyen d&#39;autoriser les comptes de service est via des liaisons RBAC\ndirectement. (Je prévois d’entrer dans les détails dans un prochain article,\nmais imaginez avoir 2 000 développeurs pour suivre des dizaines de\nLes espaces de noms ont tous leurs propres politiques. L&#39;audit sera un cauchemar.)"},{"id":"text-14","heading":"Text","content":"Les comptes de service n&#39;ont pas d&#39;expiration, donc s&#39;il y a une fuite et personne\nsait, on peut en abuser continuellement jusqu&#39;à ce qu&#39;on le découvre."},{"id":"text-15","heading":"Text","content":"Si votre application s&#39;exécute dans un pod et doit parler au serveur d&#39;API,\nvous pouvez récupérer le compte de service du pod via un secret monté\nà votre pod. Si vous regardez le yaml ci-dessus, vous verrez un montage de volume\na été ajouté à /var/run/secrets/kubernetes.io/serviceaccount où\nIl existe un fichier de jeton contenant le jeton du compte de service du pod.\nN&#39;intégrez pas de jetons de compte de service en tant que secrets ou configuration pour une\npod fonctionnant dans le cluster, car il est plus difficile d’utiliser la rotation\njetons et est généralement plus difficile à gérer."},{"id":"text-16","heading":"Text","content":"Comptes utilisateur"},{"id":"text-17","heading":"Text","content":"J&#39;ai déjà mentionné que k8s ne se connecte à aucun type de magasin d&#39;utilisateurs (pas\ndirectement au moins). Cela signifie qu&#39;à chaque demande, vous devez fournir\nsuffisamment d’informations pour que k8s valide l’appelant. K8s ne se soucie pas comment\nvous établissez l&#39;identité, il se soucie seulement de savoir comment prouver que l&#39;identité est valide.\nPlusieurs mécanismes existent pour le faire. Je couvre le\nle plus populaire ici."},{"id":"text-18","heading":"Text","content":"Comment Kubernetes sait qui vous êtes"},{"id":"text-19","heading":"Text","content":"OpenID Connect"},{"id":"text-20","heading":"Text","content":"C’est l’option que vous devriez utiliser (à l’exception du cloud\nsolution basée sur le fournisseur pour une distribution gérée) pour authentifier les utilisateurs."},{"id":"text-21","heading":"Text","content":"Les jetons OpenID Connect peuvent être de très courte durée, donc s&#39;ils sont interceptés\net exfiltré, au moment où les attaquants savent ce qu&#39;ils ont, le jeton\nest inutile."},{"id":"text-22","heading":"Text","content":"Utiliser OpenID Connect, k8s jamais a les informations d&#39;identification de l&#39;utilisateur, il est donc\nimpossible de faire fuir quelque chose qu&#39;il n&#39;a pas."},{"id":"text-23","heading":"Text","content":"Une identité d’utilisateur présentée par OpenID Connect peut fournir non seulement\ninformations de nom d&#39;utilisateur, mais aussi informations de groupe. Cela fait beaucoup\ngestion plus facile des accès via un annuaire LDAP ou une base de données externe\nsans avoir à créer des liaisons RBAC pour des utilisateurs individuels."},{"id":"text-24","heading":"Text","content":"En ajoutant un &quot;proxy&quot; entre k8s et la couche d&#39;identité, il permet\nil est plus facile d&#39;ajouter plusieurs types d&#39;authentification, tels que le multi-facteur\nauthentification."},{"id":"text-25","heading":"Text","content":"Une pléthore d&#39;implémentations open source OpenID Connect\ntravaillera avec k8s."},{"id":"text-26","heading":"Text","content":"OpenID Connect Primer\nAvant d’explorer comment travailler avec OpenID Connect, laissez-moi vous expliquer.\nle protocole. Il y a deux concepts de base à comprendre avec\nOpenID Connect:"},{"id":"text-27","heading":"Text","content":"OpenID Connect est un protocole de génération d&#39;assertions construit sur le dessus\nde OAuth2."},{"id":"text-28","heading":"Text","content":"OAuth2 est un protocole d&#39;autorisation permettant de transférer des jetons au porteur."},{"id":"text-29","heading":"Text","content":"Il semble qu&#39;il manque un mot dans ces deux points:\nauthentification! C&#39;est parce que OpenID Connect n&#39;est pas une authentification\nprotocole. Peu importe comment vous vous authentifiez. Peu importe si\nl&#39;utilisateur connecté avec un nom d&#39;utilisateur et un mot de passe, une carte à puce ou tout simplement\nregardé vraiment digne de confiance. OpenID Connect est un protocole permettant de générer,\nrécupérer et actualiser des assertions concernant un utilisateur. Il y a aussi\ncertaines normes sur ce à quoi l&#39;assertion ressemble, mais comment l&#39;utilisateur\nauthentifie est finalement à la mise en œuvre OpenID Connect."},{"id":"text-30","heading":"Text","content":"Le deuxième point sur OAuth2 est important car ces deux protocoles\nsont souvent confondus les uns avec les autres ou mal représentés. OAuth2 est un\nprotocole de transfert de jetons. Il ne définit pas ce que le jeton est\nou comment il devrait être utilisé. Il définit simplement comment le jeton est passé\nentre porteurs et parties en instance."},{"id":"text-31","heading":"Text","content":"Comment Kubernetes fonctionne-t-il avec OpenID Connect?\nLa figure 1 montre le graphique des k8s authentification\npage."},{"id":"text-32","heading":"Text","content":"Figure 1. Open8 Connect Flow de k8s"},{"id":"text-33","heading":"Text","content":"Je ne vais pas répéter les mots exacts du site, mais voici les\nbases:"},{"id":"text-34","heading":"Text","content":"L&#39;utilisateur se connecte au fournisseur d&#39;identité de l&#39;utilisateur."},{"id":"text-35","heading":"Text","content":"Le fournisseur d&#39;identité génère un id_token et un\nrefresh_token."},{"id":"text-36","heading":"Text","content":"le id_token est utilisé pour affirmer l&#39;identité de l&#39;utilisateur à k8s."},{"id":"text-37","heading":"Text","content":"Quand le id_token a expiré, le refresh_token est utilisé pour\ngénérer un nouveau id_token."},{"id":"text-38","heading":"Text","content":"Un id_token est un jeton Web JSON (JWT) qui dit:"},{"id":"text-39","heading":"Text","content":"Qui est l&#39;utilisateur?"},{"id":"text-40","heading":"Text","content":"À quels groupes l&#39;utilisateur appartient-il (facultativement)?"},{"id":"text-41","heading":"Text","content":"Combien de temps le jeton est valide."},{"id":"text-42","heading":"Text","content":"Et, il contient une signature numérique pour valider que le JWT n&#39;a pas été\naltéré."},{"id":"text-43","heading":"Text","content":"L&#39;attribut id de l&#39;utilisateur, sous, est généralement l&#39;identifiant unique de l&#39;utilisateur.\nIl est courant d&#39;utiliser l&#39;identifiant de connexion d&#39;Active Directory (ou samAccountName), ou\nde nombreux développeurs préfèrent utiliser une adresse électronique. En général, ce n&#39;est pas\nla meilleure pratique. L&#39;identifiant d&#39;un utilisateur doit être à la fois unique et immuable.\nBien qu’une adresse électronique soit unique, elle n’est pas toujours immuable (par exemple, parfois\ndes noms\nchangement)."},{"id":"text-44","heading":"Text","content":"Le JWT est transmis à chaque demande de Kubectl à k8s. le\nid_token\nest appelé &quot;jeton porteur&quot;, car il donne au porteur l&#39;accès\nsans aucun contrôle supplémentaire. Cela signifie que si un système dans le\nflux d&#39;un appel d&#39;API, tel qu&#39;un proxy de service, validant webhook\nwebhook en mutation &#8211; devaient laisser échapper ce jeton, il pourrait être abusé par un\nattaquant. Parce que ces jetons sont si facilement maltraités, ils devraient avoir\ndurée de vie très courte. Je recommande une minute. De cette façon, si un jeton\nest exfiltré au moment où quelqu&#39;un le voit, sait ce que c&#39;est et est\ncapable de l&#39;utiliser, le jeton a expiré et est donc inutile. Lors de l&#39;utilisation\nces jetons de courte durée, il est important de configurer un\nrefresh_token\npour mettre à jour votre id_token après son expiration."},{"id":"text-45","heading":"Text","content":"Kubectl sait comment rafraîchir la id_token jeton en utilisant le\nrefresh_token appeler l&#39;URL du service d&#39;autorisation du fournisseur d&#39;identité.\nle refresh_token est un jeton que le serveur API du k8s n&#39;utilise jamais et\ndoit être traité comme un secret par l&#39;utilisateur. Ce jeton est utilisé pour obtenir un\nnouveau JWT, à quel point un nouveau refresh_token est disponible. Où le\nid_token devrait avoir une durée de vie très courte, le\nrefresh_token\ntimeout doit être similaire à un délai d&#39;inactivité, généralement compris entre 15 et 20.\nminutes. De cette façon, la mise en œuvre de votre K8 sera conforme à\nles stratégies de votre entreprise se concentrent sur les délais d&#39;inactivité. Utilisant un\nrefresh_token pour obtenir un nouveau id_token est plus sécurisé\nqu&#39;une vie plus longue\nid_token parce que le refresh_token signifie le\nSuivant:"},{"id":"text-46","heading":"Text","content":"Il ne peut être utilisé qu&#39;une seule fois. une fois qu&#39;il est utilisé, un nouveau est généré."},{"id":"text-47","heading":"Text","content":"Il est uniquement transmis entre l&#39;utilisateur et le fournisseur d&#39;identité,\nil y a donc beaucoup moins d&#39;acteurs qui pourraient potentiellement la laisser couler."},{"id":"text-48","heading":"Text","content":"Il ne vous identifie pas; s&#39;il est exfiltré seul, il ne peut pas être utilisé\npour vous identifier car il est opaque, afin qu&#39;un attaquant ne sache pas quoi\nfaire avec sans informations supplémentaires."},{"id":"text-49","heading":"Text","content":"Le tableau de bord Kubernetes\nLe tableau de bord ne dispose pas de son propre système de connexion. Tout ce qu&#39;il peut faire utilise un\njeton existant agissant au nom de l&#39;utilisateur. Cela signifie souvent mettre un\nproxy inverse devant le tableau de bord qui injectera le\nid_token\nsur chaque demande. Le proxy inverse est alors responsable de l&#39;actualisation\nle jeton au besoin."},{"id":"text-50","heading":"Text","content":"Quel fournisseur d&#39;identité devrais-je utiliser?\nLors du choix d&#39;un fournisseur d&#39;identité, k8s n&#39;a en réalité que deux exigences:"},{"id":"text-51","heading":"Text","content":"Il doit supporte la découverte OpenID Connect."},{"id":"text-52","heading":"Text","content":"Il fournit un mécanisme pour générer des jetons et les injecter dans votre\n~ / .kube / config."},{"id":"text-53","heading":"Text","content":"C&#39;est à peu près ça! La découverte est importante car elle vous garde\nd&#39;avoir à dire à K8 où les différentes URL sont manuellement, quelles sont les clés\nsont utilisés pour la signature et ainsi de suite. Il est beaucoup plus facile de pointer le k8s vers une découverte\nURL qui contient toutes ces informations. C’est une norme commune, et la plupart\nLes fournisseurs d&#39;identité le prennent en charge immédiatement."},{"id":"text-54","heading":"Text","content":"Le point 2 est l&#39;endroit où les choses deviennent intéressantes. Il y a différentes écoles\nde penser à comment obtenir vos informations de jeton à partir de votre point de connexion\n(généralement un navigateur Web) dans votre ~ / .kube / config."},{"id":"text-55","heading":"Text","content":"Injection de navigateur Web\nDans ce modèle, tout se concentre sur votre navigateur Web. Vous\ns&#39;authentifier via votre navigateur, puis des commandes sont fournies à\nconfigurez votre Kubectl client correctement. Par exemple, OpenUnison (notre propre projet)\nvous fournit une seule commande pour définir votre configuration de cluster\nune fois authentifié (Figure 2)."},{"id":"text-56","heading":"Text","content":"Figure 2. Jeton de navigateur"},{"id":"text-57","heading":"Text","content":"Tu utilises KubectlLa capacité intégrée de configurer le fichier de configuration à partir de\nla ligne de commande pour terminer la configuration."},{"id":"text-58","heading":"Text","content":"Cette méthode a plusieurs avantages:"},{"id":"text-59","heading":"Text","content":"Les navigateurs ont le plus d&#39;options pour l&#39;authentification. En plus de\nnom d&#39;utilisateur et mot de passe, vous pouvez intégrer Kerberos, multi-facteurs, etc."},{"id":"text-60","heading":"Text","content":"Vous n&#39;avez pas besoin de gérer des configurations complexes de K8; ils sont gérés\npour vous."},{"id":"text-61","heading":"Text","content":"Cela fonctionne avec stock Kubectl commandes, donc il n&#39;y a rien de plus à déployer pour\npostes de travail."},{"id":"text-62","heading":"Text","content":"Le plugin kubectl\nVous pouvez prolonger le Kubectl commande utilisant des plugins.\nÀ l&#39;aide d&#39;un plugin, vous pouvez collecter les informations d&#39;identification d&#39;un utilisateur, puis générer\nun jeton. J&#39;ai vu des plugins qui vont collecter vos identifiants\nla CLI et d’autres plug-ins qui lanceront un navigateur pour vous demander de\nun login. Cette méthode est bonne du point de vue de la CLI car elle permet à votre CLI\npilotez votre expérience utilisateur. L’inconvénient majeur de cette approche est-il\nnécessite l&#39;installation du plug-in sur chaque poste de travail."},{"id":"text-63","heading":"Text","content":"Télécharger la configuration\nAvec cette méthode, le fournisseur d’identité (ou une application personnalisée)\nvous fournit un fichier de configuration entièrement généré que vous pouvez télécharger.\nCela peut créer un problème de support si quelque chose n&#39;est pas enregistré dans\nau bon endroit."},{"id":"text-64","heading":"Text","content":"Une fois que vous avez choisi un fournisseur d’identité, suivez ses instructions.\nl&#39;intégration. Les éléments clés d’importance sont l’URL de découverte, le\nl&#39;identifiant &quot;claim&quot; et la &quot;claim&quot; du groupe."},{"id":"text-65","heading":"Text","content":"Certificats X509"},{"id":"text-66","heading":"Text","content":"L’authentification par certificat exploite la négociation TLS entre les\nclient (généralement le Kubectl commande) et le serveur API k8s\npour affirmer une identité en présentant un certificat au serveur API.\nÀ l&#39;exception d&#39;un cas d&#39;utilisation, cette méthode n&#39;est pas une &quot;meilleure pratique&quot;\net devrait être découragé pour plusieurs raisons:"},{"id":"text-67","heading":"Text","content":"Les certificats ne peuvent pas être révoqués en k8. Vous devez soit attendre jusqu&#39;à\nle certificat a expiré ou ressaisissez l&#39;intégralité du cluster."},{"id":"text-68","heading":"Text","content":"La clé privée d&#39;un certificat doit jamais quitter le support sécurisé\noù c&#39;était\ngénéré. Habituellement, on vous &quot;donne&quot; une paire de clés et un certificat à utiliser."},{"id":"text-69","heading":"Text","content":"Il est difficile d&#39;utiliser des groupes avec des certificats. Vous devez les intégrer\ndans le sujet, et si ces groupes doivent changer, bien, voir n ° 1 ci-dessus."},{"id":"text-70","heading":"Text","content":"La seule situation où vous devriez utiliser des certificats X509 pour\nl&#39;authentification est lorsque vous démarrez votre cluster ou en cas de\nurgence et votre fournisseur d&#39;identité n&#39;est pas disponible. La plupart des distributions\ndéployer une paire de clés sur chaque maître, donc si vous ssh dans ce maître, vous pouvez\nutilisation Kubectl gérer le cluster. Cela signifie que vous devez verrouiller\naccès au maître (je prévois de couvrir cela dans un prochain article)."},{"id":"text-71","heading":"Text","content":"Webhooks"},{"id":"text-72","heading":"Text","content":"Cette méthode vous permet d’intégrer une connexion tierce ou un système de jeton via\nun Webhook. Au lieu de dire à k8s comment valider une identité, k8s\nappelle un webhook et demande &quot;qui est-ce?&quot;"},{"id":"text-73","heading":"Text","content":"Ne le faites pas sauf si vous êtes un fournisseur de cloud et que vous avez votre propre identité.\nSolution. À peu près toutes les mises en œuvre que j&#39;ai vues de cela se transforment en\n&quot;passons les mots de passe&quot; ou un OpenID Connect mal pensé."},{"id":"text-74","heading":"Text","content":"Proxy inverse avec emprunt d&#39;identité"},{"id":"text-75","heading":"Text","content":"Ici, le client (kubectl ou autre) ne communique pas avec l&#39;API\nserveur directement. Au lieu de cela, il communique avec un proxy inverse, qui\ninjecte des en-têtes dans la requête pour représenter l&#39;utilisateur. C&#39;est souvent\nsouligné comme un moyen de gérer les scénarios d’authentification avancée,\ncela demande le moins de travail possible du point de vue du serveur d&#39;API.\nLes étapes de la mise en œuvre sont les suivantes:"},{"id":"text-76","heading":"Text","content":"Créez un compte de service."},{"id":"text-77","heading":"Text","content":"Autorisez le compte de service à effectuer l&#39;emprunt d&#39;identité."},{"id":"text-78","heading":"Text","content":"Configurez un proxy inverse pour injecter le compte de service et\nen-têtes d&#39;emprunt d&#39;identité dans chaque demande."},{"id":"text-79","heading":"Text","content":"Cette solution fournit ces problèmes ainsi que les mêmes pièges que Webhooks.\nIl est fort probable que les normes existantes satisferont vos besoins et seront plus faciles à\ngérer et maintenir."},{"id":"text-80","heading":"Text","content":"Le tirer ensemble\nPour intégrer l&#39;identité dans les k8, suivez cette liste de contrôle de base:"},{"id":"text-81","heading":"Text","content":"Utilisez les comptes de service uniquement pour les systèmes, pas pour les utilisateurs."},{"id":"text-82","heading":"Text","content":"Utilisez OpenID Connect pour les personnes; il est bien vérifié et soutenu par\nplusieurs systèmes, à la fois open-source et propriétaires."},{"id":"text-83","heading":"Text","content":"Utilisez l&#39;authentification par certificat uniquement pour &quot;briser le verre en cas de\nsituations d&#39;urgence."},{"id":"text-84","heading":"Text","content":"Suivez ces règles et vous constaterez que vos développeurs sont heureux de\navoir un mot de passe de moins à retenir, et votre équipe de sécurité sera heureuse\nvous suivez les meilleures pratiques et les exigences de conformité."},{"id":"text-85","heading":"Text","content":"Ressources"},{"id":"text-86","heading":"Text","content":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"}],"media":{"primary_image":"https://tutos-gameserver.fr/wp-content/uploads/2019/04/12634f1.png"},"relations":[{"rel":"canonical","href":"https://tutos-gameserver.fr/2019/04/22/kubernetes-identity-management-authentification-journal-linux/"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2019/04/22/kubernetes-identity-management-authentification-journal-linux/llm","type":"text/html"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2019/04/22/kubernetes-identity-management-authentification-journal-linux/llm.json","type":"application/json"},{"rel":"llm-manifest","href":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","type":"application/json"}],"http_headers":{"X-LLM-Friendly":"1","X-LLM-Schema":"1.1.0","Content-Security-Policy":"default-src 'none'; img-src * data:; style-src 'unsafe-inline'"},"license":"CC BY-ND 4.0","attribution_required":true,"allow_cors":false}