2007年7月7日土曜日

(FreeBSD)ユーザーが自分でLDAPのパスワードを変更できるようにしたい ~ phpldapadminを試してみました

Apache httpdで、HTTP BASIC認証のときに、LDAPを使っています。
ふと、こんな要望が出てきました。



  • LDAPアカウントのパスワードの変更を、各ユーザーが自分で行えるようにしたい


  • ユーザーは、FreeBSDマシンにログインできる権限をもっていない
    (objectClassが、posixAccountではなく、personになっている。apache httpdでLDAP認証ができる程度の情報しか登録されていない)


  • だから、smbpasswdコマンドや、ldappasswdコマンドを実行することはできない


  • Webブラウザ上でパスワード変更できるようにするのがいい


・・・ということで、なんかいいツールがないかなぁ~と思って、最初に思いついたのが、「usermin」でした。

http://www.usermin.com/

portsだと、sysutils/usermin にあります。さっそく試してみようと思ったら、なんだか/etc/master.passwdとか、ローカルアカウントのパスワードを変更するっぽい雰囲気。

ウェブ検索してみると、Linuxとかで、pam経由でのパスワード変更をすることで、LDAPパスワードが変更できるように設定されていれば、userminでも可能・・・みたいなことがかかれていました。・・・うーん、FreeBSDで、それってできるの?!

とりあえず、userminはパス(笑)。惜しいんですけど。

しょうがないので、portsの中をgrepしてみると、

net/phpldapadmin
net/phpldapadmin098

というのを見つけました。

http://phpldapadmin.sourceforge.net/

net/phpldapadminは、PHPバージョン5系列用で、net/phpldapadmin098は、PHPバージョン4系列用らしいです。



さっそくインストールしてみました。portsだからmake install cleanでOK。

/usr/local/www/phpldapadmin/以下にインストールされたので、alias設定やアクセス制限など、apache httpdの設定をそれなりに行ってやります(できない人は使っちゃダメ・・・笑)。

phpldapadminの設定ファイル「config.php」を適切に編集。ちょっとわかりにくくて、すこーし、試行錯誤が必要でした。



とりあえず今回は不要なので、anonymous bind(認証なしでLDAPアクセス)をできないようにしておきました。





あとは、ウェブブラウザからアクセス。

最初はこんな画面。どうやら、ブラウザの言語設定にあわせて、英語、日本語、自動切換えをしてるっぽいです。



200707061
(画像をクリックして拡大表示)








ログイン画面はこんなかんじ。


200707062_1



httpsではなくhttpでアクセスすると




Warning: This web connection is unencrypted.




と表示されます。一応、httpsにしておきますか(自己署名なサーバ証明書では安全を確保できないことはわかってますが・・・)。




ログイン名のところ、「DN」って書いてあるので、aliceやbobみたいなログインネームではなく、「uid=alice,ou=People,dc=hoge,dc=sample」みたいな、長ったらしいDN(=distinguished name)を使うみたいです。

(2007/07/20 追記)



設定ファイルをあれこれいじってたら、ユーザー名だけ(aliceなど)でもログインできるようになりました。



ログイン後の画面。左側のペインに、LDAPの木構造が表示され、選択した部分が、右側に表示されるようになってます。



200707063


このphpldapadminって、実は、LDAPディレクトリの情報をウェブ上で編集するためのツールでして、「ユーザーがパスワードを変更するためだけ」に使うには、ちょっと大げさすぎるようです。



デフォルトだと、見える必要のないところまで見えてしまい、見えすぎちゃって困るのですが、config.phpの中で、



$ldapservers->SetValue($i,'server','base',array('うんたら かんたら'));



というように、base DNを指定することで、見える範囲を絞り込むことはできました。

(2007/07/20 追記)



設定ファイルにて、base指定以外にも、見えるものを限定する方法があるようです。



とりあえず、このphpldapadminでいってみようと思います。





(2008年2月3日 追記)



base DNを指定する以外の方法で、ブラウザに表示される項目を制限する方法について、なんとなくできそう、と思うだけで試していなかったので、実際に試してみました。



なお、今回試したときは、phpldapadminのバージョンは1.1.0.4になってます。



$config->custom->appearance['tree_filter'] 」と、「$hidden_attrs」の、2つの方法で、ブラウザに表示される項目を制限できるようです。



ただし、試してみてわかったのですが、セキュリティ面を気にするときは、base DNで最初に絞り込んでおくほうがよさそうです。



