6.Creation_openldap.md
- Déploiement d'un Serveur LDAP sur Kubernetes
- Introduction
- Étapes du Déploiement
- 1. Création d'un Namespace dédié
- 2. Préparation du fichier de déploiement
- Création des Secrets
- Définition du PersistentVolumeClaim
- Déploiement d'OpenLDAP
- Service pour OpenLDAP
- Déploiement de phpLDAPadmin
- Service pour phpLDAPadmin
- 3. Application du fichier YAML
- 4. Accès à phpLDAPadmin
Déploiement d'un Serveur LDAP sur Kubernetes
Introduction
Ce guide détaille le processus de déploiement d'un serveur OpenLDAP sur un cluster Kubernetes, accompagné de phpLDAPadmin pour une gestion simplifiée via une interface web. L'objectif est de mettre en place un système de gestion des utilisateurs et des permissions au sein de Kubernetes.
Étapes du Déploiement
1. Création d'un Namespace dédié
Pour isoler les ressources liées à OpenLDAP, il est recommandé de créer un namespace spécifique :
kubectl create namespace openldap
2. Préparation du fichier de déploiement
Un fichier YAML est nécessaire pour définir les ressources Kubernetes requises : Secret, PersistentVolumeClaim, Deployments et Services.
Création des Secrets
Les informations sensibles, telles que le nom de domaine, l'organisation et le mot de passe administrateur, doivent être encodées en base64 et stockées dans un Secret Kubernetes.
apiVersion: v1
kind: Secret
metadata:
name: openldap-secrets
namespace: openldap
type: Opaque
data:
organization: "bXlvcmdhbml6YXRpb24=" # myorganization encodé en base64
domain: "bXlkb21haW4=" # mydomain encodé en base64
password: "bXlwYXNzd29yZA==" # mypassword encodé en base64
Définition du PersistentVolumeClaim
Pour assurer la persistance des données LDAP, un PersistentVolumeClaim est défini :
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: openldap-data-disk
namespace: openldap
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
Déploiement d'OpenLDAP
Le déploiement spécifie l'image Docker d'OpenLDAP, les ports à exposer, les variables d'environnement (récupérées depuis le Secret) et les volumes pour la persistance des données :
apiVersion: apps/v1
kind: Deployment
metadata:
name: openldap-deployment
namespace: openldap
labels:
app: openldap
spec:
replicas: 1
selector:
matchLabels:
app: openldap
template:
metadata:
labels:
app: openldap
spec:
containers:
- name: openldap
image: osixia/openldap:1.3.0
ports:
- containerPort: 389
- containerPort: 636
env:
- name: LDAP_ORGANISATION
valueFrom:
secretKeyRef:
name: openldap-secrets
key: organization
- name: LDAP_DOMAIN
valueFrom:
secretKeyRef:
name: openldap-secrets
key: domain
- name: LDAP_ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: openldap-secrets
key: password
volumeMounts:
- name: openldap-volume
mountPath: "/var/lib/ldap"
subPath: database
- name: openldap-volume
mountPath: "/etc/ldap/slapd.d"
subPath: config
volumes:
- name: openldap-volume
persistentVolumeClaim:
claimName: openldap-data-disk
Service pour OpenLDAP
Un Service de type ClusterIP est créé pour exposer OpenLDAP au sein du cluster :
apiVersion: v1
kind: Service
metadata:
name: openldap-service
namespace: openldap
spec:
selector:
app: openldap
ports:
- name: ldap
protocol: TCP
port: 389
targetPort: 389
- name: ldaps
protocol: TCP
port: 636
targetPort: 636
Déploiement de phpLDAPadmin
Pour faciliter la gestion de LDAP, phpLDAPadmin est déployé :
apiVersion: apps/v1
kind: Deployment
metadata:
name: phpldapadmin-deployment
namespace: openldap
labels:
app: phpldapadmin
spec:
replicas: 1
selector:
matchLabels:
app: phpldapadmin
template:
metadata:
labels:
app: phpldapadmin
spec:
containers:
- name: phpldapadmin
image: osixia/phpldapadmin:0.9.0
ports:
- containerPort: 443
env:
- name: PHPLDAPADMIN_LDAP_HOSTS
value: openldap-service
Service pour phpLDAPadmin
Un Service de type LoadBalancer est défini pour permettre l'accès externe à phpLDAPadmin :
apiVersion: v1
kind: Service
metadata:
name: phpldapadmin-service
namespace: openldap
spec:
type: LoadBalancer
selector:
app: phpldapadmin
ports:
- protocol: TCP
port: 9943
targetPort: 443
3. Application du fichier YAML
Après avoir défini toutes les ressources, appliquer le fichier YAML pour déployer OpenLDAP et phpLDAPadmin :
kubectl apply -f openldap.yaml
4. Accès à phpLDAPadmin
Une fois le déploiement terminé, accéder à phpLDAPadmin via l'adresse IP attribuée au Service LoadBalancer, en utilisant le port 9943 :
https://192.168.10.101:9943
Identifiants de connexion :
-
Utilisateur :
cn=admin,dc=mydomain
- Mot de passe : celui défini dans le secret Kubernetes.
Ce déploiement permet de gérer un annuaire LDAP efficacement dans un cluster Kubernetes, tout en garantissant une interface web simplifiée pour l'administration.
- Voici la configuration complete de mon LDAP :
# LDIF Export for dc=unzy
# Server: openldap-service (openldap-service)
# Search Scope: sub
# Search Filter: (objectClass=*)
# Total Entries: 9
#
# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on March 9, 2025 4:35 pm
# Version: 1.2.5
version: 1
# Entry 1: dc=unzy
dn: dc=unzy
dc: unzy
o: devops
objectclass: top
objectclass: dcObject
objectclass: organization
# Entry 2: cn=admin,dc=unzy
dn: cn=admin,dc=unzy
cn: admin
description: LDAP administrator
objectclass: simpleSecurityObject
objectclass: organizationalRole
userpassword: {SSHA}k0E3DnJhMzTy0+2PTfS4n5u84U3sWx+U
# Entry 3: ou=Groups,dc=unzy
dn: ou=Groups,dc=unzy
objectclass: organizationalUnit
objectclass: top
ou: Groups
# Entry 4: cn=Admin,ou=Groups,dc=unzy
dn: cn=Admin,ou=Groups,dc=unzy
cn: Admin
gidnumber: 502
memberuid: dclemente
objectclass: posixGroup
objectclass: top
# Entry 5: cn=Famille,ou=Groups,dc=unzy
dn: cn=Famille,ou=Groups,dc=unzy
cn: Famille
gidnumber: 500
memberuid: dclemente
memberuid: mclemente
memberuid: fclemente
objectclass: posixGroup
objectclass: top
# Entry 6: ou=Users,dc=unzy
dn: ou=Users,dc=unzy
objectclass: organizationalUnit
objectclass: top
ou: Users
# Entry 7: cn=Damien clemente,ou=Users,dc=unzy
dn: cn=Damien clemente,ou=Users,dc=unzy
cn: Damien clemente
gidnumber: 502
givenname: Damien
homedirectory: /home/users/dclemente
loginshell: /bin/bash
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: clemente
uid: dclemente
uidnumber: 1000
userpassword: kube
# Entry 8: cn=Frederic Clemente,ou=Users,dc=unzy
dn: cn=Frederic Clemente,ou=Users,dc=unzy
cn: Frederic Clemente
gidnumber: 500
givenname: Frederic
homedirectory: /home/users/fclemente
loginshell: /bin/bash
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: Clemente
uid: fclemente
uidnumber: 1002
userpassword: kube
# Entry 9: cn=Mathieu Clemente,ou=Users,dc=unzy
dn: cn=Mathieu Clemente,ou=Users,dc=unzy
cn: Mathieu Clemente
gidnumber: 500
givenname: Mathieu
homedirectory: /home/users/mclemente
loginshell: /bin/bash
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: Clemente
uid: mclemente
uidnumber: 1001
userpassword: kube