top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
Apache HTTP Server 2.2.6 + ApacheDS 1.5.1 の組み合わせで、Apacheのバグがらみもあり、かなり苦しめられました。
Apache HTTP Server 2.2.6 + ApacheDS 1.5.1 の組み合わせで、Apacheのバグがらみもあり、かなり苦しめられました。
インストールしたもの
apache_2.2.6-win32-x86-no_ssl.msi
apacheds-server-1.5.1-setup.exe
Apache HTTP Server 側の設定
こちらは、ApacheDSのデフォルト値と接続するための とてもノーマルな設定。 httpd.conf (前半)
LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
httpd.conf (中盤)
Order allow,deny
Allow from all
AuthType Basic
AuthName "LDAP Server"
AuthBasicProvider ldap
AuthLDAPURL ldap://localhost:10389/ou=Users,dc=example,dc=com?uid
AuthLDAPBindDN uid=admin,ou=system
AuthLDAPBindPassword secret
require valid-user
ApacheDSの変更※Apache HTTP Serverのバグを ApacheDS側で吸収
Apache HTTP Server の mod_ldap.so, mod_authnz_ldap.so いずれかのモジュールに不具合があります。これは有名な既知バグである模様です。
今 C言語に取り組んでいる気力と時間が無いので、ApacheDSにパッチを適用して無理矢理動作させました。
パッチ適用後のロードモジュールは以下のようになります。※jarファイルにソースコードも含めてあります
ApacheDS 1.5.1 無理矢理パッチ https://www.igapyon.jp/blanco/bin/shared-ldap-0.9.7.jar
このモジュールを維持メンテする予定は全くありません。 →そもそも Apache HTTP Server の mod_ldap.so, mod_authnz_ldap.so を修正すべきだからです。
このパッチを適用するには あらかじめ「Apache Directory Server - default」サービスを停止してから上書きコピーする必要があります。 ?:\Program Files\Apache Directory Server\lib の同名モジュールを上書きします。
変更箇所は下記のようになります。
対象: org.apache.directory.shared.ldap.codec.LdapMessageGrammar LdapMessageGrammar.java
package org.apache.directory.shared.ldap.codec;
…中略…
// The current TLV should be a integer
// We get it and store it in sizeLimit
Value value = tlv.getValue();
int sizeLimit = 0;
try
{
sizeLimit = IntegerDecoder.parse( value, 0, Integer.MAX_VALUE );
}
catch ( IntegerDecoderException ide )
{ sizeLimit = 100;
log.error( "The sizeLimit is not a valid Integer: {}", value.toString() );
//throw new DecoderException( "The sizeLimit is not a valid Integer: " + value.toString() );
}
※sizeLimitが不正な値であっても、無視して 100ということにして強行突破させる変更です。 これを気合いでコンパイル (Maven環境を構築する暇が無かったので、直接手でコンパイル!) コマンドライン
Path=C:\Program Files\Java\jdk1.6.0_03\bin;%Path%
javac -classpath shared-asn1-codec-0.9.7.jar;slf4j-api-1.4.3.jar;shared-ldap-constants-0.9.7.jar;shared-ldap-0.9.7.jar;shared-asn1-0.9.7.jar org\apache\directory\shared\ldap\codec\*.java
shared-ldap-0.9.7.jar の該当パッケージをコンパイル後の classファイルで上書き。
Javaって とっても簡単ですね。
Apache + LDAP (ApacheDS) 接続確認に利用したユーザ
アインシュタイン先生 (ApacheDS附属のサンプルユーザ)
ユーザ: aeinstein
パスワード: secret
関係あると考えているリソース
つくば日記 (仮): Win32版 Apache HTTP Server 2.2.x で LDAP 認証できない 「ApacheDS の方のログを見ると,LDAPメッセージのパーズに失敗してるんでエラーなんじゃーって出ている。発生しているエラーは "sizeLimit が真っ当な整数じゃないよ" という内容。」との記載があります。私が遭遇しているのと まさに同じ現象です。
この問題の発端は、sizeLimitとして -1 を飛ばすような実装になっている点なのだそうです。別のWebページにて、-1 ではなく 0 を与えるのが LDAP的に正しい仕様なのだとの記載がありました。これは、Apacheのログ上で ldap_search_ext_s() が失敗するということによって気がつきます。(文字化けがありますので解読が面倒なのですけれども…)
ツッコミ
http://tidus.ultimania.org/diary/?date=20080116#p01 (引用) Apacheとくみあわせるなら、OpenDSの方が簡単だと思います ...
いがぴょん。OpenDSですね。今度調べてみます。
関連する日記
2008/01/15 日記: Apache HTTP Server 2.2.6 の LDAP接続不具合へのパッチ こちらのパッチを適用すれば、ここで行っているような ApacheDSへのパッチなんてものは不要になります。
2008/01/10 日記: Shibuya.trac ミーティング1.0 (2008.01.19@豊洲) , 「第四期 中将棋全国大会・名人戦」に参戦
Apache HTTP Server 2.2.6 (Windows)のログですが、日本語が含まれる際に文字化けしているように見えます。気のせいかどうか、時間がないので調べていません。 DecodeMojibake.java
public class DecodeMojibake {
public static void main(String[] args) {
{
final byte[] wrk = new byte[] { (byte) 0x8c, (byte) 0xa0,
(byte) 0x8c, (byte) 0xc0, (byte) 0x82, (byte) 0xaa,
(byte) 0x95, 's', (byte) 0x8f, '\\', (byte) 0x95,
(byte) 0xaa, (byte) 0x82, (byte) 0xc5, (byte) 0x82,
(byte) 0xb7 };
System.out.println(new String(wrk));
}
{
final byte[] wrk = new byte[] { (byte) 0x82, (byte) 0xbb,
(byte) 0x82, (byte) 0xcc, (byte) 0x82, (byte) 0xe6,
(byte) 0x82, (byte) 0xa4, (byte) 0x82, (byte) 0xc8,
(byte) 0x83, 'I', (byte) 0x83, 'u', (byte) 0x83, 'W',
(byte) 0x83, 'F', (byte) 0x83, 'N', (byte) 0x83, 'g',
(byte) 0x82, (byte) 0xcd, (byte) 0x82, (byte) 0xa0,
(byte) 0x82, (byte) 0xe8, (byte) 0x82, (byte) 0xdc,
(byte) 0x82, (byte) 0xb9, (byte) 0x82, (byte) 0xf1 };
System.out.println(new String(wrk));
}
}
}
実行結果 権限が不十分です そのようなオブジェクトはありません ※それっぽい日本語に復元されたのを見て、びっくりして、また少し嬉しかったです。