ShibbolethでAnonymous bindが出来ない件
LDAPを使っている人の中にはAnonymous bindでユーザ情報を取得出来るようにしてる人もいて,まぁLDAPが使えるShibbolethもコネクタの設定次第ではできるだろうと思い試してみた.結果は,設定はできるけどLDAPへのbindはAnonymousにならないということになった(LDAPに詳しくないので穴があるやも).
一番の問題は,この辺りの細かい所がInternet2のWikiだとアンドキュメントな所なんだよね.
- Shibbolethの設定
LdapDataConnector.javaを見れば分かるけど,ちゃんと認証タイプのenumの中にANONYMOUSがあるので,これを設定で使えるようにする.shibboleth-2.0-attribute-resolver-dc.xsdを見て,その規則に合わせて書く.
<resolver:DataConnector id="myLDAP" xsi:type="LDAPDirectory" xmlns="urn:mace:shibboleth:2.0:resolver:dc" ldapURL="ldap://test.example.ac.jp" baseDN="ou=test,o=example,dc=ac,dc=jp" authenticationType="ANONYMOUS"> <FilterTemplate> <![CDATA[ (eppn=$requestContext.principalName) ]]> </FilterTemplate> </resolver:DataConnector>
JavaのenumはvalueOfによって値を取得するので,上記のように書く.この辺りはShibboleth commonライブラリのconfigパッケージにあるLdapDataConnectorBeanDefinitionParser.javaのdoParseを参照.注意点としては,これはShibboleth 2.1.xでないと動きません.なぜなら,Shibboleth 2.0にバンドルされているShibboleth common 1.0ではxsdは同じでもauthenticationType属性のパースが実装されていないため,起動時にエラーになるという罠が*1.
- アクセスする
認証方式をJAASにしてアクセスしてOpenLDAPのログを見ると,見事に属性取得時もユーザbindされている.まあここは認証したユーザ情報をIdPが保持しているので,次のアクセスでAnonymousから変わるのは仕方ないといえば仕方ないのかもしれない.ということで,同一サーバでは無理っぽいので認証LDAPと属性LDAPを分ければ出来そうかなぁと思うんだけど,その時はprincipalNameはどうなるの?という疑問が.もうちょい勉強が必要か…ソースとか読んでるとあまり関係なかった(Subject辺りがあれだけど).下の解決?参照
追記
いや,principalNameは認証が通っていればどうとでもなるな.やっぱりAnonymousにならない理由が分からない.どこか設定おかしいのかなぁ?
解決?
OpenLDAPとJavaが吐いてるログを見比べたら分かった.Java側はAnonymous bind(LDAPのライブラリとしてはnone)としてアクセスしてるけど,OpenLDAP側はAnonymous bindと認識してなかっただけのようだ(原因が分からない).LDAPのコネクトに使っているvt-ldapは内部でjava.naming.security.authenticationを使っていてnoneはAnonymous bindのはずなのだが(FilterTemplateが駄目なのか?).
誰かJavaとLDAPに詳しい人ヘルプ!
*1:公式のダウンロードからは1.0がソースで落とせなくて長いことはまったw