Précédent Remonter Suivant

4  Active Directory

Active Directory est l'annuaire utilisé par MS Windows 2000 Server et MS Windows Server 2003.

Une fois qu'on a réussi à interfacer Squid avec OpenLDAP , le passage à Active Directory n'est pas très compliqué. Il vaut donc mieux lire la section précédente avant de passer à celle-ci.

4.1  Description rapide des données utilisées dans Active Directory

Dans Active Directory , les utilisateurs sont en général répertoriés dans CN=Users, mais rien n'empêche de créer une zone plus adaptée, pour différencier toutes les personnes que l'on va ajouter de toutes les entrées qui se trouvent déjà par défaut dans CN=Users.

Par exemple, on peut créer une OU=Personnes (OU=Organizational Unit, c'est-à-dire Unité d'Organisation), ou tout autre chose selon ses souhaits. On peut alors ajouter des utilisateurs à l'emplacement de son choix.

Pour faire cela, la méthode classique est d'utiliser la console Utilisateurs et ordinateurs Active Directory, qui est accessible dans les Outils d'Administration, ou qu'on peut rajouter dans une console personnalisée au moyen de la Microsoft Management Console (qu'on peut lancer par la commande mmc). On crée ainsi des utilisateurs, par exemple Jean MARTIN, Pierre DUPONT et Jacques DURAND.

On peut aussi créer ces utilisateurs sans passer par la console Microsoft, mais en utilisant des programmes permettant de modifier les données d'un annuaire LDAP (les mêmes programmes qui permettent de remplir un annuaire OpenLDAP). Cependant, c'est un peu plus délicat au niveau des mots de passe (voir 4.4.1).

Maintenant que des utilisateurs existent, on peut créer un groupe qui regoupera les personnes ayant accès à Internet par exemple. Cela se fait aussi aisément avec les mêmes outils que pour les utilisateurs. On ajoute alors dans ce groupe les utilisateurs à qui on veut donner accès à Internet.

On peut alors passer à la configuration de Squid .

4.2  Configuration de Squid

Pour passer d'OpenLDAP à Active Directory , il suffit de modifier les 2 lignes d'appel de squid_ldap_auth et squid_ldap_group .

4.2.1  squid_ldap_auth

Voici la ligne que j'obtiens :
auth_param basic program /usr/lib/squid/squid_ldap_auth 
      -R -D "CN=Administrateur,CN=Users,DC=demo-cg77,DC=org" -w azerty 
      -b dc=demo-cg77,dc=org -f sAMAccountName=%s 101.0.50.41
Explications : A ce niveau, on peut déjà procéder à une authentification par individus.

4.2.2  squid_ldap_group

Pour l'authentification par groupes, on modifie la ligne d'appel de squid_ldap_group ainsi :
external_acl_type ldap_group ttl=3600 %LOGIN /usr/lib/squid/squid_ldap_group 
      -R -D "CN=Administrateur,CN=Users,DC=demo-cg77,DC=org" -w azerty 
      -b "cn=Users,dc=demo-cg77,dc=org" 
      -B "ou=Personnes,dc=demo-cg77,dc=org" 
      -f "(&(cn=%g)(objectClass=group)(member=%u))" 
      -F "(&(sAMAccountName=%s)(objectClass=person))" 
      101.0.50.41
De même que pour squid_ldap_auth , on a rajouté -R, -D ... et -w ..., on a adapté la base de recherche des utilisateurs et des groupes, on a mis l'adresse du serveur Active Directory , et on a changé, pour le filtre des utilisateurs, l'attribut déterminant le login.

Il faut remarquer, concernant le filtre des groupes, que l'on a changé la classe du groupe : en effet, dans Active Directory , les groupes ne sont pas de la classe groupOfNames, mais group.

Une fois ces modifications effectuées, on peut relancer Squid , et l'authentification doit fonctionner par l'intermédiaire d'Active Directory .

4.3  Petite remarque en passant

On observe avec Ethereal qu'Active Directory , contrairement à OpenLDAP , renvoie le Search Entry et le Search Result concaténés au sein du même paquet.

4.4  Utilisateurs

4.4.1  Attribution d'un mot de passe

