phpLDAPadminでパスワード変更用U/Iを用意する。

LDAPの管理自体はコマンドラインで行えば良いのですが、LDAPで管理しているユーザ自身のパスワードの変更は、ブラウザで簡単にやらせたいですよね。なので、何か無いかなぁと探してみたら、同じようなことをphpLDAPadminでやったという ブログ見つけた のですが、細かいところは載っていなかったのでメモしておきました。

導入はいつもの通りDebianなので至極簡単で、

$ sudo apt-get install phpldapadmin

でOKです。しかもOSのユーザアカウントの認証の設定が済んでいるホストに導入すると、LDAPサーバへの問い合わせまわりの設定を自動的にやってくれます。なので、インストール後にhttp://localhost/phpldapadmin/にアクセスすると、phpLDAPadminの画面が表示され、adminユーザやその他のposixAccountでパスワード設定しているユーザでもすぐにログインできます。便利ですね。

ところが、この状態ではadminユーザだけでなく、一般ユーザでも他のユーザのオブジェクトの情報が丸見えです。LDAPサーバ側で特にアクセス制御していないからそりゃそうなんですけどね。で、別に見えるのは別に構わないのですが、やりたいことは、単に自分のパスワードの変更だけをさせることです。ユーザには余計な情報や、余計な編集用のフォームは見せる必要は無いのです。なので、オブジェクトツリーも、変更用のフォームも見えないようにしてやりました。 [1]

diff --git a/phpldapadmin/config.php b/phpldapadmin/config.php
index f89e5fa..075a7da 100644
--- a/phpldapadmin/config.php
+++ b/phpldapadmin/config.php
@@ -79,6 +79,7 @@
    assume UTC if you have not set PHP date.timezone. */
 // $config->custom->appearance['timezone'] = null;
 #  $config->custom->appearance['timezone'] = 'Australia/Melbourne';
+$config->custom->appearance['timezone'] = 'Asia/Tokyo';

 /*********************************************/
 /* Commands                                  */
@@ -154,10 +155,11 @@ $config->custom->commands['script'] = array(
 // $config->custom->appearance['disable_default_template'] = false;

 /* Hide the warnings for invalid objectClasses/attributes in templates. */
-// $config->custom->appearance['hide_template_warning'] = false;
+$config->custom->appearance['hide_template_warning'] = true;

 /* Configure what objects are shown in left hand tree */
 // $config->custom->appearance['tree_filter'] = '(objectclass=*)';
+$config->custom->appearance['tree_filter'] = '(ou=People)';

 /* The height and width of the tree. If these values are not set, then
    no tree scroll bars are provided. */
@@ -192,6 +194,7 @@ $config->custom->appearance['friendly_attrs'] = array(
    excluded. */
 // $config->custom->appearance['hide_attrs'] = array();
 #  $config->custom->appearance['hide_attrs'] = array('objectClass');
+$config->custom->appearance['hide_attrs'] = array('cn','mail','gidNumber','give
nName','homeDirectory','loginShell','o','objectClass','uidNumber','uid','sn','fa
csimileTelephoneNumber','telephoneNumber','jpegPhoto','street','postalCode','st'
,'mobile','l','memberUid','ou','description');

 /* Members of this list will be exempt from the hidden attributes.*/
 // $config->custom->appearance['hide_attrs_exempt'] = null;
@@ -208,6 +211,7 @@ $config->custom->appearance['friendly_attrs'] = array(
    NOTE: The user must be able to read the readonly_attrs_exempt entry to be
    excluded. */
 // $config->custom->appearance['readonly_attrs'] = array();
+$config->custom->appearance['readonly_attrs'] = array('cn','mail','gidNumber','
givenName','homeDirectory','loginShell','o','objectClass','uidNumber','uid','sn'
,'facsimileTelephoneNumber','telephoneNumber','jpegPhoto','street','postalCode',
'st','mobile','l','memberUid','ou','description');

 /* Members of this list will be exempt from the readonly attributes.*/
 // $config->custom->appearance['readonly_attrs_exempt'] = null;
@@ -303,7 +307,7 @@ $servers->setValue('login','auth_type','session');
    you specify a login_attr in conjunction with a cookie or session auth_type,
    then you can also specify the bind_id/bind_pass here for searching the
    directory for users (ie, if your LDAP server does not allow anonymous binds.
 */
-$servers->setValue('login','bind_id','cn=admin,dc=example,dc=org');
+//$servers->setValue('login','bind_id','cn=admin,dc=example,dc=org');
 #  $servers->setValue('login','bind_id','cn=Manager,dc=example,dc=com');

 /* Your LDAP password. If you specified an empty bind_id above, this MUST also
@@ -314,6 +318,9 @@ $servers->setValue('login','bind_id','cn=admin,dc=example,dc=org');
 /* Use TLS (Transport Layer Security) to connect to the LDAP server. */
 // $servers->setValue('server','tls',false);

+// custom
+$servers->setValue('login','attr','uid');
+
 /************************************
  *      SASL Authentication         *
  ************************************/
@@ -421,13 +429,14 @@ $servers->setValue('login','bind_id','cn=admin,dc=example,dc=org');
    (readonly) access to uidnumber in your ldap directory (the logged in user
    may not), so that you can be guaranteed to get a unique uidnumber for your
    directory. */
-// $servers->setValue('auto_number','dn',null);
+//$servers->setValue('auto_number','dn',null);

 /* The password for the dn above. */
 // $servers->setValue('auto_number','pass',null);
 /* Enable anonymous bind login. */
 // $servers->setValue('login','anon_bind',true);
+$servers->setValue('login','anon_bind',false);

 /* Use customized page with prefix when available. */
 #  $servers->setValue('custom','pages_prefix','custom_');

今回変更したところで、”ユーザにパスワードの変更だけをさせる”という目的に関連するところだけピックアップしておくと、

  • $config->custom->appearance[‘hide_template_warning’] をtrueにすることで、画面上で表示されるログを抑制
  • $config->custom->appearance[‘tree_filter’] = ‘(ou=People)’を追加して、左のメニューに表示されるデフォルトのオブジェクトツリーをユーザ情報(People)だけにする
  • $config->custom->appearance[‘hide_attrs’]に、表示させたくない属性を列挙
    • 非表示にした属性は以下。まぁ要は自分のパスワード以外は全部非表示に。cn, mail, gidNumber, givenName, homeDirectory, loginShell, o, objectClass, uidNumber, uid, sn, facsimileTelephoneNumber, telephoneNumber, jpegPhoto, street, postalCode, st, mobile, l, memberUid, ou, description
  • $config->custom->appearance[‘readonly_attrs’]で編集画面で、表示される属性をリードオンリーに。上と同じ属性を列挙したので、結局は表示されないのですが、念の為
  • $servers->setValue(‘login’,’bind_id’,’cn=admin,dc=example,dc=org’);をコメントアウトして、ログイン画面で自動補完されるadmin情報を無効に
  • $servers->setValue(‘login’,’attr’,’uid’);で、ログイン画面でのアカウント名の指定をuidだけでOKに
  • +$servers->setValue(‘login’,’anon_bind’,false);で匿名ユーザでのログインを無効に

以上でユーザ用のパスワード変更画面を用意できます。パスワード忘れた時の再発行はこれではユーザ自身で解決することはできませんが、それでもまぁかなり楽ですね。

[1]このやり方では参考にしたブログにもある通り、検索したり、子ノードを走査すれば”見える”のですが、見えたところで別に変更できるわけではないので、そこはまぁそこまでやる必要はないので妥協。