Le Centre de recherche

Nos tutelles

Rechercher




Accueil du site > Pages personnelles > FACQ Anne

Gestion des comptes d’un annuaire Active Directory via php

Le contexte est le suivant :

  • l’annuaire Active Directory est hébergé sur un serveur Windows 2003 Server
  • les scripts php sont exécutés sur un serveur Linux

Pour modifier l’annuaire Active Directory, il faut tout d’abord configurer la connexion SSL entre le serveur Linux et le serveur Windows :

  • sur le serveur Windows : mettre en place l’autorite de certification et generer le certificat du serveur windowd
  • configurer le serveur Linux

On peut alors utiliser les fonctions php d’ajout/modification/suppresion d’information dans un annuaire ldap

Configuration de la connexion SSL

Etape 1 : mise en place de l’autorite de certification sur le serveur Windows

  • Aller dans Parametres -> Panneau de configuration -> Ajout/suppresion de programme
  • Cliquer sur Ajouter ou supprimer des composants Windows
  • Cliquer sur Services de certificats
  • Selectionner Autorite racine d’entreprise
  • Nom comme de cette Autorite de certification : nom_serveur_windows
  • Un message s’affiche Creation de la cle de cryptage
  • mettre le cdrom de Windows 2003 Server dans le lecteur de cdrom
  • Base de donnees de certificats C :\WINDOWS\system32\CertLog
  • Journal de la base de donnees de certificats C :\WINDOWS\system32\CertLog
  • On obtient un message d’avertissement : Les pages ASP (Active Server Pages doivent etre activees dans les services IIS pour permettre aux services de certificats de fournir des services d’inscription par le Web. L’activation des pages ASP represente un risque potentiel pour la securite et doit etre calcule precisemment. Vous pouvez activer les pages ASP ulterieurement si vous dcidez de ne pas le faire maintenant. Les services IIS doivent etre ensuite manuellement reconfigures pour activer des fonctionnalite. Voulez-vous activer les pages ASP maintenant ? => il faut repondre non

    NB : Si l’on a répondu oui il faut désactiver ASP en effectuant les opérations suivantes :

    • Aller dans Démarrer -> Outils d’administration -> Gestionnaire des services Internet
    • Puis cliquer dans le menu de gauche dans Extensions du service Web puis dans Active Server Pages (ASP) qui etait autorise et avec, le bouton droit de la souris, selectionner Interdire
  • le service de certification est alors lancé

Etape 2 : génération du certificat du serveur windows

  • Sur le serveur Windows, aller dans Panneau de configuration -> Autorite de Certification
  • puis cliquer sur nom_serveur_windows puis clic droit souris pour afficher les proprietes
  • puis cliquer sur le bouton Afficher le certificat
  • puis cliquer sur l’onglet Details
  • puis cliquer sur le bouton Copier dans un fichier
  • choisir comme format d’exportation : base 64 X.509
  • le fichier s’appelle nom_serveur_windows.cer

Etape 3 : configuration du serveur Linux qui heberge le formulaire php

  • copier le fichier nom_serveur_windows.cer sur le serveur Linux dans /etc/pki/tls/certs/
  • sur le serveur Linux, generer le certificat au format pem openssl x509 -in nom_serveur_windows.cer -out nom_serveur_windows.pem
  • Modifier le fichier /etc/hosts sur le serveur Linux en ajoutant la ligne
    1.2.3.4    nom_serveur_windows.crpp-bordeaux.cnrs.fr nom_serveur_windows
    
    (ou 1.2.3.4 est l’adresse IP du serveur Windows) afin que le nom de machine dans le certificat nom_serveur_windows.pem (qui est nom_serveur_windows.crpp-bordeaux.cnrs.fr) matche avec le nom du serveur Windows
  • modifier le fichier /etc/openldap/ldap.conf afin d’utiliser le certificat nom_serveur_windows.pem
    TLS_CACERTDIR /etc/pki/tls/certs
    
  • IMPORTANT : pour lire le contenu du certificat de la machine nom_serveur_windows
    openssl x509 -in /etc/pki/tls/certs/nom_serveur_windows.pem -text | less
    
  • Tester si le port SSL (636) est ouvert sur le serveur Windows
    telnet nom_serveur_windows 636
    Trying 147.210.83.11...
    Connected to nom_serveur_windows.crpp-bordeaux.cnrs.fr (147.210.83.11).
    Escape character is ’^]’.
    
  • IMPORTANT : Pour debugger la connexion SSL au serveur nom_serveur_windows, il faut utiliser l’option -d 9 :
    ldapsearch -d 9 -x -H "ldaps ://nom_serveur_windows" -Dcn=Administrateur,cn=Users,dc=test,dc=crpp-bordeaux,dc=cnrs,dc=fr -b "dc=test,dc=crpp-bordeaux,dc=cnrs,dc=fr" -W 
    
  • NB : il faut parfois attendre quelques minutes que le service soit lance sur le serveur Windows
  • Sur le serveur Linux, en lancant un strace, on peut voir qu’il lit bien le fichier de certificat
    strace -o /tmp/ldapsearch-nom_serveur_windows.log -vfF ldapsearch -x -H "ldaps ://nom_serveur_windows.test.crpp-bordeaux.cnrs.fr" -Dcn=Administrateur,cn=Users,dc=test,dc=crpp-bordeaux,dc=cnrs,dc=fr -b "dc=test,dc=crpp-bordeaux,dc=cnrs,dc=fr" -W 
    
  •  !! a chaque fois que l’on regenere sur le serveur Windows le certificat du serveur nom_serveur_windows, il faut regenerer sur le serveur Linux la derniere version du certificat serveur
    openssl x509 -in nom_serveur_windows.cer -out nom_serveur_windows.pem
    

    Sinon on obtient l’erreur

    TLS certificate verification : Error, unable to get local issuer certificate
    TLS trace : SSL3 alert write:fatal:unknown CA
    TLS trace : SSL_connect:error in SSLv3 read server certificate B
    TLS trace : SSL_connect:error in SSLv3 read server certificate B
    TLS : can’t connect.
    ldap_perror
    ldap_bind : Can’t contact LDAP server (-1)
            additional info : error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
    
  • et en lancant
    ldapsearch -x -H "ldaps ://nom_serveur_windows.test.crpp-bordeaux.cnrs.fr"
    
    - Dcn=Administrateur,cn=Users,dc=test,dc=crpp-bordeaux,dc=cnrs,dc=fr -b "dc=test,dc=crpp-bordeaux,dc=cnrs,dc=fr" -W

