オープンソース資料館
今回のテーマは、SubversionでActiveDirectoryに接続した際に起こった問題について。
2019/4/2: ActiveDirectoryにApacheでLDAP認証すると、時々認証が詰まる件
環境
認証元:Apache Subversion 1.10 on Windows 2016 Server
認証先:ActiveDirectory 2016
関連: Apache Subversion, Apache httpd, mod_ldap, Active Directory
症状
Subversionを使っていると、認証が詰まる事がある。
15分以上認証が行われないと起こる。
具体的には、認証を行おうとすると、きっかり1分かかる
なお、Subversionサーバを起動して最初は起こらない。一度認証して以降に起こる。
パケット解析すると、一度LDAPbindRequestをかける。ActiveDirectoryからのOKはもらうが、ダンマリになり60秒経過後リトライする。リトライするとそのままLDAPSearchに進みうまくいく。15分以内の場合はリトライせずにLDAPbindRequestからLDAPsearchに素直に進む。
原因
さまざまに条件を変えて動作を確認したところ、「LDAPコネクションプールが切れている」場合に起こる事がわかった。Apache側の立場で言えば「コネクションプールをADから切られた場合」である。Apache側でTimeoutした場合には起こらない。これは、ActiveDirectoryがデフォルトでLDAPコネクションを15分で切ってしまう事で起こる。Apacheはコネクションプールが生きている事を期待してリクエストを投げるがActiveDirectory側では既に接続がなくなっているために通らず、リトライ。リトライはApache側のリトライ間隔のデフォルト60秒が適用され、60待ってリトライしているのだ。今回のSubversionはWANdisco版のWindowsバイナリだが、理屈上はどのディストリビューションでも(Subvesrion関係なく一般のApache2.4でも)起こりえる。また、15分以内だと起こらないので、実運用に入って頻繁にアクセスが起こるようになると目立たなくなるはず。
対策
3つ考えられるが、今回は#1は採用せず、#2と#3の併用とした。
1. ActiveDirectoryのLDAPコネクションプール時間を延ばす
ActiveDirectory側からコネクションを切る頻度を減らせば起こりにくくなる。ただし問題になっているサーバ以外にも影響が及ぶことに注意。
ActiveDirectoryサーバのコマンドプロンプトから設定する。”ntdsutil”というユーティリティを使用し、LDAP Policiesにて設定。設定する値は、例えば1時間なら
MaxConnIdleTime 3600
とかにする(デフォルト 900(15分))。
2. Apacheのリトライ間隔を短くする
発生したとしても、60秒ではなく5秒とかなら問題にならないと思われるので待ち時間を短くする。
(WANdisco版の場合)Subvesrion.confのLocationディレクティブの外側に定義を追加(要再起動)。
リトライ間隔を5秒にセットする場合(伝送遅延がある環境だともう少し長い方がよい)。
LDAPTimeout 5
3. Apacheのコネクションプールのタイムアウト時間を、Apacheの時間<ActiveDirectoryの時間、に設定する
ActiveDirectoryから切られる前にApacheから先に切ってしまえば起こらないはずなので、Apache側のタイムアウトを短く設定する(デフォルトでは切らない)。
(WANdisco版の場合)Subvesrion.confのLocationディレクティブの外側に定義を追加(要再起動)。
例えば、Apache側のコネクションプールのタイムアウトを2分に設定する場合。
LDAPConnectionPoolTTL 120
とする。なお、数字を”0”にすればそもそもコネクションプールをしない。
ご相談ください
OSSPlazaではSubversionの構築やサポートを行っています。本ケースもその一環で出て解決したものです。お問合せはこちらへ。