{"id":722,"date":"2009-05-31T09:14:39","date_gmt":"2009-05-31T08:14:39","guid":{"rendered":"http:\/\/www.tupperclub.de\/blog\/?p=722"},"modified":"2014-11-14T20:10:36","modified_gmt":"2014-11-14T19:10:36","slug":"ldap-passworter-mit-php-andern","status":"publish","type":"post","link":"https:\/\/www.tupperclub.de\/blog\/?p=722","title":{"rendered":"LDAP-Passw\u00f6rter mit PHP \u00e4ndern"},"content":{"rendered":"<p>Wie kann ich denn mein Passwort \u00e4ndern? Diese Frage kennen wohl die meisten Linux-Admins zur Gen\u00fcge. Oft haben sie aber keine Antwort parat, mit der auch unerfahrene Benutzer etwas anfangen k\u00f6nnen \u2013 SSH und Kommandozeile sind nunmal nicht jedermanns Sache. Ich m\u00f6chte deshalb ein paar Tipps geben, die helfen sollen, ein Webinterface zum \u00c4ndern des Passwortes zu bauen.<!--more--><\/p>\n<p>Leider gibt es keine fertige L\u00f6sung, die man nur noch mit eigenem CSS anpassen muss und auch dieser Blogeintrag liefert so etwas nicht. Die erste Suche bei Google f\u00fchrt zu <a href=\"http:\/\/logout.sh\/computers\/ldap\/\">logout.sh<\/a>: Hier werden aber leider nur die grundlegenden Schritte  skizziert. Aber wie sch\u00f6n ein paar mal erw\u00e4hnt: Geht nicht, gibts bei uns nicht. Notfalls muss man das halt selbst programmieren&#8230;<\/p>\n<h4>LDAP<\/h4>\n<p>Zuerst muss sichergestellt werden, dass die LDAP-Zugriffsberechtigungen f\u00fcr die Attribute richtig gesetzt sind. Damit es f\u00fcrs Blog nicht zu breit wird, habe ich es in zwei Teile geteilt.<\/p>\n<pre>access to attrs=userPassword,sambaNTPassword,sambaLMPassword\r\n        by self write\r\n        by anonymous auth\r\n        by * none<\/pre>\n<p>und<\/p>\n<pre>access to attrs=sambaPwdMustChange,sambaPwdLastSet\r\n        by self write\r\n        by anonymous auth\r\n        by * none<\/pre>\n<p>Zus\u00e4tzlich sollten die Parameter, die zur Passwort-Alterung n\u00f6tig sind, mit passenden Zugriffsrechten ausgestattet sein. Das sollte per Default passen, hier nur nochmal zur Sicherheit:<\/p>\n<pre>access to attrs=shadowLastChange,shadowMax\r\n        by self write\r\n        by * read<\/pre>\n<h4>Unix Passwort \u00e4ndern<\/h4>\n<p>Prinzipiell funktioniert dann das \u00c4ndern des Unix-Passworts so:<\/p>\n<pre>\r\nfunction change_posix_pwd($conn, $uid, $pwd) {\r\n   $hash_pass = \"{MD5}\" . base64_encode(pack( \"H*\", md5($pwd)));\r\n   $last_change = (int)(time()\/86400);\r\n   return ldap_mod_replace(\r\n      $conn, \r\n      \"uid=\" . $uid . \",ou=people,dc=xxx,dc=xxx\", \r\n      array(\"userPassword\" => $hash_pass, \"shadowLastChange\" => $last_change)\r\n   );\r\n}\r\n<\/pre>\n<p>Die Details, wie man mit PHP auf einen LDAP-Server zugreift, lasse ich hier mal aus. Die API-Funktionen sind auf der <a href=\"http:\/\/de.php.net\/manual\/de\/ref.ldap.php\">PHP-Webseite<\/a> beschrieben. Ein gutes Tutorial gibt es auch bei <a href=\"http:\/\/de.wikibooks.org\/wiki\/Websiteentwicklung:_PHP:_LDAP\">wikibooks<\/a>.<\/p>\n<p>Nur eines: baut man eine Verbindung zu einem OpenLDAP-Server auf, wird das immer klappen \u2013 auch wenn man den falschen Hostnamen verwendet hat. Ob es wirklich geklappt hat, sieht man an einem anonymen Bind:<\/p>\n<pre>ldap_set_option ($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);\t\t\r\nif (!@ldap_bind($ldapconn)) {\r\n   die(\"Kein Zugriff auf den LDAP-Server\");\r\n}\r\n<\/pre>\n<p>Im Codeschnipsel sieht man auch gleich, wie man die LDAP-Version f\u00fcr die Verbindung passend setzen kann. Die gew\u00fcnschte Version ist letztendlich abh\u00e4ngig von der Konfiguration.<\/p>\n<p>Kommen weitergehende Features, wie z.B. Passw\u00f6rter mit Ablaufdatum ins Spiel, kann ich nur die Lekt\u00fcre von<code>\/usr\/sbin\/smbldap-passwd<\/code> und dem zugeh\u00f6rigen Perl Modul (<code>\/usr\/share\/perl5\/smbldap_tools.pm<\/code>) empfehlen. Nachdem ich diese Funktionen momentan nicht verwende, kann meine L\u00f6sung damit im Moment auch nicht umgehen. Auch mit anderen Hashfunktionen als MD5 f\u00fcr die Passw\u00f6rter kann meine momentane L\u00f6sung nicht umgehen.<\/p>\n<h4>Windows Passw\u00f6rter \u00e4ndern<\/h4>\n<p>Windows kocht bei der Hashfunktion f\u00fcr die Passw\u00f6rter ein vollkommen eigenes S\u00fcppchen. Es gibt in der PHP API auch keine passende Hashfunktion. Auch das von den smbldap-tools verwendete Perl-Paket Crypt::SmbHash gibt es nicht f\u00fcr PHP. Gl\u00fccklicherweise gibt es aber bereits einen <a href=\"http:\/\/www.koders.com\/php\/fidC803D608E93A9E4FD6F3B4C4270B8A37DFD42261.aspx\">Port von Roland Gruber<\/a>, so dass einem diese unangenehme Aufgabe erspart bleibt.<\/p>\n<p>Damit kann man auch die entsprechenden Felder im LDAP \u00e4ndern:<\/p>\n<pre>\r\ninclude_once(\"class.smbhash.inc.php\");\r\n\r\nfunction change_samba_pwd($conn, $uid, $pwd) {\r\n   $clazz = new smbHash();\r\n   $lmhash = $clazz->lmhash($pwd);\r\n   $nthash = $clazz->nthash($pwd);\r\n   $time = time();\r\n\t\t\r\n   return ldap_mod_replace(\r\n      $conn, \r\n      \"uid=\" . $uid . \",ou=people,dc=xxx,dc=xxx\", \r\n      array(\r\n         \"sambaLMPassword\" => $lmhash, \r\n         \"sambaNTPassword\" => $nthash, \r\n         \"sambaPwdLastSet\" => $time\r\n      )\r\n   );\r\n}\r\n<\/pre>\n<p>Auch hier verwende ich die erweiterten Features, wie Passw\u00f6rter, die vom Benutzer beim ersten Einloggen ge\u00e4ndert werden m\u00fcssen, nicht. Der Quellcode von <code>smbldap-passwd<\/code> hilft auch bei diesem Problem weiter.<\/p>\n<h4>Fazit<\/h4>\n<p>Eine Seite zum \u00c4ndern der Passw\u00f6rter ist in PHP mit 300 Zeilen Code leicht erstellt. Meine PHP-Kenntnisse haben leider nur zu grausamen aussehenden Code gereicht, daher gibt es das hier auch nicht zum Download. Aber selbst als Laie konnte ich das mit der n\u00f6tigen Recherche an einem Vormittag realisieren. <\/p>\n<p>Meine L\u00f6sung verwendet das gleiche <a href=\"http:\/\/www.realmacsoftware.com\/rapidweaver\/\">Rapidweaver<\/a>-Template wie meine Intranet-Seite. Das Ergebnis sieht nicht nur schick aus, sondern funktioniert auch bei weniger erfahrenen Benutzern problemlos.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wie kann ich denn mein Passwort \u00e4ndern? Diese Frage kennen wohl die meisten Linux-Admins zur Gen\u00fcge. Oft haben sie aber keine Antwort parat, mit der auch unerfahrene Benutzer etwas anfangen k\u00f6nnen \u2013 SSH und Kommandozeile sind nunmal nicht jedermanns Sache. Ich m\u00f6chte deshalb ein paar Tipps geben, die helfen sollen, ein Webinterface zum \u00c4ndern des [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-722","post","type-post","status-publish","format-standard","hentry","category-linux"],"_links":{"self":[{"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/722","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=722"}],"version-history":[{"count":18,"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/722\/revisions"}],"predecessor-version":[{"id":2090,"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/722\/revisions\/2090"}],"wp:attachment":[{"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}