(1) 左側のツリー表示される部分を制限する。



config.phpの「$config->custom->appearance['tree_filter'] 」を指定します。



ここで指定できるのは、ldapsearchコマンドのLDAPフィルタと同じ書式らしいです。
たとえば、こんな感じです。



$config->custom->appearance['tree_filter'] = '(ou=People)';
$config->custom->appearance['tree_filter'] = '(|(ou=People)(objectClass=posixAccount))';                                                                     



'(|(ou=People)(objectClass=posixAccount))'と指定した場合。(クリックして拡大表示)



20080203ldap2


注意すべきことがあって、このtree_filterは、ツリー表示の+マークをクリックしていったとき閲覧できる項目を制限するだけです。検索機能を使うときは、tree_filterは効かないので、このフィルタ以外のものも、見たり(権限があれば)編集もできます。



ログインした人の情報だけ編集できるようにしたくて



$config->custom->appearance['tree_filter'] = '(|(ou=people)(uid=<username>))'; 



と書いてみたんですが、ダメでした。<username>ってのは、



$ldapservers->SetValue($i,'login','string','uid=<username>,ou=People,なんとかかんとか');



では使えるんですけどね。



なお、本当のuidを、'(|(ou=people)(uid=suzuki))'とか書けば、suzukiさんだけ表示されます。当然ですが、suzukiさん以外にもsuzukiさんだけ見える、ということになります(笑)。



ふと気がついたんですが、ログインした人が自分の情報だけ見えるようにしたいときは、左側の上の方に「Logged in as: だれだれ」と表示されていて、そこをクリックすれば、自分のアカウント情報を編集できる画面になりました。



なので、



$config->custom->appearance['tree_filter'] = '(ou=People)';



とかにしておいて、実質的に、ツリー表示に何にも表示されないようにしておいても、自分のパスワード変更くらいはできる、というわけです。



念のため繰り返しておきますが、tree_filterを指定していても、検索機能を使えば、他のユーザーアカウントの情報を見ることはできます。
ページ右側の表示で、「・・・子を閲覧」をクリックしたときにも、tree_filterは効きません。



(クリックして拡大表示)



20080203ldap1





(2) 右側のエディタ部分に表示される属性を制限する。



config.phpの「$hidden_attrs」に属性を書いておくと、その属性が、エディタ(編集画面)には表示されなくなります。



ただし、検索機能などを使ったりして、閲覧するときには、この$hidden_attrsによる制限は効きません。



たとえば、



$hidden_attrs = array( 'sambaAcctFlags', 'sambaPasswordHistory', 'sambaPrimaryGroupSID', 'sambaPwdCanChange', 'sambaPwdLastSet', 'sambaPwdMustChange', 'sambaSID' );



にすると、Sambaで使ってる属性が、エディタ画面に表示されなくなります。






5 件のコメント:

  1. FreeBSDだとRAQdevilと言うサーバ管理ツールもあります。
    http://www.raqdevil.com/
    日本語にも対応しているようですので試してみてはどうでしょうか。

    返信削除
  2. コメントどうもありがとうございます。RAQdevilは知りませんでした。
    portsだと、www/raqdevilにありました。
    マニュアルをざっと検索しただけですが、今回欲しかった、ユーザーが自分でLDAPアカウントのパスワードを変更する機能が、あるのか、ないのか、見つかりませんでした。
    むしろ、usermin…じゃなくてwebminと同等の機能をもったツールなのかな?と第一印象として感じました。

    返信削除
  3. ログインしたユーザーで見える範囲を絞り込みたいと考えているのですが
    以下の方法というのは、どのようなものかご存知でしょうか
    >(2007/07/20 追記)
    >設定ファイルにて、base指定以外にも、見えるものを限定する方法があるようです。

    返信削除
  4. 少し書き足してみました。
    「ログインした人」によって表示項目を切り替えるのは、いまひとつ、いい方法が見つけられませんでした。
    厳密にコントロールしたいのなら、LDAPサーバ側でのアクセス権限設定(openldapならslapd.confのaccess)でやるしかないのかもしれません。
    あと、PHPで書かれているので、phpldapadminを改造するのはそんなに難しくないかもしれませんが・・・

    返信削除
  5. なるほど。
    そのような指定も可能なのですね。
    厳密にやるならやはりphpldapadminの改修が必要そうですね。
    ありがとうございました。

    返信削除