Apache+ldap+eDirectory
『ldap』という言葉はずいぶん前から知っていたし、意識もしていた。けれども、それは他人事であり私が関与することなど無いと思っていた。
しかし、世はセキュリティ重視の時代、ここに来てJSOXまで施行されるに至り見ないふりを続けるのも心苦しくなってきた。
そこで取りあえずldap認証を経験してみることにした。
ところが、私の勤務先ではいにしえよりNovellのNetwareをサーバーとして使っている。多くの企業ではMicrosoftのActive Directoryを使っているのだろうが、こちらはNovellのeDirectory、さて、うまくいくのか。
まずはeDirectoryサーバー側でldapが動いているか確認する。
ポートスキャンすると、389番ポートは開いている。[NLDAP.NLM]とか[LDAPSDK.NLM]とか[LDAPXS.NLM]とか、ldap関連のモジュールも動いているようだ。
どうやらサーバー側の準備は整っているように見受けられる。
では、早速ldapを使ってみよう。
どうやって?
最初はXOOPSにldap認証をやらせようかと思ったのだが、簡単には出来そうになかったので諦め、ApacheのBasic認証にldapを使うことにした。
ここのところ、実験用サーバーといえばCentOSだ。今回もCentOS5を使った。インストールされているApacheのバージョンは2.2.3だった。
/etc/httpd/conf/httpd.confを見ると、
LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
と、デフォルトでldap関連モジュールは組み込まれているようだ。
後は認証の設定を書けば良いだけである。
今回はドキュメントルートにBasic認証を掛けてみることにする。
と、ここでeDirectoryの登録内容を確認しておきたい。って、これにエライ苦労をしたんだが。
結局、ldapを操作できるツールを落としてきて、それで設定をLDIFエクスポートした。ここにたどり着くまで[Novell ConsoleOne]やらなんやらとずいぶん格闘してしまった。
さて、そのLDIFの抜粋である(セキュリティ上の理由から、適当に書き換えてある)。
ここではユーザー[MyName]が、[MyGroup]と[EVERYONE]グループに所属している。
LDIF の抜粋
[MyName]ユーザーの定義はおおむね次のようになってる。
dn: ldap://netware.mydomain.co.jp:389/cn=MyName,ou=users,o=flyshonan, ou=users,o=flyshonan,t=FLY_TREE
uid: MyName
groupMembership: cn=MyGroup,ou=users,o=flyshonan
groupMembership: cn=EVERYONE,ou=users,o=flyshonan
cn: MyName
securityEquals: cn=MyGroup,ou=users,o=flyshonan
securityEquals: cn=EVERYONE,ou=users,o=flyshonan
[MyGroup]グループの定義は次のとおりだ。
dn: ldap://netware.mydomain.co.jp:389/cn=MyGroup,ou=users,o=flyshonan, ou=users,o=flyshonan,t=FLY_TREE
equivalentToMe: cn=MyName,ou=users,o=flyshonan
equivalentToMe: cn=OtherName,ou=users,o=flyshonan
uniqueMember: cn=MyName,ou=users,o=flyshonan
uniqueMember: cn=OtherName,ou=users,o=flyshonan
cn: MyGroup
では、Apacheのコンフィギュレーションに戻ってみよう。
ドキュメントルートの設定を書こう。
場所は、/etc/httpd/conf/httpd.conf内か、あるいは/etc/httpd/conf.dにldap.confファイルを作成してそこに書いても良いだろう。今回は後者の方法を採った。
AuthName “Authorized users Area”
AuthType Basic
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPURL “ldap://netware.mydomain.co.jp:389/ou=users,o=flyshonan,t=FLY_TREE?uid?”
Require valid-user
[AuthName]に指定した名前は、認証要求ダイアログに表示される。適当な名前を付けておく。
[AuthType]はBasic認証なので"Basic"とする。
[AuthBasicProvider]には"ldap"を指定する。
[AuthzLDAPAuthoritative]は、この認証方式がコケたときに他の認証方式を使うかどうかの指定だ。ここでは"off"にしておいた。
[AuthLDAPURL]には、ldap検索パラメータURLを指定する。シンタックスは[ldap://host:port/basedn?attribute?scope?filter]だ。ここにフィルターを書くことも出来る。
[Require]には"valid-user"を指定する。これは認証された全てのユーザーを許可する。
ここで、HTTPサーバーを再起動しよう。
service httpd restart
クライアントからアクセスしてみる。
認証要求ダイアログが表示されたら、ユーザー[MyName]で接続可能なこと、別のユーザーでは接続が拒否されることを確認しておく。
――うまくいっているようだ。
ここまではeDirectoryだからといって特に変わった設定は必要なかった。
インターネットに公開しているサーバーに、社員専用エリアを作りたいときなどには、この設定で行けそうである。
しかし、イントラネットなどではさらにアクセス可能なユーザーを絞りたい場合も多いだろう。そんな時には、
Require valid-user
の代わりに、
Require user MyName OtherName
のように、ユーザーをスペースで区切って並べることが出来る。NetwareではユーザーIDの大文字小文字を区別しないが、Requireディレクティブに書くと、大文字小文字が区別される。
しかし、これも一人二人ならまだしも、数十人、数百人になると現実的ではなくなる。
そんな時にはグループ単位で認証したいものだ。
そこで、設定ファイルを以下のように書き換えてみた。
AuthName “Authorized users Area”
AuthType Basic
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPURL “ldap://netware.mydomain.co.jp:389/ou=users,o=flyshonan,t=FLY_TREE?uid?”
AuthLDAPGroupAttribute memberUid
AuthLDAPGroupAttributeIsDN off
Require ldap-group MyGroup
が、なぜかうまく行ってはくれなかった。
error_logを見ると、次のようなログが書かれていた。
[Thu Sep 04 12:01:33 2008] [debug] mod_authnz_ldap.c(373): [client 10.9.228.10] [30892] auth_ldap authenticate: using URL ldap://netware.mydomain.co.jp:389/ou=users,o=flyshonan,t=FLY_TREE?uid?
[Thu Sep 04 12:01:33 2008] [debug] mod_authnz_ldap.c(454): [client 10.9.228.10] [30892] auth_ldap authenticate: accepting MyName
[Thu Sep 04 12:01:33 2008] [debug] mod_authnz_ldap.c(691): [client 10.9.228.10] [30892] auth_ldap authorise: require group: testing for group membership in “MyGroup”
[Thu Sep 04 12:01:33 2008] [debug] mod_authnz_ldap.c(697): [client 10.9.228.10] [30892] auth_ldap authorise: require group: testing for member: MyName (MyGroup)
[Thu Sep 04 12:01:33 2008] [debug] mod_authnz_ldap.c(713): [client 10.9.228.10] [30892] auth_ldap authorise: require group “MyGroup”: authorisation failed [Comparison complete][No such object]
[Thu Sep 04 12:01:33 2008] [debug] mod_authnz_ldap.c(826): [client 10.9.228.10] [30892] auth_ldap authorise: authorisation denied
グループ認証が出来ていないらしい。
“ou=users"の部分が"ou=MyGroup1″、"ou=MyGroup2″のように分かれていれば簡単だったんだろうけど。まあ、今更言っても始まらない。
ここから悪戦苦闘の末、設定ファイルを次のようにしてみた。
AuthName “Authorized users Area”
AuthType Basic
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPURL “ldap://netware.mydomain.co.jp:389/ou=users,o=flyshonan,t=FLY_TREE?uid?”
Require ldap-attribute groupMembership="cn=MyGroup,ou=users,o=flyshonan”
[Require]でアトリビュート値をチェックするようにした。LDIFの情報から、"groupMembership"アトリビュートを調べれば良いことが判った。
これでHTTPサーバーを再起動したところ、望み通りの動作をしてくれた。
“Require ldap-attribute"を複数設定することで、複数のグループにアクセスを許可することも出来る。
また、"Satisfy all"ディレクティブを書けば、複数の条件全てを満たすユーザーのみ認証することも出来る。
これでイントラネットサーバーに部署毎のディレクトリを用意することも出来そうだ。WebDAVと組み合わせてもおもしろそうだ。
Novell eDirectoryはメジャーでは無いかも知れないが、ldapサーバーとしても十分に使えそうだ。今後はApache以外での使用も検討していくつもりだ。
# もうすぐバーレーン戦だ。ここはすっきりと勝って欲しい。――負けるとかなり厳しい事になる――
TrackBacks
TrackBack URL : http://www.kestrel.jp/modules/wordpress/wp-trackback.php/137
look at here now
flyman のおもちゃ箱 - PhotoLog : linux
Trackback by about us — 2018年7月7日(土曜日) @ 17時31分07秒
coupon code
flyman のおもちゃ箱 - PhotoLog : Apache ldap eDirectory by flyman
Trackback by coupon code — 2018年9月3日(月曜日) @ 03時44分47秒