Authentification LDAP sur Apache2 depuis Debian

ldap logo

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,

a2enmod ldap auth_basic authnz_ldap authz_user
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.

04 ldap windows server 2008 r2

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.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<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>

Laisser un commentaire