Gestion des comptes de l’annuaire Active Directory via un script php

Une fois que la connexion SSL fonctionne entre le serveur Linux et le serveurs Windows, on peut utiliser les fonctions php d’ajout / modification / suppression d’informations dans un annuaire ldap :

  • Voici les fonctions php utiles pour la connexion à l’annuaire Active Directory :
    • ldap_connect()
    • ldap_set_option($ds_ad, LDAP_OPT_PROTOCOL_VERSION, 3)
    • ldap_bind()
  • Voici le code php permettant d’ajouter dans l’annuaire Active Directory des informations récupérées à partir d’un formulaire php
    $dn_ad_global="CN=Users, DC=test, DC=crpp-bordeaux, DC=cnrs, DC=fr" ;
    $domaine_ad_global="test.crpp-bordeaux.cnrs.fr" ;
    

    // Attributes de l’Active Directory qui seront crees ou modifies $info_ad["objectclass"][0]="top" ; $info_ad["objectclass"][1]="user" ;

    $info_ad["sn"]=$prenom ;; $info_ad["givenName"]=$nom ; $info_ad["displayName"]=$sn ; // Pour le userPrincipalName, on ajoute le nom de domaine $info_ad["userPrincipalName"]=$uid."@".$domaine_ad ;

    // Date d’expiration $date_expiration=$mois.$annee ; if ($date_expiration==0) $time_ad=0 ;

    else $timestamp=mktime(0,0,0,$mois,28,$annee) ; // Calcul de la date d’expiration $tmp=($timestamp+11644560000)*10000000 ; $time_ad=sprintf("%.0f",$tmp) ;

    $info_ad["accountExpires"]=array($time_ad) ; // Codage du mot de passe // On met un test pour l’attribut unicodePwd afin de ne pas avoir // un mot de passe vide car sinon lors de la modification // dans l’active directory, on a le message dans les logs d’apache du // site web heberge sur le serveur Linux // Modify : Server is unwilling to perform if ($operation == "ajout" or $mot_de_passe_modifie == 1) $password=$user_password_clear ; $password="\"".$password."\"" ; $password_unicode="" ; for ($i = 0 ; $i < strlen($password) ; $i++) $password_unicode .= "$password$i\000" ; $info_ad["unicodePwd"]=array($password_unicode) ; // Mot de passe n’expire jamais // !! valable que si le mot de passe a ete saisi $info_ad["userAccountControl"]=66048 ;

    // Ajout des informations dans l’Active Directory ldap_add($ds_ad, "CN=$uid, $dn_ad" , $info_ad) ;

  • Pour modifier les informations dans l’Active Directory on utilise la fonction php
    ldap_modify($ds_ad, "CN=$uid, $dn_ad" , $info_ad)
  • Pour supprimer les informations dans l’Active Directory on utilise la fonction php
    ldap_delete($ds_ad, "CN=$uid,$dn_ad_global") ;)

Remarques :

  • quand on modifie /etc/openldap/ldap.conf sur le serveur Linux et que l’on accede a des annuaires via un script php tournant sur ce meme serveur Linux il faut relancer httpd sur ce serveur
  • Le message "Server is unwilling to perform" peut vouloir dire
    • qu’il faut une connexion SSL pour se connecter a l’Active Directory
    • que le mot de passe que l’on ajoute ou modifie dans l’Active Directory n’est pas suffisemment robuste

Réfèrences