Nous intégrons l'authentification LDAP à Kubernetes.

Nous intégrons l'authentification LDAP à Kubernetes.

Un petit guide sur la façon d'utiliser Keycloak pour relier Kubernetes Ă  votre serveur LDAP et configurer l'importation d'utilisateurs et de groupes. Cela permettra de configurer le RBAC pour vos utilisateurs et d'utiliser un auth-proxy pour sĂ©curiser le tableau de bord Kubernetes et d'autres applications qui ne peuvent pas s'authentifier elles-mĂȘmes.

Installation de Keycloak

Supposons que vous avez dĂ©jĂ  un serveur LDAP. Cela peut ĂȘtre Active Directory, FreeIPA, OpenLDAP ou autre chose. Si vous n'avez pas de serveur LDAP, vous pouvez en principe crĂ©er des utilisateurs directement dans l'interface de Keycloak, ou utiliser des fournisseurs oidc publics (Google, Github, Gitlab), le rĂ©sultat sera presque le mĂȘme.

D'abord, installez Keycloak lui-mĂȘme, l'installation peut se faire sĂ©parĂ©ment ou directement dans le cluster Kubernetes, en gĂ©nĂ©ral, si vous avez plusieurs clusters Kubernetes, il serait plus facile de l'installer sĂ©parĂ©ment. D'autre part, vous pouvez toujours utiliser le chart helm officiel et l'installer directement dans votre cluster.

Pour stocker les données de Keycloak, vous aurez besoin d'une base de données. Par défaut, on utilise h2 (toutes les données sont stockées localement), mais vous pouvez également utiliser postgres, mysql ou mariadb.
Si vous avez décidé d'installer Keycloak séparément, des instructions plus détaillées se trouvent dans la documentation officielle.

Configuration de la fédération

Tout d'abord, crĂ©ons un nouveau royaume. Un royaume est l'espace de notre application. Chaque application peut avoir son propre royaume avec diffĂ©rents utilisateurs et paramĂštres d'autorisation. Le royaume maĂźtre est utilisĂ© par Keycloak lui-mĂȘme et il est incorrect de l'utiliser pour autre chose.

Cliquez Ajouter un royaume

Option
Valeur

Nom
kubernetes

Nom d'affichage
Kubernetes

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

Kubernetes vérifie par défaut si l'email de l'utilisateur est confirmé ou non. Comme nous utilisons notre propre serveur LDAP, cette vérification renverra presque toujours faux. Désactivons l'affichage de ce paramÚtre dans Kubernetes :

Client scopes —> Email —> Mappers —> Email vĂ©rifiĂ© (Supprimer)

Nous allons maintenant configurer la fédération, pour cela allons dans :

FĂ©dĂ©ration d'utilisateurs —> Ajouter un fournisseur
 —> ldap

Voici un exemple de configuration pour FreeIPA :

Option
Valeur

Nom d'affichage de la console
freeipa.example.org

Fournisseur
Red Hat Directory Server

Attribut LDAP UUID
ipauniqueid

URL de connexion
ldaps://freeipa.example.org

DN des utilisateurs
cn=users,cn=accounts,dc=example,dc=org

DN de liaison
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org

Informations d'identification de liaison
<password>

Autoriser l'authentification Kerberos :
on

Royaume 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, il suffit de choisir Fournisseur : Active Directory Et les paramÚtres nécessaires seront automatiquement remplis dans le formulaire.

Cliquez Sauvegarder

Passons maintenant Ă  :

FĂ©dĂ©ration d'utilisateurs —> freeipa.example.org —> Mappers —> PrĂ©nom

Option
Valeur

Attribut LDAP
givenName

Nous allons maintenant activer le mappage des groupes :

FĂ©dĂ©ration d'utilisateurs —> freeipa.example.org —> Mappers —> CrĂ©er

Option
Valeur

Nom
groups

Type de mappeur
group-ldap-mapper

DN des groupes LDAP
cn=groups,cn=accounts,dc=example,dc=org

Stratégie de récupération des groupes d'utilisateurs
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

La configuration de la fédération est maintenant terminée, passons à la configuration du client.

Configuration du client

Créons un nouveau client (une application qui récupérera les utilisateurs de Keycloak). Passons à :

Clients —> CrĂ©er

Option
Valeur

ID Client
kubernetes

Type d'accĂšs
confidenrial

URL racine
http://kubernetes.example.org/

URIs de redirection valides
http://kubernetes.example.org/*

URL d'administration
http://kubernetes.example.org/

Nous allons également créer un scope pour les groupes :

Scopes de client —> CrĂ©er

Option
Valeur

ModĂšle
Aucun modĂšle

Nom
groups

Chemin complet du groupe
faux

Et nous configurerons un mappeur pour eux :

Scopes de client —> groups —> Mappers —> CrĂ©er

Option
Valeur

Nom
groups

Type de mappeur
Adhésion au groupe

Nom de la réclamation de jeton
groups

Nous devons maintenant activer le mappage des groupes dans notre scope de client :

Clients —> kubernetes —> Scopes de client —> Scopes de client par dĂ©faut

Sélectionnez groups dans Scopes de client disponibles, cliquez sur Ajouter les sélectionnés

Nous allons maintenant configurer l'authentification de notre application, passons Ă  :

Clients —> kubernetes

Option
Valeur

Autorisation activée
ACTIVER

Cliquez sur sauvegarder et avec cela, la configuration du client est terminée, maintenant sur l'onglet

Clients —> kubernetes —> Identifiants

vous pourrez obtenir Secret que nous utiliserons plus tard.

Configuration de Kubernetes

La configuration de Kubernetes pour l'autorisation OIDC est assez triviale et n'est pas trÚs complexe. Tout ce que vous devez faire est de placer 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 cela, mettez Ă  jour /etc/kubernetes/manifests/kube-apiserver.yaml sur tous vos maĂźtres :

...
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 pour 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
...

La configuration de Kubernetes est maintenant terminée. Vous pouvez répéter ces actions dans tous vos clusters Kubernetes.

Autorisation initiale

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

Pour cela, vous pouvez utiliser des applications web spĂ©ciales qui permettent d'authentifier l'utilisateur puis de tĂ©lĂ©charger le kubeconfig prĂȘt. L'une des plus pratiques est Kuberos, il permet de dĂ©crire tous les clusters Kubernetes dans une seule configuration et de basculer facilement entre eux.

Pour configurer Kuberos, il suffit de décrire le template pour kubeconfig et de l'exécuter avec les paramÚtres suivants :

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

Pour plus d'informations détaillées, consultez Utilisation sur Github.

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

Le kubeconfig obtenu peut ĂȘtre vĂ©rifiĂ© sur le site jwt.io. Il suffit de copier la valeur users[].user.auth-provider.config.id-token de votre kubeconfig dans le formulaire sur le site pour obtenir instantanĂ©ment le dĂ©cryptage.

Configuration RBAC

Lors de la configuration de RBAC, vous pouvez vous référer soit au nom d'utilisateur (champ nom dans le jeton jwt), soit au groupe d'utilisateurs (champ groups dans le jeton jwt). Voici un exemple de configuration des droits 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

D'autres exemples pour RBAC peuvent ĂȘtre trouvĂ©s dans la documentation officielle de Kubernetes

Configuration de auth-proxy

Il existe un projet formidable keycloak-gatekeeper, qui permet de sécuriser n'importe quelle application en permettant à l'utilisateur de s'authentifier sur un serveur OIDC. Je vais montrer comment le configurer à l'aide de l'exemple Kubernetes Dashboard :

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=
        - --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 : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster