J'ai eu besoin, récemment, d'écrire un script pour permettre a des utilisateurs de changer leurs mot de passes sur un référentiel LDAP. Ce référentiel était sous OpenDS, mais comme j'ai OpenLDAP à la maison, j'ai écris un script qui fonctionne pour les deux.
L'idée de base est de valider les données saisies par l'utilisateur et d'imposer une politique de sécurité pour la qualité des mots de passe. Elle est du type :
Regles: minimum 6 caracteres, comprenant au moins un de chacun des types suivants : * chiffre (0-9) * alphanumerique (a-zA-Z) * ponctuation (-!#$%&*+,.:;<=>?@_{|}~)
Il est possible de gérer cela dans le serveur LDAP, mais j'ai trouvé plus simple de le mettre dans ce script.
Installation :
Il faut d'abord paramétrer l'adresse du serveur et le domaine racine de recherche, au tout début du script.
Le script effectue une recherche récursive sur l'uid (en anonyme ou avec un utilisateur). C'est paramétrable dans le script lignes 86 à 92. Si vous utilisez un utilisateur de recherche, il faut le définir au début (lignes 11-12).
Lorsque l'uid est trouvé, le mot de passe est inséré de deux facons possibles :
- clear : Avec OpenDS, il ne faut pas chiffrer le mot de passe avant de l'insérer, car c'est OpenDS qui le fait
- ssha : Avec OpenLDAP, c'est l'inverse, j'ai donc ajouté la fonction pour faire du SHA salé.
A positionner au début, ligne 19.
N'étant pas un pro du PHP, c'est un peu quick'n'dirty... mais ca marche et c'est secure.
Le script PHP et la page HTML sont ici : ldapchangepasswd.tar
8 reactions
1 From Vincent - 15/04/2009, 09:34
Salut,
Exactement le genre de script que je recherche en ce moment... par contre, l'extension du fichier étant .php, il est interprété par le serveur, impossible de le récupérer :-( (ou alors je n'ai pas cliqué où il fallait ;-)
2 From Vincent - 28/04/2009, 09:05
Une erreur possible lors de l'appel à ldap_bind si votre serveur LDAP ne fait pas de LDAPv2, dans ce cas ajouter ceci après l'ouverture de la connexion :
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)
En tout cas le script répond très bien à mon besoin, j'ai juste modifié la fonction chiffrant le mot de passe pour faire du bon vieux "crypt".
Merci
3 From matthieuy - 03/07/2009, 00:48
Merci pour ton script : très utile !
J'en cherché un, cependant j'avais besoin que le mot de passe samba soit aussi mis à jour.
J'ai donc rajouté ceci à ton script :
// Changement du mot de passe SAMBA (MD4)
$passwordSMB = strtoupper(bin2hex(mhash(MHASH_MD4,iconv("UTF-8", "UTF-16LE", $npassword))));
$s = ldap_mod_replace ($ds, $userdn, array('sambaNTPassword' => "$passwordSMB"));
if(!$s) {
echo "<center><font color='red'><b>Le changement de mot de passe SAMBA a echoue !</b></font></center>"."<br />";
echo "Error code ".ldap_errno($ds).": ".ldap_error($ds)."<br />";
print "<br /><center><a href=\"javascript:history.back()\">Retour</a></center>";
exit -1;
}
Pour que ceci fonctionne, il faut avoir accès au paramètre "sambaNTPassword" de la base LDAP.
Voila un extrait de mon fichier slapd.conf :
access to attrs=userPassword,shadowLastChange,sambaNTPassword
by dn="cn=admin,dc=domaine,dc=home" write
by anonymous auth
by self write
by * none
Voilà, on sait jamais si ça peut servir à quelq'un ! ;-)
4 From matthieuy - 03/07/2009, 13:04
Que veux-tu dire par "comprendre sans bidouille" ?
Il faut dans tout les cas mettre les mains dans le cambouis ;-)
J'utilise :
- Samba
- LDAP
- Les outils smbldap-tools
- MMC-agent pour la gestion
Je gère avec LDAP : les comptes utilisateurs, les groupes et le DHCP uniquement.
Il faut voir su tu souhaite faire un PDC (Controle principale de domaine) ou juste des partages samba. La configuration est différente selon le cas !
En ce qui concerne Samba, la config est toujours dans /etc/samba/smb.conf mais il va cherché les utilisateurs et les groupes dans LDAP.
Exemple de partage :
[Administration]
comment = Zone d'administration
path = /data/admin
admin users = +Administrateurs
Seul les membres du groupe "Administrateurs" de LDAP ont accès à ce dossier
Précise un peu ta question stp car c'est un peu vaste ;-)
5 From matthieuy - 03/07/2009, 14:34
J'ai utilisé ce tuto : http://www.vogelweith.com/debian_se...
qui est principalement sur le couple LDAP/MMC pour Debian. J'ai adapté à mon besoin car je n'ai pas besoin du SSL, DNS,... Je n'utilise pas de PDC mais j'ai quand configurer samba en tant que tel (on sais jamais si j'ai besoin un jour).
D'ailleurs info que tu sais peut-être déjà mais qui m'a surpris :
- Si les "PC client" ne rejoignent pas le domaine du PDC, le réseau se comporte comme si il n'existait pas, c'est à dire que tu peux quand même accéder (après login) à tes partages réseau.
6 From KPTN - 12/02/2010, 17:47
Bonjour,
j'ai publié une application de ce genre en Open Source ici :
http://ltb-project.org/wiki/documen...
Je serai ravi d'intégrer certaines de vos fonctionnalités si elles n'existent pas encore.
7 From KPTN - 13/02/2010, 17:08
C'est toujours sympa de fournir du code, j'ai aussi pas mal cherché avant d'écrire le mien ce qui existait.
Je vais certainement reprendre quelques idées de ton programme, en particulier sur le contrôle du mot de passe. Tu es le bienvenu sur le projet LTB si tu veux contribuer !
8 From KPTN - 14/02/2010, 17:57
En effet le mieux c'est de laisser l'annuaire contrôler ça. J'ai un pwdChecker pour OpenLDAP qui le fait.
J'ai ajouté un message permettant d'indiquer à l'utilisateur les contraintes de mots de passe (quand on définit la politique localement dans le script).