Un mot de passe doit avoir une forme particulière pour pouvoir être attribué : On peut automatiser ceci par le petit script perl suivant :
use MIME::Base64; print encode_base64(join("\0",split(//,"\"password\"")) . "\0");

ou de manière plus interactive :
use MIME::Base64; chomp($p=<STDIN>); print encode_base64(join("\0",split(//,"\"$p\"")) . "\0");

(ce script lit l'entrée standard, rajoute les double quotes, sépare la chaîne de caractères obtenue en caractères distincts, rassemble ces caractères en intercalant des "\0", rajoute le dernier "\0", puis encode en base64 et renvoie la chaîne obtenue)

Il faut ensuite modifier l'utilisateur avec ldapmodify par exemple, mais en utilisant le port sécurisé (ldaps://). A priori, ce n'est que pour modifier le mot de passe que l'on est obligé d'utiliser le SSL (mais il est recommandé de toujours l'utiliser pour plus de sécurité).

Voir la section 5 pour plus d'informations sur le SSL, et plus particulièrement 5.2 pour savoir comment utiliser SSL avec Active Directory .

On peut très simplement automatiser toute l'opération de changement de mot de passe, par exemple avec le script perl suivant :
#!/usr/bin/perl use MIME::Base64; $l=6; $host="101.0.50.41"; $tmpfile="__chpass__tmp__ldif__file__"; print "DN de l'utilisateur Active Directory : "; chomp($u=<STDIN>); $msg = "Entrez un mot de passe ($l car. minimum) : "; do {   do {     system "stty -echo";     print $msg;     chomp($p=<STDIN>);     print "\n";     system "stty echo";     $msg = "Erreur - mot de passe trop court : "           ."il faut au moins $l caracteres\n"           ."Entrez un mot de passe ($l car. minimum) : ";   } while (length($p)<$l);   system "stty -echo";   print "Retapez le mot de passe (verification) : ";   chomp($p2=<STDIN>);   print "\n";   system "stty echo";   $msg = "Echec de la verification\n"         ."Entrez un mot de passe ($l car. minimum) : "; while (not ($p eq $p2)); open (OUTFILE, ">$tmpfile"); $crypt = encode_base64(join("\0",split(//,"\"".$p."\"")) . "\0"); print OUTFILE "dn: $u\n"."unicodePwd:: $crypt"; close (OUTFILE); print "\nMot de passe Administrateur Active Directory - "; $res=system "ldapmodify -D cn=Administrateur,cn=Users,dc=demo-cg77,dc=org -W -H ldaps://$host -f $tmpfile"; system "rm -f $tmpfile"; if ($res) {   print "Erreur : le mot de passe n'a donc pas ete change\n"; else {   print "Le mot de passe a bien ete change\n"; }

4.4.2  Activation de l'utilisateur : userAccountControl

Le champ userAccountControl regroupe plusieurs propriétés sur le compte utilisateur. C'est un champ de bits d'une taille de 4 octets, soit 32 bits, c'est-à-dire 32 drapeaux (flags), pouvant indiquer autant de propriétes.

En pratique, dans la documentation officielle de Microsoft, il n'y a pas d'explications pour tous ces bits, et les celles fournies sont très sommaires, j'ai donc tatonné pour comprendre à quoi correspondent certains de ces bits.

En voici la description (le bit 0 est celui de poids faible, c'est-à-dire le plus à droite) :
Bit n° Signification Valeur Accepté
0 Script 1 non
1 Compte désactivé 2 oui
3 Homedir required 8 oui
4 Lockout (verrouillage) 16 non
5 Password not required 32 oui
6 Password can't change 64 non
7 Enregistrer le mot de passe en utilisant un cryptage réversible 128 oui
8 Temp duplicate account 256 non
9 Normal account 512 oui
11 Interdomain trust account 2048 non
12 Workstation trust account 4096 oui
13 Server trust account 8192 non
16 Le mot de passe n'expire jamais 65536 oui
17 MNS logon account 131072 oui
18 Une carte à puce est nécessaire pour ouvrir une session interactive 262144 oui
19 Le compte est approuvé pour la délégation 524288 oui
20 Le compte est sensible et ne peut pas être délégué 1048576 oui
21 Utiliser les types de cryptage DES pour ce compte 2097152 oui
22 La pré-authentification Kerberos n'est pas nécessaire 4194304 oui

La valeur que l'on donne à userAccountControl est la somme des valeurs associées aux propriétés que l'on veut activer pour le compte (ces valeurs sont en fait 2 à la puissance le numéro du bit).

Ainsi, si on veut par exemple un compte normal désactivé, on met la valeur 514 (512 + 2), alors que si on veut qu'il soit activé, on met juste 512.

Si on veut que le mot de passe n'expire jamais, il suffit de rajouter 65536.

Si on veut activer l'utilisateur sans avoir défini de mot de passe, on met 512 + 32 = 544 ...

Attention, on ne peut pas (Active Directory l'empêche) cumuler "normal account" et "workstation trust account" par exemple, vu qu'un compte ne peut être que dans l'une de ces 2 catégories à la fois. En pratique, pour un normal account, l'utilisateur sera automatiquement membre du groupe Utilisa. du domaine, alors que pour un workstation trust account, il sera membre du groupe Ordinateurs du domaine.

Une fois que l'on a créé l'utilisateur, défini son mot de passe, et activé son compte, on peut enfin l'utiliser pour se connecter...


Précédent Remonter Suivant