Nous attachons l'autorisation LDAP à Kubernetes


Un court tutoriel sur la façon d'utiliser Kubernetes pour connecter Kubernetes à votre serveur LDAP et configurer l'importation d'utilisateurs et de groupes à l'aide de Keycloak. Cela vous permettra de configurer RBAC pour vos utilisateurs et d'utiliser auth-proxy pour protéger Kubernetes Dashboard et d'autres applications qui ne peuvent pas s'autoriser.


Installer Keycloak


Supposons que vous disposiez déjà d'un serveur LDAP. Il peut s'agir d'Active Directory, FreeIPA, OpenLDAP ou toute autre chose. Si vous n'avez pas de serveur LDAP, vous pouvez en principe créer des utilisateurs directement dans l'interface Keycloak ou utiliser des fournisseurs publics Oidc (Google, Github, Gitlab), le résultat sera presque le même.


Tout d'abord, nous installerons Keycloak lui-même, l'installation peut être effectuée séparément, et immédiatement dans le cluster Kubernetes, en règle générale, si vous avez plusieurs clusters Kubernetes, il serait plus facile de l'installer séparément. D'autre part, vous pouvez toujours utiliser le tableau de barre officiel et l'installer directement dans votre cluster.


Pour stocker les données Keycloak, vous avez besoin d'une base de données. Par défaut, h2 utilisé (toutes les données sont stockées localement), mais il est également possible d'utiliser postgres , mysql ou mariadb .
Si vous décidez toujours d'installer Keycloak séparément, vous trouverez des instructions plus détaillées dans la documentation officielle .


Configuration de la fédération


Créez d'abord un nouveau domaine. Le domaine est l'espace de notre application. Chaque application peut avoir son propre domaine avec différents utilisateurs et paramètres d'autorisation. Le domaine maître est utilisé par Keycloak lui-même et il n'est pas juste de l'utiliser pour autre chose.


Cliquez sur Ajouter un domaine


OptionValeur
Nomkubernetes
Nom d'affichageKubernetes
Nom d'affichage HTML<img src="https://kubernetes.io/images/nav_logo.svg" width="400" \>

Kubernetes vérifie par défaut si l'utilisateur a un e-mail ou non. Puisque nous utilisons notre propre serveur LDAP, cette vérification retournera presque toujours false . Désactivons la représentation de ce paramètre dans Kubernetes:


Étendues client -> E - mail -> Mappeurs -> E-mail vérifié (Supprimer)


Configurez maintenant la fédération, pour cela nous allons aller à:


Fédération d'utilisateurs -> Ajouter un fournisseur ... -> ldap


Voici un exemple de configuration pour FreeIPA:


OptionValeur
Nom d'affichage de la consolefreeipa.example.org
VendeurRed Hat Directory Server
Attribut LDAP UUIDipauniqueid
URL de connexionldaps://freeipa.example.org
DN d'utilisateurscn=users,cn=accounts,dc=example,dc=org
Lier dnuid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
Lier les informations d'identification<password>
Autoriser l'authentification Kerberos:on
Domaine Kerberos:EXAMPLE.ORG
Principal du serveur:HTTP/freeipa.example.org@EXAMPLE.ORG
KeyTab:/etc/krb5.keytab

L'utilisateur keycloak-svc doit être créé à l'avance sur notre serveur LDAP.


Dans le cas d'Active Directory, sélectionnez simplement Fournisseur: Active Directory et les paramètres nécessaires sont automatiquement renseignés dans le formulaire.


Cliquez sur Enregistrer


Passons maintenant:


Fédération d'utilisateurs -> freeipa.example.org -> Mappeurs -> Prénom


OptionValeur
Attribution LDAPgivenName

Activez maintenant le mappage de groupe:


Fédération d'utilisateurs -> freeipa.example.org -> Mappeurs -> Créer


OptionValeur
Nomgroups
Type de mappeurgroup-ldap-mapper
DN des groupes LDAPcn=groups,cn=accounts,dc=example,dc=org
Groupes d'utilisateurs récupérer la stratégieGET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

Ceci termine la configuration de la fédération, passons à la configuration du client.


Configuration du client


Créez un nouveau client (une application qui recevra les utilisateurs de Keycloak). Nous passons:


Clients -> Créer


OptionValeur
ID clientkubernetes
Type d'accèsconfidenrial
URL racinehttp://kubernetes.example.org/
URI de redirection valideshttp://kubernetes.example.org/*
URL administrateurhttp://kubernetes.example.org/

Créez également une portée pour les groupes:


Étendues client -> Créer


OptionValeur
GabaritNo template
Nomgroups
Chemin de groupe completfalse

Et configurez le mappeur pour eux:


Étendues client -> groupes -> Mappeurs -> Créer


OptionValeur
Nomgroups
Type de mappeurGroup membership
Nom de revendication de jetongroups

Maintenant, nous devons activer le groupe de mappage dans notre portée client:


Clients -> kubernetes -> Étendues client -> Étendues client par défaut


Sélectionnez les groupes dans les étendues client disponibles , cliquez sur Ajouter la sélection


Configurez maintenant l'authentification de notre application, allez sur:


