Date: 2005-06-09
Tags: unix

Apacheの認証をLDAPでActiveDirectoryに問い合わせ

Apache2からWindows2003/ActiveDirectoryに対してLDAPで認証を行ってみた。試行錯誤の末、とりあえず目的の半分は達成した。

Windows2003なActiveDirectoryに格納されているユーザーの認証はうまくいっているのに、どうやらWindows2000なActiveDirectoryへの問い合わせがうまくいかないらしい。この2台が同一ドメインの親子関係にあるため & ActiveDirectoryの中身をよく知らなかったことで、問題の切り分けに手間取ってしまった。

以下は最終的にとりあえず落ち着いている設定。

AuthName "Please enter your ID and password"
AuthType Basic

## for Windows2003 ActiveDirectory
AuthLDAPBindDN Administrator@dom.example.com
AuthLDAPBindPassword secret
AuthLDAPUrl ldap://sub1.dom.example.com:389/dc=sub1,dc=dom,dc=example,dc=com?sAMAccountName?sub

## for OpenLDAP
#AuthLDAPUrl ldap://openldap.example.com:389/ou=Users,dc=example,dc=com?uid?sub

Require valid-user

DNの記述

BindDNでLDAPだと `cn=Manager,dc=example,dc=com` と書くところが、ActiveDirectoryだと `Manager@example.com` としないといけないようだ。それでいてユーザー検索のBaseDNは `ou=Users,dc=example,dc=com` だったり。混乱するなぁ!

ユーザーIDの指定

認証先がOpenLDAPなら、uidとかcnとかのいわゆるアカウント名をブラウザの認証ダイアログに指定する。以下の例なら taka と入れるわけだ:

dn: uid=taka,ou=Users,dc=example,dc=com
uid: taka

ところが、ActiveDirectoryの場合は(自分には)ちょっと複雑で以下のようになっている:

dn: CN=清水川,DC=dom,DC=example,DC=com
cn: 清水川
userPrincipalName: taka@dom.example.com
sAMAccountName: taka

Windowsのログイン名がそのまま使えます!と言うためには sAMAccountName 属性を使って認証するしかない?ていうかdnはログイン名(taka)じゃないの?え?日本語?

検索と認証の二段階

最初はLDAPにbindする事で認証出来るようにしたかった。そうすればLDAPにアクセスするための管理者アカウント設定等を.htaccessとかに書かなくて良くなるからだ。ところが、前述の ユーザーIDの指定 のようになっていると、ブラウザの認証ダイアログに入力されたアカウント名でもってbindする方法がよくわからなかった。AuthLDAPUrlでは無理なのかも?ということで、今はLDAPにアクセス出来るアカウントが.htaccessに書かれている。セキュリティー気をつけないと。

そして問題

認証先のActiveDirectoryはドメインツリーを構成しているので、ユーザーが `dom.example.com``sub1.dom.example.com` に分割登録されている。そこで、 `dom.example.com` の方にscope=subで検索をかければ全員認証出来るかな?と思って試してみたところ、どうもうまくいかない。で、ldapsearchで試してみたところ、以下のように表示された:

% ldapsearch -h dom.example.com -a always -s sub -D \
  "Administrator@dom.example.com" -W -b "dc=dom,dc=example,dc=com"

  #中略(親側サーバーに入っている全ユーザーのデータ表示)

# search reference
ref: ldap://sub1.dom.example.com/DC=sub1,DC=dom,DC=example,DC=com

あー、サブドメイン側 `sub1.dom.example.com` のデータは reference になってるのか...。referenceはよくわからんのだけど、 mod_auth_ldap では解決してくれないのかな?もしかしてこれのせいでうまくいってないのかな??

でも冒頭に書いたように、単にWindows2000の方(親の方)でなにか問題が起きてるのかも?そういえばLDAPで直接問い合わせてもなぜかmod_auth_ldapがエラーを起こして認証出来なかったし!と今これを書きながら思ったり。

まとめと逃避

認証ダイアログでPrincipalNameを打ち込む事にすると解決する問題なのかもしれない。あるいはもしかしたら、LDAP使わなければ簡単に解決出来るんだろうか?Radius認証とか色々Apache用の認証モジュールはあるみたいだし、pamに逃げるという手もある。pam -> samba -> AD とか。簡単に解決する方法を調べるために、もうちょっともがいてみよう....。

# カテゴリ、Windowsかな..