Outils pour utilisateurs

Outils du site


activedirectoy:owncloud

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
activedirectoy:owncloud [2019/03/03 17:23]
etienne Quelques notes préliminaires à propose de l'implémentation
activedirectoy:owncloud [2019/03/03 18:31] (Version actuelle)
etienne Travail préliminaire sur l'obtention des chemins GPO avec authentification à travers TLS
Ligne 64: Ligne 64:
 ==== LDAP ==== ==== LDAP ====
  
-=== Naming context ===+=== Connexion ===
  
-La première phase est de trouver le "naming context" de l'annuaire. Pour se faire une requête anonyme sur l'annuaire permet d'obtenir cette information :+La première phase est de trouver le "naming context" de l'annuaire. Pour se faire une requête anonyme sur l'annuaire permet d'obtenir cette information. Comme cette requête permet d'obtenir des informations de configuration, nous pouvons établir la connexion à l'annuaire durant cette opération
  
 <code php> <code php>
-function get_naming_context ($server) {+function connect_ldap ($server) {
   $root = null;   $root = null;
-   
   $lc = ldap_connect($server);   $lc = ldap_connect($server);
-  if (ldap_set_option($lc, LDAP_OPT_PROTOCOL_VERSION, 3)) { +  $result = ldap_read($lc, '', '(objectclass=*)', array('defaultnamingcontext', 'supportedldapversion')); 
-    $result = ldap_read($lc, '', '(objectclass=*)', array('namingcontexts')); +  if ($result && ($entry = ldap_first_entry($lc, $result))) { 
-    if ($result && ($entry = ldap_first_entry($lc, $result))) { +    $nctx = ldap_get_values($lc, $entry, 'defaultnamingcontext'); 
-      $nctx = ldap_get_values($lc, $entry, 'namingcontexts'); +    /* first one should be the naming context, but do some checking */ 
-      /* first one should be the naming context, but do some checking */ +    for ($i = 0; $i < $nctx['count']; $i++) { 
-      for ($i = 0; $i < $nctx['count']; $i++) { +      if (is_null($root)) { $root = $nctx[$i]; continue; } 
-        if (is_null($root)) { $root = $nctx[$i]; continue; } +      if (strpos(strtolower($nctx[$i]), strtolower($root)) === FALSE) { 
-        if (strpos(strtolower($nctx[$i]), strtolower($root)) === FALSE) { +        $root = $nctx[$i]; 
-          $root = $nctx[$i];+      } 
 +    } 
 +     
 +    $opt_version = 0; 
 +    $version = ldap_get_values($lc, $entry, 'supportedldapversion'); 
 +    for ($i = 0; $i < $version['count']; $i++) { 
 +      if ($opt_version < intval($version[$i])) { 
 +        $opt_version = intval($version[$i]); 
 +      } 
 +    } 
 +    ldap_set_option($lc, LDAP_OPT_PROTOCOL_VERSION, $opt_version); 
 +  } 
 +  return array($lc, $root); 
 +
 +</code> 
 + 
 +=== Authentification === 
 + 
 +Une fois la connexion établie, nous pouvons directement nous authentifier. ActiveDirectory nécessite une authentification avec TLS activé. Il est donc nécessaire de démarrer TLS. L'administrateur a pris la peine d'établir l'autorité de confiance sur le serveur Web afin qu'il n'y ait besoin d'aucune configuration particulière. 
 + 
 +<code php> 
 +function auth_ldap ($lc, $user, $pass) { 
 +  if (ldap_start_tls($lc)) { 
 +    if (ldap_bind($lc, $user, $pass)) { 
 +      return true;  
 +    } 
 +  } 
 + 
 +  return false; 
 +
 +</code> 
 + 
 +=== Obtention des chemins GPO === 
 + 
 +Une fois authentifié, nous avons un utilisateur valide, donc pouvant se connecter sur les partages réseaux, et nous pouvons donc obtenir les chemins afin d'en extraire les informations. 
 + 
 +<code php> 
 +function get_gpo_path($lc, $rootdn) { 
 +  $gpo_paths = array(); 
 +  $result = ldap_read($lc, $rootdn, '(objectclass=*)', array('gplink')); 
 +  if ($result && ($entry = ldap_first_entry($lc, $result))) { 
 +    $gplinks = ldap_get_values($lc, $entry, 'gplink'); 
 +    for ($i = 0; $i < $gplinks['count']; $i++) { 
 +      if(preg_match_all('/LDAP:\/\/([^;]*);([0-9]+)/', $gplinks[$i], $matches)) { 
 +        foreach ($matches[1] as $dn) { 
 +          $res = ldap_read($lc, $dn, '(objectclass=*)', array('gpcfilesyspath')); 
 +          if ($res &&  ($e = ldap_first_entry($lc, $res))) { 
 +            $paths = ldap_get_values($lc, $e, 'gpcfilesyspath'); 
 +            for ($j = 0; $j < $paths['count']; $j++) { 
 +              $gpo_paths[] = $paths[$j]; 
 +            } 
 +          }
         }         }
       }       }
     }     }
   }   }
-   +  return $gpo_paths;
-  return $root;+
 } }
 </code> </code>
 +
 +=== Test ===
 +
 +En mettant tout ça ensemble, avec un nom d'utilisateur et un mot de passe, nous devrions pouvoir nous authentifier et obtenir les chemins des GPO pour le domaine :
 +
 +<code php>
 +$user = "pierre@test.artnum.ch";
 +$password = "test1234";
 +
 +$server = get_ldap(explode($user, '@', 2)[0]);
 +list ($lc, $rootdn) = connect_ldap($server);
 +if (auth_ldap($lc, $user, $password)) {
 + print_r(get_gpo_path($lc, $rootdn));
 +}
 +
 +/* result on my test domain 
 +Array
 +(
 +    [0] => \\test.artnum.ch\SysVol\test.artnum.ch\Policies\{5EE8813F-3AFE-483C-AC76-CB06FCFFDF0D}
 +    [1] => \\test.artnum.ch\SysVol\test.artnum.ch\Policies\{0071FA96-BA06-4033-AB98-5FE59F5C0565}
 +    [2] => \\test.artnum.ch\sysvol\test.artnum.ch\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}
 +)
 +*/
 +</code>
 +
activedirectoy/owncloud.1551630232.txt.gz · Dernière modification: 2019/03/03 17:23 de etienne