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 :
-
-R : indique de ne pas suivre les referrals (ne fonctionne pas
dans mon cas si je ne mets pas ce paramètre)
- -b dc=demo-cg77,dc=org : la base peut changer
- -f sAMAccountName=%s :
filtre indiquant ou trouver ce qu'on tape en tant que login. Si on met
sAMAccountName, le login est de la forme jean.martin
(ou Administrateur, alors qu'en mettant à la place
userPrincipalName, le login est de la forme
jean.martin@demo-cg77.org (l'administrateur n'a pas d'attribut
userPrincipalName par défaut).
- -D "CN=Administrateur,CN=Users,DC=demo-cg77,DC=org" -w azerty :
comme on fait une recherche (à cause du filtre -f), il faut apparemment
faire un bind auprès du serveur LDAP en indiquant ici le nom de
l'utilisateur et son mot de passe, à moins que les recherches anonymes soient
autorisées (ce qui n'est pas le cas par défaut)
- 101.0.50.41 : adresse du serveur Active Directory
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
-
On ne peut apparamment pas faire de recherches ldap en anonyme
avec Active Directory (en tout cas pas par défaut), il vaut donc mieux créer
un utilisateur dédié.
- Pour créer un utilisateur avec des outils ldap, ces informations
suffisent :
dn: CN=Paul LEROY, OU=Personnes, dc=demo-cg77,dc=org
objectClass: user
Cependant, pour pouvoir se connecter avec cet utilisateur, on a besoin aussi
de ces informations :
sAMAccountName: paul.leroy
userPrincipalName: paul.leroy@demo-cg77.org
On peut aussi ajouter ces informations qui peuvent être utilisées ailleurs :
givenName: Paul
sn: LEROY
cn: Paul LEROY
displayName: Paul LEROY
On peut bien évidemment définir ces 3 blocs d'informations en même temps.
Pour que l'utilisateur puisse se connecter, il reste encore à l'activer,
mais avant cela on est obligé par défaut de définir un mot de passe.
Si on ne veut pas mettre de mot de passe (attention, l'utilisateur ne pourra
pas se connecter) mais qu'on veut quand même l'activer, passer directement
à la section 4.4.2.
4.4.1 Attribution d'un mot de passe
Un mot de passe doit avoir une forme particulière pour pouvoir être attribué :
-
on doit l'écrire entre double quotes
(par exemple "password")
- il faut le transformer en unicode
("\0p\0a\0s\0s\0w\0o\0r\0d\0"\0)
- il faut ensuite l'encoder en base64
(IgBwAGEAcwBzAHcAbwByAGQAIgA=)
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...