おそらく不具合バージョンに更新されていたんだと思うのだが、この記事が出ていた当時起動が10倍以上速くなっていた。
のだが、なんか元に戻っている。 多分初期化処理の早期にある程度操作できるようメインプロセスを起動したけど、 初期化処理が終わらないうちに電源切ると、問題のある状態になるとかそんな感じだろうか。
ldap-status をldap認証するという例がmod_ldapのマニュアルにあったので、 ActiveDirectoryに向かって認証の実験。
サンプル通りだと AuthType がないぞ、と文句言うので AuthType Basic を追加、さらに Basic認証の中で LDAP認証を確実に実行させるために、
AuthBasicProvider ldap を追加した。
tcpdump -vvv -X -s 1500 port 389 コマンドで通信を見ながら調査。
<Location /ldap-status> SetHandler ldap-status AuthType Basic AuthName ldapstatus AuthBasicProvider ldap AuthLDAPBindDN ldapuser@ad.example.com AuthLDAPBindPassword ******** # AuthLDAPURL ldap://dc1.ad.example.com/dc=ad,dc=example,dc=com?sAMAccountName?sub?(objectClass=*) # AuthLDAPURL ldap://dc1.ad.example.com/?sAMAccountName?sub?(objectClass=*) AuthLDAPURL ldap://dc1.ad.example.com/?userPrincipalName?sub?(objectClass=user) AuthzLDAPAuthoritative off require valid-user </Location>
AuthLDAPURLに dc=ad,dc=example,dc=comの部分を入れると次のような感じでServer Error が発生するので、そこは削除してドメイン全体を検索させることに。
[Sun Nov 19 08:32:14 2006] [warn] [client x.x.x.x] [72643] auth_ldap authenticate: user h authentication failed; URI /ldap-status [ldap_search_ext_s() for user failed][Operations error]
ブラウザのダイアログで入力するIDはuserPrincipalNameと比較することにした。 この場合、入力するのは "username@ad.example.com" とメールアドレスのような形式である。(まさにprincipalNameなわけだが)
一応LDAP経由でエントリを持ってくる部分には成功しているようなのだが、さらにブラウザで指定されたパスワードでバインドする部分が通らない。 distinguished name に日本語が入っているのが問題なのかなあ。 DNの日本語を止めるという選択をする気はないのでここで中断。
ちなみに、AuthLDAPBindDN を空にして、最初のLDAPエントリ持ってくる部分にKerberos認証を使ってくれるかどうかを確認してみたが、 Apacheの動作ユーザで kinit してTGTを取得していても、In order to perform this operation a successful bind must be completed on the connection. と言われる。 (この状態でApacheの動作ユーザによるldapsearchコマンドは成功する。) mod_authnz_ldap はKerberon認証によるLDAP接続に対応していないのかしら。
Apache2-SPNEGOを見ながらインストール作業。 対象マシンは FreeBSD-6.2RC1
fbopenssl, modgssapache はライブラリの作成だが、configureでもautomakeでもない状況。 俺は野良makeについては /local 以下に置くポリシーである。
fbopenssl のインストール作業は以下の通り
tar xzf fbopenssl-0.0.4.tar.gz cd fbopenssl env OPENSSLDIR=/usr/lib gmake CFG=release sudo mkdir -p /local/lib sudo install FreeBSD-release/libfbopenssl.a /local/lib/ sudo install FreeBSD-release/libfbopenssl.so /local/lib/ sudo pax -r -w include /local/
modgssapache 内の libspnegohelp のインストール作業は以下の通り
mkdir modgssapache cd modgssapache tar xzf ../modgssapache-0.0.5.tar.gz cd spnegohelp make "CFLAGS= -fpic -D__LITTLE_ENDIAN__" libs sudo install libspnegohelp.so /local/lib sudo install libspnegohelp.a /local/lib
mod_spnego のインストール作業は以下の通り(httpd.conf への反映は自分でやる)
/usr/local/sbin/apxs -c -i -DHEIMDAL -I/local/include -L/local/lib -lfbopenssl -lcrypto -lgssapi -lkrb5 -lasn1 -lroken -lcom_err -lcrypt mod_spnego.c
/local/lib に置いたライブラリをOSに認識させる作業。
/sbin/ldconfig -m /local/lib
httpd.conf に追加した設定。/server-status のところに認証をかけてみることにする。
LoadModule spnego_module libexec/apache22/mod_spnego.so Krb5AuthEachReq On <Location /server-status> SetHandler server-status Krb5KeyTabFile /usr/local/etc/apache22/http.keytab Krb5ServiceName http AuthType SPNEGO # Require user alice@FOO.COM bob@FOO.COM david@FOO.COM Require valid-user </Location>
ここからkeytabファイルを作成する作業。 WindowsServer2003 マシンで freebsd_http というユーザアカウントを作成した後、以下のコマンドで作成。
ktpass -princ http/freebsd.ad.example.com@AD.EXAMPLE.COM -mapuser AD\freebsd_http -pass * -out freebsdhttp.keytab
freebsdhttp.keytab をFreeBSDマシンに転送した後、以下のコマンドをFreeBSD側で実行して keytab ファイルを構築する。
ktutil copy freebsdhttp.keytab /usr/local/etc/apache22/http.keytab chown www /usr/local/etc/apache22/http.keytab chgrp www /usr/local/etc/apache22/http.keytab chmod 600 /usr/local/etc/apache22/http.keytab rm freebsdhttp.keytab
これでapache2側の設定は完了。apache2を再起動して IE6 から http://freebsd.ad.example.com/server-status にアクセスすると、
ダイアログが現われてアカウントとパスワードを入力する。ここでのアカウントはWindowsルールなので
AD\ユーザ名,ユーザ名@ad.example.com のいずれの形式でもよい。
さらにIE側の設定をするとWindows統合認証になる。すなわちダイアログなしで、ログオンしたユーザの情報を自動的に渡してくれるようになる。 設定方法は HTTP-Based Cross-Platform Authentication via the Negotiate Protocol に記載されている。
IE側の設定ポイントは以下の通り。
こんなの一般ユーザにやらせるのは無理なので、運用においてはグループポリシーに設定することになるだろう。
最近Windows SharepointServicesがSPNEGO認証っぽくてダイアログ表示されるのがうざかったのだが、回避方法が分かって嬉しい。 ProjectServer2003で苦労していたのもこれで解決するような気が。