Dans ce billet je présente une procédure simple afin de mettre en place une authentification avec le protocole LDAP depuis un AD sur un serveur apache déployé sur un Debian 6. Le protocole LDAP désigné « Lightweight Directory Access Protocol » est un protocole qui permet l’interrogation et la modification des services d’annuaire. Le protocole est basé sur TCP/IP.
Commencez par vérifier que vous possédez bien les packets nécessaire,
apt-get install php5-ldap
Je place un schéma de la structure de mon AD si vous souhaitez la comparer au fichier de configuration ci-dessous.
Le fichier à modifier est : /etc/apache2/sites-available/default. Vous pouvez utiliser vi ou gedit.
-
Ici pour détailler,
- AuthType Basic :
- AuthName « Secure Area »: Le nom que vous souhaitez afficher
- AuthLDAPBindDN « cn=administrateur,cn=Users,cn=SRV1,cn=PPEGR5,cn=LOCAL »:
A adapter selon votre configuration, je m’authentifie en tant qu’administrateur depuis l’UO « users », il est plus propre de créer un utilisateur spécifique - AuthLDAPBindPassword « t0 »:
Le mot de passe de votre compte ci-dessus - AuthBasicProvider ldap:
Désigne le protocole d’authentification - AuthzLDAPAuthoritative Off:
- AuthLDAPUrl « ldap://10.0.0.100:389/OU=Utilisateurs,DC=srv1,DC=ppegr5,DC=local »:
Désigne sur quel UO identifier votre utilisateur ici, « utilisateurs » - #AuthLDAPGroupAttribute CN=SRV1,CN=PPEGR5,CN=LOCAL:
Ici on peut spécifier un groupe pour authentifier les utilisateurs plutot qu’un simple comptpe - #AuthLDAPGroupAttributeIsDN on:
- #Require valid-user:
Dans votre page index.php, complétez et modifier le fichier php ci-dessous.
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>Secure Area</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252" />
<meta http-equiv="content-language" content="fr" />
</head>
<body>
<?php
// on récupère le login et le pass
$user="votrenomdutilisateur.aveclepoint";
$passwd="motdepassutilisateur";
// ldap utilise le nom de connexion donc supression du point
$user = str_replace('.',' ',$user);
$ldap_base = 'dc=localdomain,dc=org';
$ldap_server = 'localdomain.org';
$ldap_direction = ",ou=direction,".$ldap_base;
$ldap_bureau = ",ou=bureau_etude,".$ldap_base;
$ldap_informatique = ",ou=informatique,".$ldap_base;
$ldap_comptabilite = ",ou=comptabilite,".$ldap_base;
// par default 389
$ldap_port = '389';
$connexion_serveur = @ldap_connect($ldap_server, $ldap_port);
// si utilisateur membre de linfo alors admin
if ($connexion_user=@ldap_bind($connexion_serveur, 'cn='.$user.$ldap_informatique, $passwd))
{
?>
<div class='news'>
<H1>Bienvenue, <? echo ucwords($user)."."; ?><BR> Vous êtes administrateur</H1>
</div>
<?php
$_SESSION['admin']=1;
}
// test si présent dans une uo
elseif (((($connexion_user=@ldap_bind($connexion_serveur, 'cn='.$user.$ldap_bureau, $passwd)) or ($connexion_user=@ldap_bind($connexion_serveur, 'cn='.$user.$ldap_bureau, $passwd))) or ($connexion_user=@ldap_bind($connexion_serveur, 'cn='.$user.$ldap_direction, $passwd))) or ($connexion_user=@ldap_bind($connexion_serveur, 'cn='.$user.$ldap_comptabilite, $passwd)))
{
?>
<div class='news'>
<H1>Bienvenue, <? echo ucwords($user)."."; ?>
</div>
<?php
$_SESSION['admin']=2;
}
// si utilisateur non trouve alors affichage erreur
else
{
?>
<div class='news'>
<H1><? echo ucwords($user); ?>, vous n'etes pas authorisé</H1>
<BR/><BR/><form><input type='button' value='Retour' onclick="self.location.href='index.php'"></form>
</div>
<?php
$_SESSION['admin']=0;
}
?>
</body>
</html>
Vous pouvez en adaptant le script ci-dessus passer par un formulaire d’identification simple
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>Intranet</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252" />
<meta http-equiv="content-language" content="fr" />
</head>
<body>
<FORM METHOD="POST" ACTION="autorise.php">
<TABLE WIDTH="100%">
<TR ALIGN="CENTER">
<TD>Login</TD>
<TD><input type="texte" value="" name="login"/></TD>
</TR>
<TR ALIGN="CENTER">
<TD>Mot de passe</TD>
<TD><input type="password" value="" name="password"/></TD>
</TR>
<TR ALIGN="CENTER">
<TD></TD>
<TD><BR/><input type="submit" name="connection" value="Connection"</TD>
</TR>
</TABLE>
</FORM>
</body>
</html>