Clients -> kubernetes


OptionValeur
Autorisation activéeON

Cliquez sur enregistrer et cela termine la configuration du client, maintenant sur l'onglet


Clients -> kubernetes -> Identifiants


Vous pouvez obtenir Secret que nous utiliserons à l'avenir.


Configurer Kubernetes


La configuration de Kubernetes pour l'authentification OIDC est assez triviale et n'est pas très compliquée. Il vous suffit de mettre le certificat CA de votre serveur OIDC dans /etc/kubernetes/pki/oidc-ca.pem et d'ajouter les options nécessaires pour kube-apiserver.
Pour ce faire, mettez à jour /etc/kubernetes/manifests/kube-apiserver.yaml sur tous vos assistants:


 ... spec: containers: - command: - kube-apiserver ... - --oidc-ca-file=/etc/kubernetes/pki/oidc-ca.pem - --oidc-client-id=kubernetes - --oidc-groups-claim=groups - --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes - --oidc-username-claim=email ... 

Et mettez également à jour la configuration kubeadm dans le cluster, afin de ne pas perdre ces paramètres lors de la mise à jour:


 kubectl edit -n kube-system configmaps kubeadm-config 

 ... data: ClusterConfiguration: | apiServer: extraArgs: oidc-ca-file: /etc/kubernetes/pki/oidc-ca.pem oidc-client-id: kubernetes oidc-groups-claim: groups oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes oidc-username-claim: email ... 

Ceci termine la configuration de Kubernetes. Vous pouvez répéter ces étapes dans tous vos clusters Kubernetes.


Autorisation initiale


Après ces étapes, vous disposerez déjà d'un cluster Kubernetes avec l'authentification OIDC configurée. Le seul point est que vos utilisateurs n'ont pas encore configuré de client ainsi que leur propre kubeconfig. Pour résoudre ce problème, vous devez configurer l'émission automatique de kubeconfig aux utilisateurs après une autorisation réussie.


Pour ce faire, vous pouvez utiliser des applications Web spéciales qui vous permettent d'authentifier l'utilisateur, puis de télécharger le kubeconfig terminé. L'un des plus pratiques est Kuberos , qui vous permet de décrire tous les clusters Kubernetes dans une seule configuration et de basculer facilement entre eux.


Pour configurer Kuberos, décrivez simplement le modèle de kubeconfig et exécutez-le avec les paramètres suivants:


 kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template 

Voir Utilisation sur Github pour plus de détails.


Il est également possible d'utiliser kubelogin si vous souhaitez autoriser directement sur l'ordinateur de l'utilisateur. Dans ce cas, l'utilisateur ouvre un navigateur avec un formulaire d'autorisation sur localhost.


Le kubeconfig résultant peut être vérifié sur jwt.io. Copiez simplement la valeur des users[].user.auth-provider.config.id-token de votre kubeconfig vers le formulaire sur le site et obtenez immédiatement le décryptage.


Configuration RBAC


Lors de la configuration de RBAC, vous pouvez faire référence à la fois au nom d'utilisateur (le champ de name dans le jeton jwt) et au groupe d'utilisateurs (le champ de groups dans le jeton jwt). Voici un exemple de définition des autorisations pour le groupe kubernetes-default-namespace-admins :


kubernetes-default-namespace-admins.yaml
 apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: default-admins namespace: default rules: - apiGroups: - '*' resources: - '*' verbs: - '*' --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: kubernetes-default-namespace-admins namespace: default roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: default-admins subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: kubernetes-default-namespace-admins 

Vous trouverez d'autres exemples de RBAC dans la documentation officielle de Kubernetes.


Configurer l'auth-proxy


Il existe un merveilleux projet keycloak-gatekeeper qui vous permet de protéger n'importe quelle application, donnant à l'utilisateur la possibilité de s'authentifier auprès du serveur OIDC. Je vais montrer comment vous pouvez le configurer en utilisant Kubernetes Dashboard comme exemple:


dashboard-proxy.yaml
 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: kubernetes-dashboard-proxy spec: replicas: 1 template: metadata: labels: app: kubernetes-dashboard-proxy spec: containers: - args: - --listen=0.0.0.0:80 - --discovery-url=https://keycloak.example.org/auth/realms/kubernetes - --client-id=kubernetes - --client-secret=<your-client-secret-here> - --redirection-url=https://kubernetes-dashboard.example.org - --enable-refresh-tokens=true - --encryption-key=ooTh6Chei1eefooyovai5ohwienuquoh - --upstream-url=https://kubernetes-dashboard.kube-system - --resources=uri=/* image: keycloak/keycloak-gatekeeper name: kubernetes-dashboard-proxy ports: - containerPort: 80 livenessProbe: httpGet: path: /oauth/health port: 80 initialDelaySeconds: 3 timeoutSeconds: 2 readinessProbe: httpGet: path: /oauth/health port: 80 initialDelaySeconds: 3 timeoutSeconds: 2 --- apiVersion: v1 kind: Service metadata: name: kubernetes-dashboard-proxy spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: kubernetes-dashboard-proxy type: ClusterIP 

Source: https://habr.com/ru/post/fr441112/


All Articles