Introduction
o2Cloud IAM (Identity & Access Management) est une application web professionnelle de gestion de changement de mot de passe Active Directory. Elle offre une interface moderne et intuitive permettant aux utilisateurs de modifier leur mot de passe AD de manière sécurisée et autonome.
Objectifs
- Permettre aux utilisateurs de changer leur mot de passe Active Directory sans intervention du helpdesk
- Garantir la sécurité des communications via LDAPS (SSL/TLS)
- Offrir un contrôle d'accès granulaire basé sur les groupes AD
- Fournir une interface moderne, responsive et accessible
- Assurer une traçabilité complète via des logs détaillés
Prérequis
Serveur Web
| Composant | Version minimale | Recommandation |
|---|---|---|
| PHP | 8.0 | 8.1 ou supérieur |
| Extension PHP LDAP | Requis | php-ldap |
| Extension PHP OpenSSL | Requis | php-openssl |
| Composer | 2.0 | Dernière version |
| Serveur web | - | Apache 2.4 ou Nginx 1.18 |
Infrastructure Active Directory
- Serveur Active Directory accessible (Windows Server 2012 ou supérieur)
- Compte de service AD avec permissions de réinitialisation de mots de passe
- Certificat SSL pour LDAPS (peut être auto-signé pour les tests)
- Port 636 (LDAPS) ou 389 (LDAP+STARTTLS) accessible
Système d'exploitation
- Windows Server 2012+ avec IIS ou Apache
- Linux (Ubuntu 20.04+, Debian 11+, CentOS 8+, RHEL 8+)
Fonctionnalités
Interface utilisateur
- Design moderne : Interface responsive construite avec TailwindCSS
- Mode sombre/clair : Détection automatique des préférences système
- Multi-plateforme : Compatible mobile, tablette et desktop
- Animations fluides : Transitions et micro-interactions soignées
Sécurité
- LDAPS (SSL/TLS) : Chiffrement des communications avec AD
- STARTTLS : Support du chiffrement opportuniste sur port 389
- Protection CSRF : Tokens anti-Cross-Site Request Forgery
- Anti-brute force : Limitation des tentatives de connexion
- Session timeout : Expiration automatique des sessions
- Validation des entrées : Sanitization contre les injections LDAP
Gestion des accès
- Authentification AD : Connexion avec identifiants Active Directory
- Contrôle par groupe : Restriction basée sur l'appartenance à un groupe AD
- Compte de service : Délégation sécurisée des permissions
Gestion des mots de passe
- Politique personnalisée : Longueur minimale, complexité configurable
- Indicateur de force : Barre de progression en temps réel
- Générateur de mots de passe : Création de mots de passe forts
- Validation temps réel : Vérification des critères avant soumission
Logs & Audit
access.log: Connexions et authentificationspassword_changes.log: Modifications de mots de passeerrors.log: Erreurs applicatives et LDAP
Internationalisation
- Support français et anglais
- Fuseau horaire configurable
Installation
1Cloner le repository
Téléchargez les fichiers sources de o2Cloud IAM :
git clone https://github.com/o2Cloud-fr/o2Cloud-IAM.git
cd o2Cloud-IAM
2Installer les dépendances
o2Cloud IAM utilise Composer pour gérer ses dépendances PHP :
composer install
Vérification des extensions PHP
Vérifiez que les extensions requises sont installées :
Installation des extensions manquantes
Ubuntu/Debian :sudo apt-get update
sudo apt-get install php-ldap php-openssl php-mbstring
sudo systemctl restart apache2
CentOS/RHEL :
sudo yum install php-ldap php-openssl php-mbstring
sudo systemctl restart httpd
Windows/XAMPP :
Éditez C:\xampp\php\php.ini et décommentez :
extension=ldap
extension=openssl
extension=mbstring
Redémarrez Apache depuis le panneau de contrôle XAMPP.
3Configuration des certificats SSL (LDAPS)
Windows (XAMPP)
Étape 1 : Exporter le certificat CA depuis Active Directory
Sur le contrôleur de domaine Windows, ouvrez PowerShell en administrateur :
# Créer le dossier temporaire
New-Item -Path "C:\temp" -ItemType Directory -Force
# Exporter le certificat CA
$caName = "Votre-CA-Name" # Ex: contoso-DC-CA
$cert = Get-ChildItem -Path "Cert:\LocalMachine\Root" | Where-Object {$_.Subject -match $caName}
if ($cert) {
# Export en format Base64 (PEM)
$base64 = [System.Convert]::ToBase64String($cert.RawData)
# Créer le fichier PEM
$pem = "-----BEGIN CERTIFICATE-----`r`n"
for ($i = 0; $i -lt $base64.Length; $i += 64) {
$len = [Math]::Min(64, $base64.Length - $i)
$pem += $base64.Substring($i, $len) + "`r`n"
}
$pem += "-----END CERTIFICATE-----`r`n"
# Sauvegarder
[System.IO.File]::WriteAllText("C:\temp\ca-cert.pem", $pem)
Write-Host " Certificat exporté dans C:\temp\ca-cert.pem" -ForegroundColor Green
} else {
Write-Host " Certificat CA introuvable" -ForegroundColor Red
}
Étape 2 : Installer le certificat dans XAMPP/PHP
REM Créer le dossier de configuration OpenLDAP
mkdir C:\openldap\sysconf
REM Copier le certificat
copy C:\temp\ca-cert.pem C:\openldap\sysconf\cacert.pem
REM Créer le fichier de configuration
notepad C:\openldap\sysconf\ldap.conf
Contenu du fichier C:\openldap\sysconf\ldap.conf :
# Configuration OpenLDAP pour XAMPP
TLS_CACERT C:/openldap/sysconf/cacert.pem
TLS_REQCERT demand
TLS_PROTOCOL_MIN 3.1
TLS_REQCERT demand pour valider les certificats.
TLS_REQCERT never
Linux (Ubuntu/Debian)
# Copier le certificat CA
sudo mkdir -p /etc/ldap
sudo cp ca-cert.pem /etc/ldap/cacert.pem
# Créer le fichier de configuration
sudo nano /etc/ldap/ldap.conf
Contenu de /etc/ldap/ldap.conf :
TLS_CACERT /etc/ldap/cacert.pem
TLS_REQCERT demand
Linux (RedHat/CentOS)
# Copier le certificat CA
sudo mkdir -p /etc/openldap/certs
sudo cp ca-cert.pem /etc/openldap/certs/cacert.pem
# Créer le fichier de configuration
sudo nano /etc/openldap/ldap.conf
Contenu de /etc/openldap/ldap.conf :
TLS_CACERT /etc/openldap/certs/cacert.pem
TLS_REQCERT demand
Redémarrer le serveur web :
sudo systemctl restart apache2 # Ubuntu/Debian
sudo systemctl restart httpd # CentOS/RHEL
4Configuration du serveur web
Apache
Créez un VirtualHost pour o2Cloud IAM :
<VirtualHost *:443>
ServerName iam.o2cloud.fr
DocumentRoot /var/www/o2Cloud-IAM/public
<Directory /var/www/o2Cloud-IAM/public>
AllowOverride All
Require all granted
</Directory>
SSLEngine on
SSLCertificateFile /path/to/certificate.crt
SSLCertificateKeyFile /path/to/private.key
SSLCertificateChainFile /path/to/chain.crt
ErrorLog ${APACHE_LOG_DIR}/o2cloud_iam_error.log
CustomLog ${APACHE_LOG_DIR}/o2cloud_iam_access.log combined
</VirtualHost>
Activez le VirtualHost et les modules nécessaires :
sudo a2enmod rewrite ssl
sudo a2ensite o2cloud-iam.conf
sudo systemctl reload apache2
Nginx
Créez un fichier de configuration dans /etc/nginx/sites-available/o2cloud-iam :
server {
listen 443 ssl http2;
server_name iam.o2cloud.fr;
root /var/www/o2Cloud-IAM/public;
index index.php;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/private.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
access_log /var/log/nginx/o2cloud_iam_access.log;
error_log /var/log/nginx/o2cloud_iam_error.log;
}
Activez la configuration :
sudo ln -s /etc/nginx/sites-available/o2cloud-iam /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
IIS (Windows Server)
Configuration via le gestionnaire IIS :
- Ouvrez le Gestionnaire IIS
- Clic droit sur Sites → Ajouter un site web
- Configurez :
- Nom du site : o2Cloud IAM
- Chemin physique : C:\inetpub\wwwroot\o2Cloud-IAM\public
- Liaison : HTTPS, port 443
- Certificat SSL : Sélectionnez votre certificat
- Dans Gestionnaire de réécriture d'URL, importez les règles depuis
.htaccess
5Permissions des fichiers
Linux
# Définir les permissions appropriées
sudo chmod 755 /var/www/o2Cloud-IAM
sudo chmod 755 /var/www/o2Cloud-IAM/public
sudo chmod 644 /var/www/o2Cloud-IAM/public/index.php
# Créer et sécuriser les dossiers
sudo mkdir -p /var/www/o2Cloud-IAM/config
sudo mkdir -p /var/www/o2Cloud-IAM/logs
sudo chmod 775 /var/www/o2Cloud-IAM/config
sudo chmod 775 /var/www/o2Cloud-IAM/logs
# Propriétaire : utilisateur du serveur web
sudo chown -R www-data:www-data /var/www/o2Cloud-IAM # Ubuntu/Debian
sudo chown -R apache:apache /var/www/o2Cloud-IAM # CentOS/RHEL
Windows
Configurez les permissions via l'explorateur Windows :
- Clic droit sur le dossier
o2Cloud-IAM→ Propriétés → Sécurité - Ajoutez l'utilisateur
IIS_IUSRSouIUSR - Accordez les permissions :
- Lecture & Exécution
- Afficher le contenu du dossier
- Lecture
- Pour le dossier
configetlogs, ajoutez également Écriture
config/config.php contient des informations sensibles (mot de passe du compte de service). Assurez-vous qu'il n'est pas accessible publiquement et qu'il a des permissions restrictives (chmod 600 sur Linux).
6Installation via l'interface web
Une fois le serveur web configuré, accédez à l'assistant d'installation :
Étape 1 : Configuration Active Directory
- Serveur AD : FQDN ou adresse IP (ex: dc.contoso.com)
- Port LDAP :
636pour LDAPS (recommandé)389pour LDAP+STARTTLS
- Utiliser SSL/TLS : Cochez pour LDAPS (port 636)
- Base DN : DC=contoso,DC=com
- DN du compte de service : CN=Service PWD Reset,OU=Service Accounts,DC=contoso,DC=com
- Mot de passe du compte de service
Étape 2 : Configuration de la sécurité
- Contrôle d'accès par groupe AD : Activez pour restreindre l'accès
- DN du groupe d'autorisation : CN=Reset_Password_Web,OU=Security,OU=Grps,DC=contoso,DC=com
- Timeout de session : 900 secondes (15 minutes)
- Tentatives de connexion max : 5
Étape 3 : Politique de mot de passe
- Longueur minimale : 12 caractères (recommandé)
- Exiger majuscule : Oui
- Exiger minuscule : Oui
- Exiger chiffre : Oui
- Exiger caractère spécial : Oui
Étape 4 : Paramètres de l'application
- Nom de l'application : o2Cloud IAM
- Langue : Français / English
- Fuseau horaire : Europe/Paris
Validation de l'installation
L'assistant testera automatiquement :
- Connexion au serveur LDAP/LDAPS
- Authentification du compte de service
- Accessibilité du Base DN
- Existence du groupe d'autorisation (si configuré)
Une fois validé, cliquez sur "Enregistrer et terminer". Le fichier config/config.php sera généré automatiquement.
Configuration Active Directory
Structure de configuration
Les paramètres Active Directory sont stockés dans config/config.php :
'ad' => [
'server' => 'dc.contoso.com', // FQDN du contrôleur de domaine
'port' => 636, // 636 = LDAPS, 389 = LDAP
'use_ssl' => true, // true = LDAPS, false = LDAP
'base_dn' => 'DC=contoso,DC=com', // Distinguished Name de base
'service_account_dn' => 'CN=Service PWD Reset,OU=Service Accounts,DC=contoso,DC=com',
'service_account_password' => 'MotDePasseSecurise123!',
],
Choix du protocole
| Protocole | Port | use_ssl | Description |
|---|---|---|---|
| LDAPS | 636 | true | Connexion SSL/TLS directe (recommandé) |
| LDAP+STARTTLS | 389 | false | Chiffrement après connexion initiale |
Compte de service Active Directory
Création du compte
Le compte de service est un compte AD utilisé par o2Cloud IAM pour se connecter à Active Directory et effectuer les changements de mots de passe.
Étape 1 : Créer le compte dans AD
- Ouvrez Active Directory Users and Computers
- Naviguez vers l'OU
Service Accounts(créez-la si nécessaire) - Clic droit → Nouveau → Utilisateur
- Configurez :
- Prénom : Service
- Nom : PWD Reset
- Nom d'ouverture de session : srv_pwd_reset
- Définissez un mot de passe fort et complexe
- Cochez :
- Le mot de passe n'expire jamais
- L'utilisateur ne peut pas changer de mot de passe
Étape 2 : Récupérer le Distinguished Name
Ouvrez les propriétés du compte → onglet Éditeur d'attributs → copiez la valeur de distinguishedName
Exemple : CN=srv_pwd_reset,OU=Service Accounts,DC=contoso,DC=com
Permissions requises
Le compte de service doit avoir les permissions suivantes :
| Permission | Portée | Usage |
|---|---|---|
| Read | Base DN et sous-objets | Rechercher les utilisateurs dans l'annuaire |
| Reset Password | Objets utilisateurs | Réinitialiser les mots de passe |
| Read Members | Groupe d'autorisation | Vérifier l'appartenance au groupe |
Délégation de contrôle
Pour accorder les permissions au compte de service :
Méthode 1 : Assistant de délégation (recommandé)
- Ouvrez Active Directory Users and Computers
- Clic droit sur l'OU contenant les utilisateurs → Déléguer le contrôle
- Cliquez sur Suivant
- Cliquez sur Ajouter et sélectionnez le compte de service
- Cliquez sur Suivant
- Sélectionnez "Réinitialiser les mots de passe utilisateur et forcer le changement de mot de passe à l'ouverture de session suivante"
- Cliquez sur Suivant puis Terminer
Méthode 2 : Permissions avancées (manuel)
- Clic droit sur l'OU → Propriétés → onglet Sécurité
- Cliquez sur Avancé
- Cliquez sur Ajouter
- Sélectionnez le compte de service
- Dans Type :
Autoriser - Dans S'applique à :
Objets utilisateur descendants - Cochez les permissions :
- Réinitialiser le mot de passe
- Lire toutes les propriétés
- Cliquez sur OK pour appliquer
Groupe d'autorisation (optionnel)
Le groupe d'autorisation permet de contrôler qui peut utiliser o2Cloud IAM.
Création du groupe
- Ouvrez Active Directory Users and Computers
- Naviguez vers l'OU
Security/Grps(créez-la si nécessaire) - Clic droit → Nouveau → Groupe
- Configurez :
- Nom du groupe : Reset_Password_Web
- Type de groupe : Sécurité
- Étendue du groupe : Globale
- Ajoutez une description : "Utilisateurs autorisés à changer leur mot de passe via le portail web"
Ajout des membres
Double-cliquez sur le groupe → onglet Membres → Ajouter → Sélectionnez les utilisateurs
Récupération du Distinguished Name
Propriétés du groupe → Éditeur d'attributs → copiez distinguishedName
Exemple : CN=Reset_Password_Web,OU=Grps,OU=Security,DC=contoso,DC=com
Désactivation du contrôle par groupe
Pour permettre à tous les utilisateurs AD d'utiliser o2Cloud IAM, éditez config/config.php :
'security' => [
'group_enabled' => false, // Désactiver le contrôle par groupe
// ...
],
Configuration de la sécurité
Les paramètres de sécurité dans config/config.php :
'security' => [
'group_enabled' => true,
'authorized_group_dn' => 'CN=Reset_Password_Web,OU=Security,OU=Grps,DC=contoso,DC=com',
'session_timeout' => 900, // 15 minutes
'max_login_attempts' => 5, // 5 tentatives avant blocage
],
Session timeout
Durée d'inactivité avant expiration de la session (en secondes) :
600= 10 minutes900= 15 minutes (recommandé)1800= 30 minutes
Tentatives de connexion
Nombre de tentatives de connexion échouées avant blocage temporaire (15 minutes) :
3= Très strict5= Recommandé10= Permissif
Politique de mots de passe
o2Cloud IAM applique ses propres règles de complexité en plus des règles Active Directory.
'password_policy' => [
'min_length' => 12, // Longueur minimale
'require_uppercase' => true, // Au moins une majuscule
'require_lowercase' => true, // Au moins une minuscule
'require_numbers' => true, // Au moins un chiffre
'require_special_chars' => true, // Au moins un caractère spécial
],
Recommandations ANSSI
L'Agence Nationale de la Sécurité des Systèmes d'Information (ANSSI) recommande :
- Minimum 12 caractères avec complexité
- Minimum 16 caractères sans exigence de complexité
- Pas de règles trop contraignantes qui favorisent les mauvaises pratiques
Configuration recommandée
| Contexte | min_length | Complexité |
|---|---|---|
| Standard entreprise | 12 | Tous les critères activés |
| Haute sécurité | 16 | Tous les critères activés |
| Utilisateurs avancés | 20 | Complexité optionnelle |
Configuration manuelle
Si vous préférez configurer manuellement sans utiliser l'assistant, créez le fichier config/config.php :
<?php
/**
* Configuration o2Cloud IAM
* Généré manuellement
*/
return [
'ad' => [
'server' => 'dc.contoso.com',
'port' => 636,
'use_ssl' => true,
'base_dn' => 'DC=contoso,DC=com',
'service_account_dn' => 'CN=srv_pwd_reset,OU=Service Accounts,DC=contoso,DC=com',
'service_account_password' => 'VotreMotDePasseSecurise123!',
],
'security' => [
'group_enabled' => true,
'authorized_group_dn' => 'CN=Reset_Password_Web,OU=Security,OU=Grps,DC=contoso,DC=com',
'session_timeout' => 900,
'max_login_attempts' => 5,
],
'app' => [
'name' => 'o2Cloud IAM',
'locale' => 'fr',
'timezone' => 'Europe/Paris',
],
'password_policy' => [
'min_length' => 12,
'require_uppercase' => true,
'require_lowercase' => true,
'require_numbers' => true,
'require_special_chars' => true,
],
];
Permissions du fichier
config/config.php contient des informations sensibles. Protégez-le avec des permissions restrictives :
# Linux
chmod 600 config/config.php
chown www-data:www-data config/config.php
Sur Windows, restreignez l'accès au compte IIS uniquement.
Bonnes pratiques de sécurité
Implémentées par o2Cloud IAM
- LDAPS ou STARTTLS : Chiffrement des communications
- Validation des certificats : Vérification de l'identité du serveur
- Protection CSRF : Tokens anti-Cross-Site Request Forgery
- Validation des entrées : Sanitization contre injections LDAP
- Anti-brute force : Limitation des tentatives
- Session timeout : Expiration automatique
- Logs détaillés : Traçabilité complète des actions
- Hachage sécurisé : Bcrypt pour les données sensibles
Recommandations de déploiement
1. HTTPS obligatoire
- Utilisez un certificat commercial (Let's Encrypt, DigiCert, etc.)
- Configurez HSTS (HTTP Strict Transport Security)
- Forcez la redirection HTTP → HTTPS
2. Firewall et segmentation réseau
- Limitez l'accès LDAP/LDAPS au serveur web uniquement
- Utilisez un firewall pour filtrer les connexions entrantes
- Placez o2Cloud IAM dans une DMZ si accessible depuis Internet
# Exemple iptables (Linux)
# Autoriser uniquement le serveur web à se connecter au DC
iptables -A OUTPUT -p tcp -d 10.0.0.10 --dport 636 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 636 -j DROP
3. Validation des certificats
TLS_REQCERT demand dans ldap.conf pour valider les certificats.
4. Compte de service
- Utilisez un mot de passe fort (minimum 20 caractères)
- Changez le mot de passe régulièrement (tous les 6 mois)
- N'accordez que les permissions strictement nécessaires
- Surveillez les connexions du compte dans les logs AD
5. Fichier de configuration
# Linux - Permissions restrictives
chmod 600 config/config.php
chown www-data:www-data config/config.php
# Vérifier que le fichier n'est pas accessible via le web
curl https://iam.o2cloud.fr/config/config.php
# Doit retourner 403 Forbidden
6. Surveillance des logs
- Consultez régulièrement les logs dans
logs/ - Surveillez les tentatives de connexion échouées
- Alertez sur les erreurs LDAP répétées
- Archivez les logs pour audit et conformité
7. Mises à jour
- Maintenez PHP et les extensions à jour
- Appliquez les mises à jour de sécurité du serveur web
- Mettez à jour o2Cloud IAM lors des nouvelles versions
8. Sauvegarde
- Sauvegardez le fichier
config/config.php - Sauvegardez les logs dans
logs/ - Documentez votre configuration AD (compte de service, groupes, etc.)
LDAPS - Configuration détaillée
Pourquoi LDAPS ?
Active Directory refuse les modifications de mots de passe sur une connexion non chiffrée. LDAPS (ou STARTTLS) est donc obligatoire pour o2Cloud IAM.
LDAPS vs LDAP+STARTTLS
| Protocole | Port | Avantages | Inconvénients |
|---|---|---|---|
| LDAPS | 636 |
• Chiffrement dès la connexion • Plus simple à configurer • Standard de facto |
• Nécessite un port dédié |
| STARTTLS | 389 |
• Utilise le port LDAP standard • Moins de ports firewall |
• Connexion initiale non chiffrée • Légèrement plus complexe |
Vérification de la configuration LDAPS
Test de connectivité
# Tester l'accès au port LDAPS
telnet dc.contoso.com 636
# Ou avec openssl
openssl s_client -connect dc.contoso.com:636 -showcerts
Test avec ldapsearch
# Linux - Test LDAPS
ldapsearch -H ldaps://dc.contoso.com:636 \
-D "CN=srv_pwd_reset,OU=Service Accounts,DC=contoso,DC=com" \
-W -b "DC=contoso,DC=com" "(objectClass=user)" cn
# Test STARTTLS
ldapsearch -H ldap://dc.contoso.com:389 -ZZ \
-D "CN=srv_pwd_reset,OU=Service Accounts,DC=contoso,DC=com" \
-W -b "DC=contoso,DC=com" "(objectClass=user)" cn
Résolution des problèmes de certificat
Erreur "Can't contact LDAP server"
Cause : Le certificat CA n'est pas reconnu par le système.
Solution :
- Vérifiez que le fichier CA est au bon emplacement :
- Windows :
C:\openldap\sysconf\cacert.pem - Linux :
/etc/ldap/cacert.pemou/etc/openldap/certs/cacert.pem
- Windows :
- Vérifiez le contenu du fichier
ldap.conf - Redémarrez le serveur web après modification
Erreur "certificate verify failed"
Cause : Le certificat du serveur AD ne correspond pas au certificat CA.
Solution :
- Vérifiez que vous avez exporté le bon certificat CA (celui qui a signé le certificat du DC)
- Le nom du serveur AD doit correspondre au CN du certificat
- Utilisez le FQDN complet (ex:
dc01.contoso.com) et non l'IP
Contournement temporaire (DEV uniquement)
# ldap.conf - DEV UNIQUEMENT
TLS_REQCERT never
Logs & Audit
o2Cloud IAM génère trois types de logs dans le dossier logs/ :
1. access.log
Enregistre toutes les tentatives de connexion (réussies et échouées).
[2026-01-03 14:23:45] [192.168.1.100] Authentification réussie pour: jdupont@contoso.com
[2026-01-03 14:25:12] [192.168.1.101] Échec d'authentification pour: mmartin@contoso.com
[2026-01-03 14:26:33] [192.168.1.100] Authentification réussie pour: sdurand@contoso.com
Surveillance
- Surveillez les échecs répétés depuis la même IP (tentative de brute force)
- Alertez sur les connexions en dehors des heures de travail
- Vérifiez les connexions depuis des IPs inhabituelles
2. password_changes.log
Enregistre tous les changements de mots de passe.
[2026-01-03 14:30:15] [192.168.1.100] Tentative de modification pour: CN=Jean Dupont,OU=Users,DC=contoso,DC=com
[2026-01-03 14:30:16] [192.168.1.100] Mot de passe modifié avec succès pour: CN=Jean Dupont,OU=Users,DC=contoso,DC=com
[2026-01-03 14:32:45] [192.168.1.102] Tentative de modification pour: CN=Sophie Durand,OU=Users,DC=contoso,DC=com
[2026-01-03 14:32:46] [192.168.1.102] Mot de passe modifié avec succès pour: CN=Sophie Durand,OU=Users,DC=contoso,DC=com
Conformité
- Archivez ces logs pour audit et conformité (RGPD, ISO 27001, etc.)
- Conservez les logs pendant la durée requise par votre politique de sécurité
- Protégez les logs avec des permissions restrictives
3. errors.log
Enregistre toutes les erreurs applicatives et LDAP.
[2026-01-03 14:35:22] [192.168.1.103] Impossible de se connecter au serveur LDAP: dc.contoso.com
[2026-01-03 14:36:45] [192.168.1.104] Échec de modification du mot de passe pour CN=Test User,DC=contoso,DC=com - Erreur LDAP #53: Server is unwilling to perform
[2026-01-03 14:38:12] [192.168.1.105] Erreur 53: Le serveur ne veut pas effectuer l'opération. Vérifiez que LDAPS est utilisé.
Dépannage
- Consultez ce fichier en cas de problème
- Les codes d'erreur LDAP sont détaillés pour faciliter le diagnostic
- Surveillez les erreurs récurrentes (problème de configuration)
Rotation des logs
Pour éviter que les logs ne deviennent trop volumineux, configurez une rotation :
Linux (logrotate)
Créez /etc/logrotate.d/o2cloud-iam :
/var/www/o2Cloud-IAM/logs/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 www-data www-data
sharedscripts
}
Windows (PowerShell)
Créez une tâche planifiée qui exécute ce script :
# Rotate-O2CloudLogs.ps1
$logsPath = "C:\inetpub\wwwroot\o2Cloud-IAM\logs"
$maxAge = 30 # jours
Get-ChildItem -Path $logsPath -Filter "*.log" |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$maxAge) } |
Remove-Item -Force
Analyse des logs
Exemples de commandes utiles :
# Linux - Compter les connexions réussies aujourd'hui
grep "$(date +%Y-%m-%d)" logs/access.log | grep "réussie" | wc -l
# Compter les échecs aujourd'hui
grep "$(date +%Y-%m-%d)" logs/access.log | grep "Échec" | wc -l
# Lister les changements de mot de passe
grep "succès" logs/password_changes.log | tail -n 20
# Trouver les erreurs LDAP
grep "Erreur LDAP" logs/errors.log | tail -n 10
Dépannage
Erreur : Cannot connect to LDAP server
Causes possibles
- Le serveur AD n'est pas accessible
- Le port LDAP/LDAPS est bloqué
- Extension PHP LDAP manquante
- Pare-feu bloque la connexion
Solutions
1. Vérifier la connectivité réseau
# Ping du serveur AD
ping dc.contoso.com
# Test du port LDAPS
telnet dc.contoso.com 636
# Ou avec nmap
nmap -p 636 dc.contoso.com
2. Vérifier l'extension LDAP
php -m | grep ldap
Si aucune sortie, installez l'extension (voir section Installation).
3. Vérifier la configuration DNS
# Résolution DNS du serveur AD
nslookup dc.contoso.com
# Doit retourner une adresse IP valide
4. Vérifier les logs du serveur web
# Apache
tail -f /var/log/apache2/error.log
# Nginx
tail -f /var/log/nginx/error.log
Erreur : Can't contact LDAP server (Code: -1)
Cause
Le certificat CA n'est pas reconnu par PHP/OpenLDAP.
Solutions
1. Vérifier l'emplacement du certificat
# Windows
dir C:\openldap\sysconf\cacert.pem
# Linux (Ubuntu/Debian)
ls -la /etc/ldap/cacert.pem
# Linux (RHEL/CentOS)
ls -la /etc/openldap/certs/cacert.pem
2. Vérifier le contenu de ldap.conf
# Windows
type C:\openldap\sysconf\ldap.conf
# Linux
cat /etc/ldap/ldap.conf
Le fichier doit contenir :
TLS_CACERT /chemin/vers/cacert.pem
TLS_REQCERT demand
3. Vérifier le format du certificat
Le certificat doit être au format PEM :
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAKB...
(contenu base64)
-----END CERTIFICATE-----
4. Redémarrer le serveur web
# Apache (Ubuntu)
sudo systemctl restart apache2
# Apache (CentOS)
sudo systemctl restart httpd
# Windows/XAMPP
Redémarrer depuis le panneau de contrôle XAMPP
5. Test avec openssl
openssl s_client -connect dc.contoso.com:636 -CAfile /chemin/vers/cacert.pem
6. Solution temporaire (DEV uniquement)
# ldap.conf - NE PAS UTILISER EN PRODUCTION
TLS_REQCERT never
7. Alternative : Utiliser STARTTLS sur port 389
Si LDAPS pose trop de problèmes de certificats, utilisez STARTTLS :
'ad' => [
'server' => 'dc.contoso.com',
'port' => 389, // Port LDAP standard
'use_ssl' => false, // STARTTLS s'activera automatiquement
// ...
],
Erreur : Server is unwilling to perform (Code: 53)
Cause
Active Directory refuse le changement de mot de passe car la connexion n'est pas chiffrée.
Solutions
1. Vérifier que LDAPS est utilisé
Dans config/config.php :
'ad' => [
'server' => 'dc.contoso.com',
'port' => 636, // Doit être 636 pour LDAPS
'use_ssl' => true, // Doit être true
// ...
],
2. Vérifier que le certificat CA est configuré
Voir la section "Configuration des certificats SSL".
3. Tester avec ldapmodify
# Créer un fichier test.ldif
cat > test.ldif << 'EOF'
dn: CN=Test User,OU=Users,DC=contoso,DC=com
changetype: modify
replace: unicodePwd
unicodePwd::IgBOAGUAdwBQAGEAcwBzAHcAbwByAGQAMQAyADMAIQAiAA==
EOF
# Tester avec ldapmodify
ldapmodify -H ldaps://dc.contoso.com:636 \
-D "CN=srv_pwd_reset,OU=Service Accounts,DC=contoso,DC=com" \
-W -f test.ldif
Erreur : Constraint violation (Code: 19)
Cause
Le mot de passe ne respecte pas la politique Active Directory.
Solutions
- Vérifiez les exigences de la politique de mots de passe AD :
- Longueur minimale
- Complexité requise
- Historique des mots de passe
- Âge minimum du mot de passe
- Vérifiez que le nouveau mot de passe est différent des N derniers mots de passe (historique AD)
- Assurez-vous que l'utilisateur peut changer son mot de passe (âge minimum respecté)
Erreur : Insufficient access rights (Code: 50)
Cause
Le compte de service n'a pas les permissions pour réinitialiser les mots de passe.
Solutions
- Vérifiez que le compte de service existe et est actif dans AD
- Vérifiez la délégation de contrôle (voir section "Délégation de contrôle")
- Accordez la permission "Reset Password" sur l'OU contenant les utilisateurs
- Testez manuellement avec le compte de service :
# Se connecter avec le compte de service runas /user:contoso\srv_pwd_reset "dsa.msc" # Essayer de réinitialiser manuellement un mot de passe
Erreur : User is not authorized to change passwords
Cause
L'utilisateur n'est pas membre du groupe d'autorisation configuré.
Solutions
1. Vérifier l'appartenance au groupe
# PowerShell - Vérifier les groupes d'un utilisateur
Get-ADUser -Identity "jdupont" -Properties MemberOf |
Select-Object -ExpandProperty MemberOf
2. Ajouter l'utilisateur au groupe
# PowerShell
Add-ADGroupMember -Identity "Reset_Password_Web" -Members "jdupont"
3. Désactiver le contrôle par groupe (temporairement)
Dans config/config.php :
'security' => [
'group_enabled' => false, // Désactive le contrôle
// ...
],
4. Vérifier le DN du groupe
Le DN dans la configuration doit correspondre exactement au DN dans AD :
# PowerShell - Récupérer le DN du groupe
Get-ADGroup -Identity "Reset_Password_Web" |
Select-Object -ExpandProperty DistinguishedName
Page de diagnostic
o2Cloud IAM inclut une page de diagnostic complète accessible à :
Informations fournies
- Extensions PHP : Vérification de
php-ldap,php-openssl,php-mbstring - Connexion Active Directory : Test de connexion au serveur LDAP/LDAPS
- Authentification du compte de service : Validation du binding
- Accessibilité du Base DN : Vérification des droits de lecture
- Groupe d'autorisation : Vérification de l'existence du groupe
- Configuration actuelle : Affichage des paramètres (sans mots de passe)
- Logs récents : Dernières erreurs enregistrées
- Informations système : Version PHP, modules chargés
Utilisation
- Accédez à
/diagnostic.php - Lisez attentivement les messages d'erreur
- Corrigez les problèmes signalés
- Rafraîchissez la page pour re-tester
Protection de la page de diagnostic
Méthode 1 : Suppression (recommandé)
# Linux
rm /var/www/o2Cloud-IAM/public/diagnostic.php
# Windows
del C:\inetpub\wwwroot\o2Cloud-IAM\public\diagnostic.php
Méthode 2 : Protection par IP (Apache)
Ajoutez dans .htaccess :
<Files "diagnostic.php">
Order deny,allow
Deny from all
Allow from 192.168.1.0/24
Allow from 127.0.0.1
</Files>
Méthode 3 : Protection par IP (Nginx)
location = /diagnostic.php {
allow 192.168.1.0/24;
allow 127.0.0.1;
deny all;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
FAQ - Questions fréquentes
Général
Q : Quelle est la différence entre LDAP et LDAPS ?
R : LDAP (port 389) est le protocole standard non chiffré. LDAPS (port 636) est la version chiffrée avec SSL/TLS. Pour changer les mots de passe Active Directory, vous devez utiliser LDAPS ou LDAP+STARTTLS.
Q : Puis-je utiliser o2Cloud IAM sans groupe d'autorisation ?
R : Oui, définissez 'group_enabled' => false dans la configuration. Tous les utilisateurs AD pourront alors utiliser l'application.
Q : Combien d'utilisateurs peuvent utiliser o2Cloud IAM simultanément ?
R : Il n'y a pas de limite technique. La performance dépend de votre serveur web et de votre contrôleur de domaine.
Q : o2Cloud IAM fonctionne-t-il avec Azure AD ?
R : Non, o2Cloud IAM est conçu pour Active Directory on-premise. Pour Azure AD, utilisez le portail self-service de Microsoft.
Q : Puis-je personnaliser l'interface ?
R : Oui, vous pouvez modifier les fichiers dans views/ pour personnaliser l'apparence. L'interface utilise TailwindCSS.
Installation & Configuration
Q : Dois-je installer o2Cloud IAM sur le contrôleur de domaine ?
R : Non, et ce n'est pas recommandé. Installez o2Cloud IAM sur un serveur web séparé pour des raisons de sécurité.
Q : Quel certificat SSL dois-je utiliser ?
R : Pour le serveur web (HTTPS), utilisez un certificat commercial ou Let's Encrypt. Pour LDAPS, vous devez configurer le certificat CA de votre Active Directory.
Q : Puis-je utiliser un certificat auto-signé pour LDAPS ?
R : Oui, mais vous devez l'importer dans le magasin de certificats du serveur web et configurer ldap.conf correctement.
Q : Comment changer le port du serveur web ?
R : Modifiez la configuration de votre VirtualHost Apache ou serveur Nginx pour écouter sur le port souhaité.
Sécurité & Permissions
Q : Quelles permissions AD minimales sont requises ?
R : Le compte de service doit avoir :
- Read sur le Base DN
- Reset Password sur les objets utilisateurs
- Read Members sur le groupe d'autorisation (si utilisé)
Q : Le compte de service peut-il être un compte d'utilisateur standard ?
R : Oui, c'est même recommandé. N'utilisez pas un compte administrateur de domaine.
Q : Comment désactiver temporairement le contrôle par groupe ?
R : Éditez config/config.php et définissez 'group_enabled' => false.
Q : Les mots de passe sont-ils stockés quelque part ?
R : Non. Les mots de passe ne sont jamais stockés. Ils sont transmis directement à Active Directory via LDAPS puis oubliés.
Dépannage
Q : L'erreur "Can't contact LDAP server" apparaît, que faire ?
R : Vérifiez :
- La connectivité réseau au DC (ping, telnet port 636)
- Que l'extension php-ldap est installée
- Que le certificat CA est correctement configuré
- Consultez la section "Dépannage LDAPS"
Q : L'erreur 53 "Server is unwilling to perform" persiste, pourquoi ?
R : Cette erreur signifie que AD refuse le changement de mot de passe car la connexion n'est pas chiffrée. Vérifiez :
- Que
'use_ssl' => trueet'port' => 636 - Que le certificat CA est configuré
- Que LDAPS fonctionne (test avec openssl ou ldapsearch)
Q : Les logs ne s'écrivent pas, pourquoi ?
R : Vérifiez les permissions du dossier logs/. Il doit être accessible en écriture par l'utilisateur du serveur web (www-data, apache, ou IIS_IUSRS).
Q : La page de diagnostic ne s'affiche pas
R : Vérifiez que :
- Le fichier
public/diagnostic.phpexiste - La réécriture d'URL est correctement configurée
- Vous accédez à l'URL complète :
https://iam.o2cloud.fr/diagnostic.php
Maintenance
Q : Comment mettre à jour o2Cloud IAM ?
R :
- Sauvegardez
config/config.phpetlogs/ - Téléchargez la nouvelle version
- Remplacez les fichiers (sauf
config/etlogs/) - Exécutez
composer install - Testez avec
/diagnostic.php
Q : Comment sauvegarder o2Cloud IAM ?
R : Sauvegardez :
config/config.php(contient toute la configuration)logs/(pour l'audit)- Votre configuration de VirtualHost
- Votre documentation des comptes AD utilisés
Q : À quelle fréquence dois-je vérifier les logs ?
R : Selon vos besoins de sécurité :
- Quotidiennement : Environnements sensibles
- Hebdomadairement : Environnements standards
- Mensuellement : Petites organisations
Q : Comment archiver les logs ?
R : Utilisez logrotate (Linux) ou une tâche planifiée (Windows) pour archiver et compresser les logs automatiquement. Conservez les archives selon votre politique de rétention.
Glossaire
| Terme | Définition |
|---|---|
| Active Directory (AD) | Service d'annuaire de Microsoft pour gérer les utilisateurs, ordinateurs et ressources dans un domaine Windows. |
| Base DN | Distinguished Name de base définissant le point de départ des recherches LDAP (ex: DC=contoso,DC=com). |
| Binding | Opération d'authentification auprès du serveur LDAP avant d'effectuer des requêtes. |
| CSRF | Cross-Site Request Forgery - Attaque où un site malveillant force l'utilisateur à exécuter des actions non désirées. |
| Distinguished Name (DN) | Nom unique identifiant un objet dans Active Directory (ex: CN=Jean Dupont,OU=Users,DC=contoso,DC=com). |
| FQDN | Fully Qualified Domain Name - Nom de domaine complet (ex: dc01.contoso.com). |
| IAM | Identity and Access Management - Gestion des identités et des accès. |
| LDAP | Lightweight Directory Access Protocol - Protocole d'accès aux annuaires (port 389). |
| LDAPS | LDAP over SSL/TLS - Version chiffrée de LDAP (port 636). |
| OU | Organizational Unit - Unité d'organisation dans Active Directory pour structurer les objets. |
| STARTTLS | Extension LDAP permettant de chiffrer une connexion initialement non chiffrée. |
| UPN | User Principal Name - Identifiant de connexion au format email (ex: jdupont@contoso.com). |
| VirtualHost | Configuration Apache/Nginx permettant d'héberger plusieurs sites sur un même serveur. |
Codes d'erreur LDAP
Référence des codes d'erreur LDAP les plus courants rencontrés avec o2Cloud IAM :
| Code | Nom | Description | Solution |
|---|---|---|---|
| -1 | Can't contact server | Impossible de contacter le serveur LDAP | Vérifiez la connectivité réseau, le port et les certificats |
| 19 | Constraint violation | Violation de contrainte (politique de mot de passe) | Le mot de passe ne respecte pas la politique AD |
| 32 | No such object | Objet introuvable | Vérifiez le DN (utilisateur ou groupe) |
| 49 | Invalid credentials | Identifiants invalides | Nom d'utilisateur ou mot de passe incorrect |
| 50 | Insufficient access | Permissions insuffisantes | Le compte de service n'a pas les droits nécessaires |
| 53 | Server unwilling to perform | Le serveur refuse l'opération | Connexion non chiffrée - Utilisez LDAPS |
| 65 | Object class violation | Violation de classe d'objet | Opération non supportée sur ce type d'objet |
| 68 | Already exists | L'objet existe déjà | Nom en doublon dans l'annuaire |
Checklist de déploiement
Utilisez cette checklist pour valider votre déploiement en production :
Pré-installation
- Serveur web prêt (Apache/Nginx/IIS)
- PHP 8.0+ installé
- Extensions PHP : ldap, openssl, mbstring
- Composer installé
- Certificat SSL pour le serveur web
- Accès au contrôleur de domaine (port 636 ou 389)
Active Directory
- Compte de service créé
- Permissions "Reset Password" déléguées
- Groupe d'autorisation créé (optionnel)
- Utilisateurs ajoutés au groupe
- Certificat CA exporté au format PEM
Installation
- Fichiers o2Cloud IAM déployés
- Dépendances Composer installées
- Certificat CA configuré (ldap.conf)
- VirtualHost configuré
- Permissions fichiers correctes
- Dossiers config/ et logs/ créés
Configuration
- Assistant d'installation complété
- Connexion AD testée et validée
- Groupe d'autorisation vérifié
- Politique de mots de passe définie
- Timeout de session configuré
Sécurité
- HTTPS activé et fonctionnel
- Certificat SSL valide
- LDAPS (port 636) utilisé
- TLS_REQCERT demand configuré
- config.php protégé (chmod 600)
- Firewall configuré
- Page diagnostic protégée ou supprimée
Tests
- Page de diagnostic OK
- Connexion utilisateur fonctionnelle
- Changement de mot de passe OK
- Contrôle par groupe fonctionnel
- Logs écrits correctement
- Interface responsive testée
- Mode sombre/clair fonctionnel
Monitoring
- Rotation des logs configurée
- Surveillance des logs en place
- Alertes configurées (optionnel)
- Sauvegarde planifiée
Documentation
- Configuration documentée
- Comptes AD documentés
- Procédure de restauration rédigée
- Contact support défini
Support & Contact
Support technique
Contactez-nous pour toute question technique ou problème rencontré.
admin@o2cloud.frRéponse sous 24-48h ouvrées
Documentation
Documentation complète en ligne et fichier README.md inclus.
Consulter la documentationMise à jour régulière
Installation pro
Installation clé en main par nos techniciens en connexion à distance.
Demander un devis120€ TTC - Installation complète
Informations utiles
- Site web : o2cloud.fr
- GitHub : github.com/o2Cloud-fr/o2Cloud-IAM
- Version actuelle : 1.0
- Dernière mise à jour : Janvier 2026
o2Cloud IAM - Identity & Access Management pour Active Directory
© 2026 o2Cloud - Tous droits réservés - Made with in France