{"id":494,"date":"2009-08-21T07:54:08","date_gmt":"2009-08-21T07:54:08","guid":{"rendered":"http:\/\/blog.milamberspace.net\/?p=494"},"modified":"2009-08-21T07:54:08","modified_gmt":"2009-08-21T07:54:08","slug":"convertir-les-mots-de-passe-en-clair-en-mots-de-passe-sha-1-dans-un-serveur-ldap-avec-jmeter","status":"publish","type":"post","link":"https:\/\/blog.milamberspace.net\/index.php\/2009\/08\/21\/convertir-les-mots-de-passe-en-clair-en-mots-de-passe-sha-1-dans-un-serveur-ldap-avec-jmeter-494.html","title":{"rendered":"Convertir les mots de passe en clair en mots de passe SHA-1 dans un serveur LDAP avec JMeter"},"content":{"rendered":"<p>Voici un compl\u00e9ment \u00e0 <a href=\"http:\/\/blog.milamberspace.net\/index.php\/2009\/07\/30\/charger-un-serveur-ldap-depuis-une-base-de-donnees-avec-jmeter-468.html\">ce premier tutoriel sur JMeter et un serveur LDAP<\/a>, o\u00f9 les mots de passe qui ont \u00e9t\u00e9 ins\u00e9r\u00e9s dans le serveur LDAP l&rsquo;ont \u00e9t\u00e9 en clairs. C&rsquo;est \u00e0 dire que si vous disposez d&rsquo;un acc\u00e8s au serveur LDAP (et\/ou que le serveur LDAP a une configuration pas tr\u00e8s s\u00e9curis\u00e9e) vous pouvez voir les mots de passe en clair de tout le monde. Ah, ce n&rsquo;est pas terrible, pas de probl\u00e8me, reprenons JMeter pour effectuer une conversion en SHA-1 des mots de passe.<\/p>\n<p><em>(Attention cela n&#8217;emp\u00eache pas de mieux s\u00e9curiser son serveur LDAP pour par exemple interdire la consultation du champ du mot de passe dans le LDAP par tout autre utilisateur que lui-m\u00eame)<\/em><\/p>\n<p><span style=\"text-decoration: underline;\"><strong>Les objectifs de ce nouveau tutoriel sont :<\/strong><\/span><\/p>\n<ul>\n<li>Montrer comment parcourir les enregistrements d&rsquo;un LDAP avec JMeter\n<ul>\n<li>Pour cela avec un <strong>contr\u00f4leur Pour chaque<\/strong><\/li>\n<\/ul>\n<\/li>\n<li>Faire une action conditionnelle avec un <strong>contr\u00f4leur Si<\/strong>, en fonction d&rsquo;une valeur de variable<\/li>\n<li>Monter la manipulation de donn\u00e9es (variables JMeter) dans une utilisation avec <strong>Pr\u00e9-processeur BeanShell<\/strong><\/li>\n<\/ul>\n<p>La capture suivante l&rsquo;arbre JMeter de ce tutoriel.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Arbre JMeter pour test LDAP conversion SHA\" src=\"\/wp-content\/images\/jmeter22-img-ldap\/jmeter-ldap-01.png\" alt=\"\" width=\"328\" height=\"425\" \/><\/p>\n<p><!--more-->On commence bien entendu par ajouter un \u00e9l\u00e9ment <strong>Groupes d&rsquo;unit\u00e9s<\/strong> (en 1-1-1) pour permettre par la suite l&rsquo;ex\u00e9cution du sc\u00e9nario. Ensuite on attaque avec l&rsquo;ajout de la premi\u00e8re<strong> Requ\u00eate LDAP \u00e9tendue<\/strong>, elle va se charger de la connexion avec le serveur LDAP.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Requ\u00eate LDAP de connexion JMeter\" src=\"\/wp-content\/images\/jmeter22-img-ldap\/jmeter-ldap-02.png\" alt=\"\" width=\"430\" height=\"362\" \/><\/p>\n<p style=\"text-align: left;\">Le type de test est \u00ab\u00a0<em><strong>Unit\u00e9 li\u00e9e <\/strong><\/em>\u00bb (bind en anglais) correspondant \u00e0 une connexion sur le serveur LDAP.<\/p>\n<p style=\"text-align: left;\">On compl\u00e8te les champs suivants :<\/p>\n<ul>\n<li><strong>Nom du serveur<\/strong>, par le nom ou l&rsquo;adresse IP du serveur LDAP<\/li>\n<li><strong>Port<\/strong>, en g\u00e9n\u00e9ral le port 389<\/li>\n<li><strong>DN<\/strong> : nom du suffixe d&rsquo;annuaire<\/li>\n<li><strong>Identifiant<\/strong>, par le \u00ab\u00a0login\u00a0\u00bb de connexion \u00e0 l&rsquo;annuaire LDAP.<\/li>\n<li><strong>Mot de passe <\/strong>associ\u00e9<\/li>\n<\/ul>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Requ\u00eate LDAP de recherche avec JMeter\" src=\"\/wp-content\/images\/jmeter22-img-ldap\/jmeter-ldap-03.png\" alt=\"\" width=\"466\" height=\"441\" \/><\/p>\n<p>La <strong>requ\u00eate LDAP<\/strong> suivante va permettre de faire la recherche dans le LDAP de la liste des utilisateurs. On s\u00e9lectionne le p\u00e9rim\u00e8tre de recherche au niveau du champ <strong><em>Search base<\/em><\/strong>, en indiquant \u00ab\u00a0<em>ou=Users<\/em> \u00bb (qui sera suffix\u00e9 par <em>dn=milamberspace,dn=net<\/em>), le filtre de recherche (<strong><em>Search Filter<\/em><\/strong>) est \u00ab<em> (uid=*)<\/em> \u00bb, o\u00f9 l&rsquo;\u00e9toile indique \u00ab\u00a0tous\u00a0\u00bb. Cette requ\u00eate LDAP signifie donc :<em> \u00ab\u00a0On cherche toutes les fiches de l&rsquo;annuaire du groupe d&rsquo;utilisateurs ou=Users,dn=milamberspace,dn=net.<\/em>\u00a0\u00bb<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Extracteur dexpression r\u00e9guli\u00e8re JMeter\" src=\"\/wp-content\/images\/jmeter22-img-ldap\/jmeter-ldap-04.png\" alt=\"\" width=\"507\" height=\"238\" \/><\/p>\n<p><strong>L&rsquo;extracteur d&rsquo;expression r\u00e9guli\u00e8re<\/strong>, ajout\u00e9 en tant que fils de la requ\u00eate LDAP de s\u00e9lection des fiches utilisateurs, va permettre de cr\u00e9er une grande liste des UID (identifiants des utilisateurs) provenant des r\u00e9sultats de recherche. La <em>RegExp<\/em> va cr\u00e9er un ensemble de variables JMeter ayant le format suivant \u00ab\u00a0<em>VAR_UID_xx <\/em>\u00bb o\u00f9 <strong>xx<\/strong> correspond \u00e0 un indice de liste.<br \/>\n<span style=\"text-decoration: underline;\">On note que c&rsquo;est la valeur \u00ab\u00a0-1\u00a0\u00bb dans le champ \u00ab<strong><em> Correspond au num.<\/em><\/strong> \u00bb qui permet d&rsquo;indiquer \u00e0 JMeter qu&rsquo;il faut cr\u00e9er une liste de variables VAR_UID_xx pour toutes les occurrences trouv\u00e9es avec l&rsquo;expression r\u00e9guli\u00e8re.<\/span><\/p>\n<p>Histoire de vous aider \u00e0 mat\u00e9rialiser la chose, la capture suivante montre les fameuses variables VAR_UID_xx qui vont \u00eatre cr\u00e9\u00e9es lors de l&rsquo;ex\u00e9cution.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Variables g\u00e9n\u00e9r\u00e9es\" src=\"\/wp-content\/images\/jmeter22-img-ldap\/jmeter-ldap-17.png\" alt=\"\" width=\"492\" height=\"577\" \/><\/p>\n<p style=\"text-align: left;\">On reviens aux \u00e9l\u00e9ments du sc\u00e9nario avec le<strong> contr\u00f4leur Pour chaque<\/strong> :<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Contr\u00f4leur Pour chaque\" src=\"\/wp-content\/images\/jmeter22-img-ldap\/jmeter-ldap-05.png\" alt=\"\" width=\"338\" height=\"152\" \/><\/p>\n<p>Ce <strong>contr\u00f4leur Pour chaque <\/strong>qui va permettre de parcourir la liste des variables <em>VAR_UID_xx<\/em> r\u00e9cup\u00e9r\u00e9es dans la requ\u00eate pr\u00e9c\u00e9dente. Pour chaque valeur de variable, on va faire le traitement suivant :<\/p>\n<ol>\n<li>Une requ\u00eate LDAP de recherche pour r\u00e9cup\u00e9rer le mot de passe en clair<\/li>\n<li>Si besoin, une requ\u00eate LDAP de mise \u00e0 jour afin de remplacement ce mot de passe par sa version SHA-1 (empreinte SHA)<\/li>\n<li>Si besoin, une requ\u00eate LDAP de recherche pour s&rsquo;assurer que la mise \u00e0 jour s&rsquo;est bien pass\u00e9e.<\/li>\n<\/ol>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Requ\u00eate LDAP recherche\" src=\"\/wp-content\/images\/jmeter22-img-ldap\/jmeter-ldap-06.png\" alt=\"\" width=\"546\" height=\"437\" \/><\/p>\n<p>Donc pour la requ\u00eate de recherche du mot de passe d&rsquo;un utilisateur donn\u00e9, on va remplacer l&rsquo;\u00e9toile dans le champ <strong><em>Search Filter<\/em><\/strong> par la valeur de la variable <em>${UID}<\/em> qui correspondra \u00e0 l&rsquo;utilisateur courant dans la <strong>boucle Pour chaque<\/strong>.<\/p>\n<p>Le champ<em><strong> Size Limit <\/strong><\/em>sera plac\u00e9 \u00e0 1 <em>(on ne cherche que 1 seul \u00e9l\u00e9ment. Enfin c&rsquo;est pas vraiment obligatoire de remplir ce champ, on est cens\u00e9 toujours avoir 1 \u00e9l\u00e9ment en retour)<\/em>. On place la limite de temps de r\u00e9ponse \u00e0 10 000 ms, et surtout on place \u00ab\u00a0<em>userPassword<\/em> \u00bb dans le champ <strong><em>Attributes<\/em><\/strong> afin que le serveur LDAP nous revoie seulement la valeur de ce champ pour l&rsquo;utilisateur.<\/p>\n<p>On n&rsquo;oubliera pas de cocher la case \u00ab\u00a0<em><strong>Examiner les r\u00e9sultats de recherche ?<\/strong>\u00a0\u00bb <\/em>afin de l&rsquo;on puisse avoir, dans les donn\u00e9es de r\u00e9ponses, les valeurs demand\u00e9es (ici le <em>userPassword<\/em>).<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Extracteur dexpression r\u00e9guli\u00e8re userPassword\" src=\"\/wp-content\/images\/jmeter22-img-ldap\/jmeter-ldap-07.png\" alt=\"\" width=\"507\" height=\"233\" \/><\/p>\n<p>Ensuite, commence une s\u00e9rie de trois <strong>extracteurs d&rsquo;expression r\u00e9guli\u00e8re<\/strong>. Le premier va permettre la r\u00e9cup\u00e9ration du mot de passe, ce dernier se situe entre deux balises userPassword dans la r\u00e9ponse.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Extracteur dexpression r\u00e9guli\u00e8re UID\" src=\"\/wp-content\/images\/jmeter22-img-ldap\/jmeter-ldap-08.png\" alt=\"\" width=\"470\" height=\"236\" \/><\/p>\n<p>La deuxi\u00e8me est pour r\u00e9cup\u00e9rer l&rsquo;identifiant de l&rsquo;utilisateur en cours. Ce n&rsquo;est pas obligatoire, mais cela permet de v\u00e9rifier si on a eut le bon utilisateur.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Extracteur dexpression r\u00e9guli\u00e8re SHA\" src=\"\/wp-content\/images\/jmeter22-img-ldap\/jmeter-ldap-09.png\" alt=\"\" width=\"562\" height=\"234\" \/><\/p>\n<p>La troisi\u00e8me est pour r\u00e9cup\u00e9rer le mot de passe au format SHA dans le cas o\u00f9 l&rsquo;utilisateur a d\u00e9j\u00e0 un mot de passe au format SHA. Donc cela voudra dire qu&rsquo;il ne faut pas convertir son mot de passe.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Contr\u00f4leur Si JMeter\" src=\"\/wp-content\/images\/jmeter22-img-ldap\/jmeter-ldap-10.png\" alt=\"\" width=\"594\" height=\"130\" \/><\/p>\n<p>Le <strong>contr\u00f4leur Si<\/strong> va justement permettre de d\u00e9terminer si c&rsquo;est n\u00e9cessaire ou non de faire la conversion. Pour cela on compare si la variable cible de l<strong>&lsquo;extracteur d&rsquo;expression r\u00e9guli\u00e8re<\/strong> <em>MOT_DE_PASSE_SHA <\/em>a re\u00e7u la valeur par d\u00e9faut (ici il s&rsquo;agit d&rsquo;un texte arbitraire qui est stock\u00e9 dans la variable ${MDP_NON_SHA}).<\/p>\n<p>Donc si c&rsquo;est la valeur par d\u00e9faut, c&rsquo;est que le mot de passe n&rsquo;est pas en SHA, il convient donc de proc\u00e9der \u00e0 la conversion.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Requ\u00eate LDAP de modification JMeter\" src=\"\/wp-content\/images\/jmeter22-img-ldap\/jmeter-ldap-11.png\" alt=\"\" width=\"699\" height=\"278\" \/><\/p>\n<p>Cette <strong>requ\u00eate LDAP <\/strong>est donc celle de la modification. On choisi le type de test \u00ab\u00a0<em>Modification test <\/em>\u00bb, et dans le tableau, on d\u00e9finit l&rsquo;attribut <em>userPassword<\/em>, sa nouvelle valeur (voir ci-dessous) et le code d&rsquo;op\u00e9ration \u00ab\u00a0<em>replace<\/em> \u00bb.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Pr\u00e9-processeur BeanShell pour conversion SHA JMeter\" src=\"\/wp-content\/images\/jmeter22-img-ldap\/jmeter-ldap-12.png\" alt=\"\" width=\"507\" height=\"625\" \/><\/p>\n<p>Le <strong>Pr\u00e9-Processeur BeanShell <\/strong>est rattach\u00e9 en tant que fils \u00e0 la <strong>requ\u00eate LDAP<\/strong> de modification. C&rsquo;est lui qui va faire la conversion du mot de passe en clair vers un mot de passe en SHA, le tout en code de programmation Java. Il permet donc de cr\u00e9er (d\u00e9finir) la nouvelle valeur du mot de passe qui sera ins\u00e9r\u00e9e par la requ\u00eate de modification.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Requ\u00eate LDAP de recherche \/ v\u00e9rification JMeter\" src=\"\/wp-content\/images\/jmeter22-img-ldap\/jmeter-ldap-13.png\" alt=\"\" width=\"539\" height=\"429\" \/><\/p>\n<p>La requ\u00eate suivante est pour faire une nouvelle recherche de l&rsquo;utilisateur courant. On va, en effet, re-demander son mot de passe afin de v\u00e9rifier qu&rsquo;il a bien \u00e9t\u00e9 chang\u00e9.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"V\u00e9rification par assertion\" src=\"\/wp-content\/images\/jmeter22-img-ldap\/jmeter-ldap-14.png\" alt=\"\" width=\"615\" height=\"312\" \/><\/p>\n<p>La v\u00e9rification du bon changement, est assur\u00e9e par un \u00e9l\u00e9ment <strong>Assertion R\u00e9ponse<\/strong>. Le motif \u00e0 tester est le nouveau mot de passe (le SHA), et attention, le type de correspondance est \u00ab\u00a0<em>Commence par<\/em> \u00bb. La traduction en fran\u00e7ais induit en erreur, car en fait, cela \u00ab\u00a0<em>ne commence pas par<\/em> \u00bb mais plut\u00f4t \u00ab\u00a0<em>Contient (sans expression r\u00e9guli\u00e8re)<\/em> \u00bb, car dans le nouveau mot de passe, il peut y avoir des caract\u00e8res sp\u00e9ciaux d&rsquo;expressions r\u00e9guli\u00e8res qui risquent d&rsquo;\u00eatre mal interpr\u00e9t\u00e9s avec le type \u00ab\u00a0Contient\u00a0\u00bb. <em>(je vais proposer une nouvelle traduction pour la prochaine version de JMeter)<\/em><\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Requ\u00eate LDAP de d\u00e9connexion JMeter\" src=\"\/wp-content\/images\/jmeter22-img-ldap\/jmeter-ldap-15.png\" alt=\"\" width=\"643\" height=\"189\" \/><\/p>\n<p>La derni\u00e8re <strong>requ\u00eate LDAP<\/strong> est celle de la d\u00e9connexion (D\u00e9lier les unit\u00e9s).<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Ex\u00e9cution du test\" src=\"\/wp-content\/images\/jmeter22-img-ldap\/jmeter-ldap-16.png\" alt=\"\" width=\"813\" height=\"461\" \/><\/p>\n<p>Et voil\u00e0, il ne reste plus qu&rsquo;\u00e0 faire une ex\u00e9cution du test (une et une seule), tout en v\u00e9rifiant dans l&rsquo;arbre de r\u00e9sultat que tout s&rsquo;est bien pass\u00e9.<\/p>\n<p>Le r\u00e9cepteur d&rsquo;Assertion, dans l&rsquo;arbre JMeter, permettra, quant \u00e0 lui de capter d&rsquo;\u00e9ventuels probl\u00e8mes lors de l&rsquo;ex\u00e9cution. Il est pr\u00e9f\u00e9rable de cocher la case \u00ab\u00a0<em>Uniquement (les) Erreurs<\/em> \u00bb dans ce r\u00e9cepteur, afin de ne voir que les probl\u00e8mes survenus.<\/p>\n<p>Voil\u00e0 pour ce deuxi\u00e8me billet sur JMeter et les LDAP. Bon courage.<\/p>\n<p>.\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Voici un compl\u00e9ment \u00e0 ce premier tutoriel sur JMeter et un serveur LDAP, o\u00f9 les mots de passe qui ont \u00e9t\u00e9 ins\u00e9r\u00e9s dans le serveur LDAP l&rsquo;ont \u00e9t\u00e9 en clairs. C&rsquo;est \u00e0 dire que si vous disposez d&rsquo;un acc\u00e8s au serveur LDAP (et\/ou que le serveur LDAP a une configuration pas tr\u00e8s s\u00e9curis\u00e9e) vous pouvez &hellip; <a href=\"https:\/\/blog.milamberspace.net\/index.php\/2009\/08\/21\/convertir-les-mots-de-passe-en-clair-en-mots-de-passe-sha-1-dans-un-serveur-ldap-avec-jmeter-494.html\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Convertir les mots de passe en clair en mots de passe SHA-1 dans un serveur LDAP avec JMeter<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[32,33,189],"tags":[193,330,358,192],"class_list":["post-494","post","type-post","status-publish","format-standard","hentry","category-apache","category-jmeter","category-ldap","tag-conversion","tag-jmeter","tag-ldap","tag-sha"],"_links":{"self":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/494","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/comments?post=494"}],"version-history":[{"count":5,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/494\/revisions"}],"predecessor-version":[{"id":499,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/494\/revisions\/499"}],"wp:attachment":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/media?parent=494"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/categories?post=494"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/tags?post=494"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}