LDAP (ActiveDirectory) を用いた認証でリトライを抑止

855 views
Skip to first unread message

GLAD!!

unread,
Jun 28, 2014, 5:52:51 AM6/28/14
to redmine-...@googlegroups.com
GLAD!! こと伊藤と申します。

Redmine 2.5.1 で ActiveDirectory を用いた認証を試みているのですが、
匿名アクセスができないため、アカウントに $ldap@domain のように
設定したところ、認証できるところまでは進みました。
ところが、おそらくパスワードを間違えた場合だと思うのですが、
ActiveDirectory のアカウントがロックされてしまうという事象が発生しました。

調査のため、接続先を Open LDAP に替え、
パスワードを間違えた場合の挙動を調べたところ、
1回のエラーに対して、2回接続を試みているようです。
引き続き調査はしているのですが、リトライを抑止する方法をご存知の方が
いらっしゃいましたら、ご教授いただければ幸いです。

以下、Open LDAP のログ(一部加工)です。
18:04:54 xxx slapd[22379]: conn=1100 fd=13 ACCEPT from IP=[::1]:43665 (IP=[::]:389)
18:04:54 xxx slapd[22379]: conn=1100 op=0 BIND dn="uid=xxx,ou=People,dc=example,dc=com" method=128
18:04:54 xxx slapd[22379]: conn=1100 op=0 RESULT tag=97 err=49 text=
18:04:54 xxx slapd[22379]: conn=1100 fd=13 closed (connection lost)
18:04:54 xxx slapd[22379]: conn=1101 fd=13 ACCEPT from IP=[::1]:43666 (IP=[::]:389)
18:04:54 xxx slapd[22379]: conn=1101 op=0 BIND dn="uid=xxx,ou=People,dc=example,dc=com" method=128
18:04:54 xxx slapd[22379]: conn=1101 op=0 RESULT tag=97 err=49 text=
18:04:54 xxx slapd[22379]: conn=1101 fd=13 closed (connection lost)

TAKAHASHI,Toru

unread,
Jul 5, 2014, 3:35:01 AM7/5/14
to redmine-...@googlegroups.com
(2014/06/28 18:52), GLAD!! wrote:

> 調査のため、接続先を Open LDAP に替え、
> パスワードを間違えた場合の挙動を調べたところ、
> 1回のエラーに対して、2回接続を試みているようです。

Redmineのコード(auth_source_ldap.rb)を見てみましたが、
エラー時にリトライをしている様子は見あたりませんでした。

そこで、Active DirectoryへのLDAP接続の成功時の通信を調べて
みたところ、次のように最後に意図が読めないbindが走っています。
ひょっとすると、認証失敗時にエラーのリトライで2回bindRequestが
走るのではなく、最後の意図が読めないbindがエラー時にも走って
いるのかもしれません。

LDAP: bindRequest(1) "myu...@example.local" simple
LDAP: bindResponse(1) success
LDAP: searchRequest(2) "<ROOT>" baseObject
LDAP: searchResEntry(2) "<ROOT>" | searchResDone(2) success
LDAP: bindRequest(1) "myu...@example.local" simple
LDAP: bindResponse(1) success
LDAP: searchRequest(2) "CN=Users,DC=example,DC=local" wholeSubtree
LDAP: searchResEntry(2) "CN=myuser,CN=Users,DC=example,DC=local" |
searchResDone(2) success
LDAP: bindRequest(1) "CN=myuser,CN=Users,DC=example,DC=local" simple
LDAP: bindResponse(1) success

GLAD!!

unread,
Jul 5, 2014, 10:25:15 AM7/5/14
to redmine-...@googlegroups.com
torutk さん、返信ありがとうございます。

最後の bind は authenticate_dn の中で、
検索したアカウントで実際にログインできるか試しているものなので、
特に問題ないと思います。

さらに調べてみましたが、
get_user_dn で Net::LDAP の search を呼んでいるのですが、
呼び出しているのは1回なのに、該当のメソッドが2回実行されて
いるようです。
ソースコード上はこのような挙動になる理由が理解できないのですが、
Rails や Net::LDAP に詳しい方で理由がわかる方いらっしゃいませんか?

とりあえず、get_user_dn で、Net::LDAP の search を呼ぶ前に
bind を実行して、エラーだったら nil を返すように、暫定対処しました。

前回明示しませんでしたが、環境は以下の通りです。
Linux でも Windows でも同様の現象が発生しています。
BitNami Redmine Stack 2.5.1-1
Redmine 2.5.1.stable
Ruby 1.9.3-p231
Rails 3.2.17
net-ldap-0.3.1

GLAD!!

unread,
Jul 20, 2014, 11:38:09 AM7/20/14
to redmine-...@googlegroups.com
自己解決しました。

Net::LDAP の search の中で、
→ paged_searches_supported?
→ search_root_dse
→ search

と search がもう1度呼ばれていました。
bind に失敗することは考慮されていないようですね。

Reply all
Reply to author
Forward
0 new messages