Zend_Auth_Adapter_Ldap.xml 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <!-- EN-Revision: 15156 -->
  4. <sect1 id="zend.auth.adapter.ldap">
  5. <title>LDAP 認証</title>
  6. <sect2 id="zend.auth.adapter.ldap.introduction">
  7. <title>導入</title>
  8. <para>
  9. <classname>Zend_Auth_Adapter_Ldap</classname> は、LDAP
  10. サービスによるウェブアプリケーションの認証をサポートします。
  11. ユーザ名やドメイン名の正規化や複数ドメインの認証、
  12. フェイルオーバー機能などがあります。
  13. <ulink url="http://www.microsoft.com/windowsserver2003/technologies/directory/activedirectory/">Microsoft
  14. Active Directory</ulink>
  15. <ulink url="http://www.openldap.org/">OpenLDAP</ulink>
  16. で動作確認をしていますが、それ以外の LDAP
  17. サービスプロバイダでも動作するはずです。
  18. </para>
  19. <para>
  20. このドキュメントで扱う内容は、
  21. <classname>Zend_Auth_Adapter_Ldap</classname> の使い方やその API、
  22. 使用可能なオプション、トラブルシューティングの方法、
  23. そして Active Directory 用および OpenLDAP 用の設定例です。
  24. </para>
  25. </sect2>
  26. <sect2 id="zend.auth.adapter.ldap.usage">
  27. <title>使用法</title>
  28. <para>
  29. <classname>Zend_Auth_Adapter_Ldap</classname> による認証をアプリケーションに手っ取り早く組み込むには、
  30. <classname>Zend_Controller</classname> を使うかどうかにかかわらず、次のようなコードを書くことになります。
  31. <programlisting role="php"><![CDATA[
  32. $username = $this->_request->getParam('username');
  33. $password = $this->_request->getParam('password');
  34. $auth = Zend_Auth::getInstance();
  35. $config = new Zend_Config_Ini('../application/config/config.ini',
  36. 'production');
  37. $log_path = $config->ldap->log_path;
  38. $options = $config->ldap->toArray();
  39. unset($options['log_path']);
  40. $adapter = new Zend_Auth_Adapter_Ldap($options, $username,
  41. $password);
  42. $result = $auth->authenticate($adapter);
  43. if ($log_path) {
  44. $messages = $result->getMessages();
  45. $logger = new Zend_Log();
  46. $logger->addWriter(new Zend_Log_Writer_Stream($log_path));
  47. $filter = new Zend_Log_Filter_Priority(Zend_Log::DEBUG);
  48. $logger->addFilter($filter);
  49. foreach ($messages as $i => $message) {
  50. if ($i-- > 1) { // $messages[2] 以降はログメッセージです
  51. $message = str_replace("\n", "\n ", $message);
  52. $logger->log("Ldap: $i: $message", Zend_Log::DEBUG);
  53. }
  54. }
  55. }
  56. ]]></programlisting>
  57. もちろんログを記録するかどうかは自由ですが、
  58. ロガーを使用することを強く推奨します。
  59. <classname>Zend_Auth_Adapter_Ldap</classname> は、皆がほしがるであろう情報をすべて
  60. <code>$messages</code> (詳細は以下で) に記録します。
  61. この機能を使用すれば、デバッグを容易に行えるようになります。
  62. </para>
  63. <para>
  64. 上のコードでは、<classname>Zend_Config_Ini</classname> を用いてアダプタのオプションを読み込んでいます。
  65. これもまた必須ではありません。普通の配列を使用しても同様に動作します。
  66. 以下に <code>application/config/config.ini</code> ファイルの例を示します。
  67. このファイルでは、ふたつの別のサーバの設定を記述しています。
  68. 複数のサーバのオプションを設定しておくと、
  69. アダプタ側では認証に成功するまで順にそれぞれのサーバへの認証を試みます。
  70. サーバの名前 (<code>server1</code> や <code>server2</code> など)
  71. は任意です。オプション配列についての詳細は、以下の
  72. <emphasis>サーバのオプション</emphasis> に関するセクションを参照ください。
  73. <classname>Zend_Config_Ini</classname> では、等号
  74. (<code>=</code>) を含む値 (以下の例では DN など)
  75. はクォートしなければならないことに注意しましょう。
  76. <programlisting role="ini"><![CDATA[
  77. [production]
  78. ldap.log_path = /tmp/ldap.log
  79. ; OpenLDAP 用の設定の例
  80. ldap.server1.host = s0.foo.net
  81. ldap.server1.accountDomainName = foo.net
  82. ldap.server1.accountDomainNameShort = FOO
  83. ldap.server1.accountCanonicalForm = 3
  84. ldap.server1.username = "CN=user1,DC=foo,DC=net"
  85. ldap.server1.password = pass1
  86. ldap.server1.baseDn = "OU=Sales,DC=foo,DC=net"
  87. ldap.server1.bindRequiresDn = true
  88. ; Active Directory 用の設定の例
  89. ldap.server2.host = dc1.w.net
  90. ldap.server2.useStartTls = true
  91. ldap.server2.accountDomainName = w.net
  92. ldap.server2.accountDomainNameShort = W
  93. ldap.server2.accountCanonicalForm = 3
  94. ldap.server2.baseDn = "CN=Users,DC=w,DC=net"
  95. ]]></programlisting>
  96. この設定を使用すると、<classname>Zend_Auth_Adapter_Ldap</classname>
  97. はまず OpenLDAP サーバ <code>s0.foo.net</code> でのユーザ認証を試みます。
  98. 何らかの理由で認証に失敗した場合は、AD サーバ
  99. <code>dc1.w.net</code> を用いて認証を試みます。
  100. </para>
  101. <para>
  102. 異なるドメインのサーバを指定したことで、
  103. この設定では複数ドメインの認証を行えるようになっています。
  104. 同一ドメイン内の複数サーバを指定して冗長性を確保することもできます。
  105. </para>
  106. <para>
  107. この場合、OpenLDAP には短い形式の NetBIOS ドメイン名 (Windows で使用するもの)
  108. は不要ですが、設定していることに注意しましょう。これは、名前の正規化のために使用します
  109. (以下の <emphasis>ユーザ名の正規化</emphasis> のセクションを参照ください)。
  110. </para>
  111. </sect2>
  112. <sect2 id="zend.auth.adapter.ldap.api">
  113. <title>API</title>
  114. <para>
  115. <classname>Zend_Auth_Adapter_Ldap</classname> のコンストラクタは、3 つのパラメータを受け取ります。
  116. </para>
  117. <para>
  118. <code>$options</code> パラメータは必須で、
  119. ひとつあるいは複数のオプションを含む配列でなければなりません。
  120. これは、<link linkend="zend.ldap"><classname>Zend_Ldap</classname></link> のオプションの
  121. <emphasis>配列の配列</emphasis> であることに注意しましょう。
  122. 単一の LDAP サーバの設定のみを指定する場合でも、
  123. 「設定オプションの配列を配列の中に格納する」形式でなければなりません。
  124. </para>
  125. <para>
  126. 以下に、サンプルのオプションパラメータを
  127. <ulink url="http://php.net/print_r"><code>print_r()</code></ulink>
  128. で出力した例を示します。これは、ふたつの LDAP サーバ
  129. <code>s0.foo.net</code> と
  130. <code>dc1.w.net</code> の設定を含むものです
  131. (先ほどの INI ファイルと同じ設定です)。
  132. <programlisting role="output"><![CDATA[
  133. Array
  134. (
  135. [server2] => Array
  136. (
  137. [host] => dc1.w.net
  138. [useStartTls] => 1
  139. [accountDomainName] => w.net
  140. [accountDomainNameShort] => W
  141. [accountCanonicalForm] => 3
  142. [baseDn] => CN=Users,DC=w,DC=net
  143. )
  144. [server1] => Array
  145. (
  146. [host] => s0.foo.net
  147. [accountDomainName] => foo.net
  148. [accountDomainNameShort] => FOO
  149. [accountCanonicalForm] => 3
  150. [username] => CN=user1,DC=foo,DC=net
  151. [password] => pass1
  152. [baseDn] => OU=Sales,DC=foo,DC=net
  153. [bindRequiresDn] => 1
  154. )
  155. )
  156. ]]></programlisting>
  157. 上の各オプションで設定した内容の違いの主な理由は、AD へのバインド時にはユーザ名が
  158. DN 形式である必要がないということです (以下の <emphasis>サーバのオプション</emphasis>
  159. における <code>bindRequiresDn</code> の説明を参照ください)。
  160. つまり、認証時のユーザ名から DN を取得するために使用する多くのオプションは
  161. 省略できるということです。
  162. </para>
  163. <note>
  164. <title>Distinguished Name とは?</title>
  165. <para>
  166. DN ("distinguished name") とは、
  167. LDAP ディレクトリ内のオブジェクトへのパスを表す文字列のことです。
  168. カンマで区切られた各部分が、ノードを表す属性と値となります。
  169. 各部分は逆順に評価されます。たとえば、ユーザアカウント
  170. <emphasis>CN=Bob Carter,CN=Users,DC=w,DC=net</emphasis> は、ディレクトリ
  171. <emphasis>CN=Users,DC=w,DC=net container</emphasis> の配下に位置することになります。
  172. この構造をたどるには、ADSI Edit MMC snap-in for Active Directory や phpLDAPadmin
  173. といった LDAP ブラウザが最適です。
  174. </para>
  175. </note>
  176. <para>
  177. サーバの名前 (上の例における '<code>server1</code>' や '<code>server2</code>')
  178. は基本的には何でもかまいません。しかし、<classname>Zend_Config</classname> を用いる場合は、
  179. (数値インデックスではなく) 識別子を使用しなければなりません。また、
  180. 各ファイルフォーマットで特別な意味を持つ文字
  181. (INI のプロパティ区切り文字 '<code>.</code>' や
  182. XML エンティティ参照の '<code>&amp;</code>' など)
  183. は含まないようにしましょう。
  184. </para>
  185. <para>
  186. 複数のサーバオプションを設定しておけば、
  187. このアダプタで複数ドメインのユーザ認証を行うことができます。
  188. また、ひとつのサーバが使用できない場合に別のサーバに問い合わせを行う
  189. フェイルオーバー機能も提供することができます。
  190. </para>
  191. <note>
  192. <title>認証メソッドの中では実際に何が行われているのか?</title>
  193. <para>
  194. <code>authenticate()</code> メソッドがコールされると、
  195. アダプタは各サーバ設定を順に処理し、内部で管理する
  196. <classname>Zend_Ldap</classname> のインスタンスに設定したうえでユーザ名とパスワードを指定して
  197. <classname>Zend_Ldap::bind()</classname> メソッドをコールします。
  198. <classname>Zend_Ldap</classname> クラスは、そのユーザ名がドメインつきのものであるかどうか
  199. (<emphasis>alice@foo.net</emphasis> や <emphasis>FOO\alice</emphasis> といった形式であるかどうか)
  200. を調べます。ドメインが指定されているけれどもそれがどのサーバのドメイン名
  201. (<emphasis>foo.net</emphasis> あるいは <emphasis>FOO</emphasis>)
  202. とも一致しない場合は、特別な例外がスローされます。この例外は
  203. <classname>Zend_Auth_Adapter_Ldap</classname> で捕捉され、
  204. そのサーバを無視して次に指定されているサーバ設定を利用するようにします。
  205. ドメインがマッチ <emphasis>しない</emphasis> 場合、
  206. あるいはユーザがドメインつきのユーザ名を指定しなかった場合は、
  207. <classname>Zend_Ldap</classname> は指定された認証情報でのバインドを試みます。
  208. バインドに失敗した場合は <classname>Zend_Ldap</classname> は <classname>Zend_Ldap_Exception</classname>
  209. をスローします。これは <classname>Zend_Auth_Adapter_Ldap</classname> で捕捉され、
  210. 次に設定されているサーバでの認証を試みます。
  211. バインドが成功した場合はそこで処理を終了し、アダプタの <code>authenticate()</code>
  212. メソッドは成功したという結果を返します。
  213. 設定されているサーバをすべて試したけれどもどれも成功しなかったという場合は、
  214. 認証は失敗し、<code>authenticate()</code> は最後のエラーメッセージとともにその結果を返します。
  215. </para>
  216. </note>
  217. <para>
  218. <classname>Zend_Auth_Adapter_Ldap</classname> コンストラクタのパラメータに渡す
  219. ユーザ名とパスワードは、認証に用いる情報
  220. (つまり、HTML のログインフォームでユーザが入力した情報)
  221. を表します。これらは、<code>setUsername()</code> メソッドと
  222. <code>setPassword()</code> メソッドで指定することもできます。
  223. </para>
  224. </sect2>
  225. <sect2 id="zend.auth.adapter.ldap.server-options">
  226. <title>サーバのオプション</title>
  227. <para>
  228. <emphasis><classname>Zend_Auth_Adapter_Ldap</classname> のコンテキストにおける</emphasis>
  229. サーバのオプションは次のようなものです。これらは、ほとんどそのままの形で
  230. <classname>Zend_Ldap::setOptions()</classname> に渡されます。
  231. <table id="zend.auth.adapter.ldap.server-options.table">
  232. <title>サーバのオプション</title>
  233. <tgroup cols="2">
  234. <thead>
  235. <row>
  236. <entry>名前</entry>
  237. <entry>説明</entry>
  238. </row>
  239. </thead>
  240. <tbody>
  241. <row>
  242. <entry><emphasis role="strong">host</emphasis></entry>
  243. <entry>
  244. このオプションが表す LDAP サーバのホスト名。必須です。
  245. </entry>
  246. </row>
  247. <row>
  248. <entry><emphasis role="strong">port</emphasis></entry>
  249. <entry>
  250. LDAP サーバが待ち受けるポート。<emphasis role="strong">useSsl</emphasis> が
  251. <code>true</code> の場合、デフォルトの <emphasis role="strong">port</emphasis>
  252. は 636 となります。<emphasis role="strong">useSsl</emphasis> が <code>false</code>
  253. の場合、デフォルトの <emphasis role="strong">port</emphasis> は 389 です。
  254. </entry>
  255. </row>
  256. <row>
  257. <entry>useStartTls</entry>
  258. <entry>
  259. LDAP クライアントが TLS (SSLv2) で暗号化されたトランスポートを用いるかどうか。
  260. 実運用環境では、この値を <code>true</code> にすることを強く推奨します。
  261. そうすれば、パスワードが平文で転送されることを防ぐことができます。
  262. デフォルト値は <code>false</code> です。
  263. というのも、別途証明書のインストールを要するサーバが多く存在するからです。
  264. <code>useSsl</code> と <code>useStartTls</code> は互いに排他的です。
  265. <code>useStartTls</code> オプションのほうが <code>useSsl</code>
  266. よりおすすめですが、中にはこの新しい仕組みをサポートしていないサーバもあります。
  267. </entry>
  268. </row>
  269. <row>
  270. <entry>useSsl</entry>
  271. <entry>
  272. LDAP クライアントが SSL で暗号化されたトランスポートを用いるかどうか。
  273. <code>useSsl</code> と <code>useStartTls</code> は互いに排他的ですが、
  274. サーバや LDAP クライアントライブラリが対応している場合は
  275. <code>useStartTls</code> を使うことを推奨します。
  276. この値によって、デフォルトの <emphasis role="strong">port</emphasis>
  277. の値が変わります (上の <emphasis role="strong">port</emphasis> の説明を参照ください)。
  278. </entry>
  279. </row>
  280. <row>
  281. <entry><emphasis role="strong">username</emphasis></entry>
  282. <entry>
  283. アカウントの DN を探す際に使用するアカウントの DN。
  284. バインド時のユーザ名が DN 形式であることを要求する
  285. LDAP サーバで、このオプションを使用します。
  286. <emphasis role="strong">bindRequiresDn</emphasis> が <code>true</code>
  287. の場合はこのオプションが必須となります。
  288. このアカウントは特権アカウントである必要はありません。<emphasis role="strong">baseDn</emphasis>
  289. 配下のオブジェクトに対する読み込み権限がありさえすればいいのです
  290. (これは <emphasis>Principle of Least Privilege: 最小特権の原則</emphasis>
  291. にもかなっています)。
  292. </entry>
  293. </row>
  294. <row>
  295. <entry><emphasis role="strong">password</emphasis></entry>
  296. <entry>
  297. アカウントの DN を探す際に使用するアカウントのパスワード。
  298. このオプションを省略した場合は、LDAP クライアントがアカウントの DN
  299. を探す際に "匿名バインド" を試みます。
  300. </entry>
  301. </row>
  302. <row>
  303. <entry><emphasis role="strong">bindRequiresDn</emphasis></entry>
  304. <entry>
  305. LDAP サーバによっては、バインド時に使用するユーザ名が
  306. <emphasis>CN=Alice Baker,OU=Sales,DC=foo,DC=net</emphasis>
  307. のような DN 形式でなければならないものもあります (基本的に、AD
  308. <emphasis>以外</emphasis> のすべてのサーバがそうです)。
  309. このオプションが <code>true</code> の場合、
  310. もし認証対象のユーザ名が DN 形式でなければ
  311. <classname>Zend_Ldap</classname> に自動的に DN を取得させ、
  312. その DN で再度バインドさせるようにします。
  313. デフォルト値は <code>false</code> です。現時点で、
  314. バインド時のユーザ名が DN 形式で <emphasis>なくてもよい</emphasis>
  315. サーバとして知られているのは Microsoft Active Directory Server (ADS)
  316. のみです。したがって、AD を使用する場合はこのオプションを
  317. <code>false</code> にしてもかまいません (そうするべきです。
  318. DN を取得するために、サーバとの余計なやりとりが発生してしまうわけですから)。
  319. それ以外の場合 (OpenLDAP など) は、このオプションを
  320. <code>true</code> にしなければなりません。このオプションは、
  321. アカウントを検索する際に使用する
  322. <emphasis role="strong">acountFilterFormat</emphasis>
  323. のデフォルト値にも影響を及ぼします。
  324. <emphasis role="strong">accountFilterFormat</emphasis>
  325. オプションも参照ください。
  326. </entry>
  327. </row>
  328. <row>
  329. <entry><emphasis role="strong">baseDn</emphasis></entry>
  330. <entry>
  331. 認証対象となるアカウントが配置されている場所の DN。このオプションは必須です。
  332. 正しい <emphasis role="strong">baseDn</emphasis> の値がよくわからない場合は、
  333. ユーザの DNS ドメインを <emphasis>DC=</emphasis>
  334. コンポーネントで表したものと考えれば差し支えないでしょう。
  335. たとえば、ユーザ名が <emphasis>alice@foo.net</emphasis> である場合は
  336. <emphasis role="strong">baseDn</emphasis> を <emphasis>DC=foo,DC=net</emphasis>
  337. とすれば動作するでしょう。しかし、より正確な場所
  338. (<emphasis>OU=Sales,DC=foo,DC=net</emphasis> など)
  339. を指定したほうが効率的です。
  340. </entry>
  341. </row>
  342. <row>
  343. <entry><emphasis role="strong">accountCanonicalForm</emphasis></entry>
  344. <entry>
  345. 2、3 あるいは 4 を指定し、認証に成功した後のアカウント名の正規化方式を指定します。
  346. それぞれの値の意味は次のとおりです。2 は伝統的なユーザ名 (例:
  347. <emphasis>alice</emphasis>)、3 はバックスラッシュ形式の名前 (例: <emphasis>FOO\alice</emphasis>)
  348. そして 4 はプリンシパル形式のユーザ名 (例: <emphasis>alice@foo.net</emphasis>)
  349. となります。デフォルト値は 4 (例: <emphasis>alice@foo.net</emphasis>) です。
  350. たとえば 3 を指定したとすると、<classname>Zend_Auth_Result::getIdentity()</classname>
  351. (<classname>Zend_Auth</classname> を使う場合は <classname>Zend_Auth::getIdentity()</classname>)
  352. の返す識別子は常に <emphasis>FOO\alice</emphasis> となります。これは、Alice が入力した内容が
  353. <emphasis>alice</emphasis>、<emphasis>alice@foo.net</emphasis>、<emphasis>FOO\alice</emphasis>、
  354. <emphasis>FoO\aLicE</emphasis>、<emphasis>foo.net\alice</emphasis>
  355. などのいずれであろうが同じです。詳細は、<classname>Zend_Ldap</classname>
  356. のドキュメントの <emphasis>アカウント名の正規化</emphasis>
  357. のセクションを参照ください。複数のサーバのオプションを設定する場合は、すべてのサーバで
  358. <emphasis role="strong">accountCanonicalForm</emphasis>
  359. を同じにしておくことを推奨します (必須ではありません)。
  360. そうすれば、結果のユーザ名はいつでも同じ形式に正規化されることになります
  361. (もし AD サーバでは <emphasis>EXAMPLE\username</emphasis>、OpenLDAP サーバでは
  362. <emphasis>username@example.com</emphasis> を返すようになっていれば、
  363. アプリケーション側のロジックが不格好になります)。
  364. </entry>
  365. </row>
  366. <row>
  367. <entry><emphasis role="strong">accountDomainName</emphasis></entry>
  368. <entry>
  369. 対象となる LDAP サーバの FQDN ドメイン
  370. (例 <code>example.com</code>)。
  371. このオプションは、名前を正規化する際に使用します。
  372. バインド時に、ユーザが指定したユーザ名を必要に応じて変換します。
  373. 指定したユーザ名がそのサーバに存在するかどうかを調べる際にも使用します
  374. (<emphasis role="strong">accountDomainName</emphasis> が <emphasis>foo.net</emphasis>
  375. でユーザが <emphasis>bob@bar.net</emphasis> を入力した場合、
  376. サーバへの問い合わせを行わず、結果は失敗となります)。
  377. このオプションは必須ではありませんが、もし指定していなければ
  378. プリンシパル形式のユーザ名 (例 <emphasis>alice@foo.net</emphasis>)
  379. はサポートされません。このオプションを指定しておくことを推奨します。
  380. プリンシパル形式のユーザ名が必要となる場面は数多くあるからです。
  381. </entry>
  382. </row>
  383. <row>
  384. <entry><emphasis role="strong">accountDomainNameShort</emphasis></entry>
  385. <entry>
  386. 対象となる LDAP サーバの '短い' ドメイン
  387. (例 <emphasis>FOO</emphasis>)。
  388. <emphasis role="strong">accountDomainName</emphasis> と
  389. <emphasis role="strong">accountDomainNameShort</emphasis>
  390. は一対一対応となることに注意しましょう。このオプションは
  391. Windows ネットワークの NetBIOS ドメイン名として用いられますが、
  392. AD 以外のサーバで用いられることもあります
  393. (複数のサーバオプションでバックスラッシュ形式の
  394. <emphasis role="strong">accountCanonicalForm</emphasis> を使用する場合など)。
  395. このオプションは必須ではありませんが、もし指定していなければ
  396. バックスラッシュ形式のユーザ名 (例 <emphasis>FOO\alice</emphasis>)
  397. はサポートされません。
  398. </entry>
  399. </row>
  400. <row>
  401. <entry><emphasis role="strong">accountFilterFormat</emphasis></entry>
  402. <entry>
  403. アカウントを検索する際に使用する LDAP 検索フィルタ。
  404. この文字列は
  405. <ulink url="http://php.net/printf"><code>printf()</code></ulink>
  406. 形式のものとなり、ユーザ名を表す '<code>%s</code>'
  407. をひとつ含む必要があります。デフォルト値は
  408. '<code>(&amp;(objectClass=user)(sAMAccountName=%s))</code>' です。
  409. ただし、<code>bindRequiresDn</code> が <code>true</code>
  410. の場合のデフォルト値は
  411. '<code>(&amp;(objectClass=posixAccount)(uid=%s))</code>'
  412. となります。たとえば、何らかの理由で AD 環境で
  413. <code>bindRequiresDn = true</code> を使いたい場合は
  414. <code>accountFilterFormat = '(&amp;(objectClass=user)(sAMAccountName=%s))</code>'
  415. と設定する必要があります。
  416. </entry>
  417. </row>
  418. <row>
  419. <entry><emphasis role="strong">optReferrals</emphasis></entry>
  420. <entry>
  421. <code>true</code> に設定すると、
  422. 参照先を追跡するよう LDAP クライアントに指示します。
  423. デフォルト値は <code>false</code> です。
  424. </entry>
  425. </row>
  426. </tbody>
  427. </tgroup>
  428. </table>
  429. </para>
  430. <note>
  431. <para>
  432. <code>useStartTls = true</code> あるいは
  433. <code>useSsl = true</code> としていると、LDAP クライアント側で
  434. 「サーバの証明書を検証できない」というエラーが発生することに気づかれるかもしれません。
  435. PHP の LDAP 拡張モジュールは OpenLDAP クライアントライブラリと密接につながっているので、
  436. この問題を解決するには OpenLDAP クライアントの <code>ldap.conf</code> で
  437. "<code>TLS_REQCERT never</code>" を設定 (そしてウェブサーバを再起動)
  438. して OpenLDAP クライアントライブラリがサーバを信頼するようにします。
  439. もしいわゆる「なりすまし」が心配なら、
  440. LDAP サーバのルート証明書をエクスポートしてそれをウェブサーバに配置すれば、
  441. OpenLDAP クライアントがサーバを検証できるようになります。
  442. </para>
  443. </note>
  444. </sect2>
  445. <sect2 id="zend.auth.adapter.ldap.debugging">
  446. <title>デバッグメッセージの収集</title>
  447. <para>
  448. <classname>Zend_Auth_Adapter_Ldap</classname> は、<classname>authenticate()</classname>
  449. メソッド内でのデバッグ情報を収集します。この情報は、<classname>Zend_Auth_Result</classname>
  450. オブジェクト内にメッセージとして保存されます。<classname>Zend_Auth_Result::getMessages()</classname>
  451. が返す配列は次のような形式になります。
  452. <table id="zend.auth.adapter.ldap.debugging.table">
  453. <title>デバッグメッセージ</title>
  454. <tgroup cols="2">
  455. <thead>
  456. <row>
  457. <entry>メッセージ配列の添字</entry>
  458. <entry>説明</entry>
  459. </row>
  460. </thead>
  461. <tbody>
  462. <row>
  463. <entry>0</entry>
  464. <entry>
  465. ユーザ向けの表示に適した、全般的なメッセージ (認証に失敗したなど)。
  466. 認証に成功した場合は、この文字列は空となります。
  467. </entry>
  468. </row>
  469. <row>
  470. <entry>1</entry>
  471. <entry>
  472. より詳細なエラーメッセージ。ユーザ向けに表示するには適しませんが、
  473. サーバ管理者向けには記録しておくべき内容です。
  474. 認証に成功した場合は、この文字列は空となります。
  475. </entry>
  476. </row>
  477. <row>
  478. <entry>2 以降</entry>
  479. <entry>
  480. すべてのログメッセージが、インデックス 2 以降に順に格納されます。
  481. </entry>
  482. </row>
  483. </tbody>
  484. </tgroup>
  485. </table>
  486. 実際に使用する上では、まずインデックス 0 の内容はユーザ向けに表示することになります
  487. (FlashMessenger ヘルパーなどを使用します)。そしてインデックス 1 はログに記録し、
  488. デバッグ情報が必要ならインデックス 2 以降も同様に記録します
  489. (最後のメッセージには、常にインデックス 1 の内容も含まれています)。
  490. </para>
  491. </sect2>
  492. <sect2 id="zend.auth.adapter.ldap.options-common-server-specific">
  493. <title>サーバ固有の共通オプション</title>
  494. <sect3 id="zend.auth.adapter.ldap.options-common-server-specific.active-directory">
  495. <title>Active Directory 用のオプション</title>
  496. <para>
  497. ADS 用のオプションとして注目すべきものは次のとおりです。
  498. <table id="zend.auth.adapter.ldap.options-common-server-specific.active-directory.table">
  499. <title>Active Directory 用のオプション</title>
  500. <tgroup cols="2">
  501. <thead>
  502. <row>
  503. <entry>名前</entry>
  504. <entry>補足説明</entry>
  505. </row>
  506. </thead>
  507. <tbody>
  508. <row>
  509. <entry><emphasis role="strong">host</emphasis></entry>
  510. <entry>
  511. すべてのサーバでこのオプションは必須です。
  512. </entry>
  513. </row>
  514. <row>
  515. <entry><emphasis role="strong">useStartTls</emphasis></entry>
  516. <entry>
  517. セキュリティの観点からは、これは <code>true</code> にしておくべきです。
  518. この場合、サーバに証明書をインストールしておく必要があります。
  519. </entry>
  520. </row>
  521. <row>
  522. <entry><emphasis role="strong">useSsl</emphasis></entry>
  523. <entry>
  524. <code>useStartTls</code> の代替として用いられます (上を参照ください)。
  525. </entry>
  526. </row>
  527. <row>
  528. <entry><emphasis role="strong">baseDn</emphasis></entry>
  529. <entry>
  530. すべてのサーバでこのオプションは必須です。デフォルトの AD では
  531. すべてのユーザアカウントが <emphasis>Users</emphasis> コンテナ
  532. (たとえば <emphasis>CN=Users,DC=foo,DC=net</emphasis>) の配下におかれますが、
  533. もっと長い組織になることもあるので共通のデフォルトはありません。
  534. AD の管理者に問い合わせて、アプリケーションのアカウントでどんな
  535. DN を使用したらよいのかを確認しましょう。
  536. </entry>
  537. </row>
  538. <row>
  539. <entry><emphasis role="strong">accountCanonicalForm</emphasis></entry>
  540. <entry>
  541. ほとんどの場合は 3 を指定してバックスラッシュ形式の名前 (例
  542. <emphasis>FOO\alice</emphasis>) を使用することになるでしょう。
  543. これは Windows ユーザにとってもっともなじみ深い形式です。修飾されていない形式である 2
  544. (例 <emphasis>alice</emphasis>) を使っては <emphasis>いけません</emphasis>。
  545. これは、他の信頼済みドメインに属する同じユーザ名のユーザにも
  546. アプリケーションへのアクセスを許可してしまうことになるからです
  547. (たとえば <emphasis>BAR\alice</emphasis> と <emphasis>FOO\alice</emphasis>
  548. は同じユーザという扱いになります)。以下の注意も参照ください。
  549. </entry>
  550. </row>
  551. <row>
  552. <entry><emphasis role="strong">accountDomainName</emphasis></entry>
  553. <entry>
  554. これは AD には必須です。<emphasis role="strong">accountCanonicalForm</emphasis>
  555. が 2 の場合は不要ですが、何度も言うようにこれはおすすめしません。
  556. </entry>
  557. </row>
  558. <row>
  559. <entry><emphasis role="strong">accountDomainNameShort</emphasis></entry>
  560. <entry>
  561. ユーザが属するドメインの NetBIOS 名で、AD サーバの認証対象となります。
  562. これは、バックスラッシュ形式の
  563. <emphasis role="strong">accountCanonicalForm</emphasis>
  564. を使用する場合には必須です。
  565. </entry>
  566. </row>
  567. </tbody>
  568. </tgroup>
  569. </table>
  570. </para>
  571. <note>
  572. <para>
  573. 技術的には、現在の <classname>Zend_Auth_Adapter_Ldap</classname> の実装では
  574. 意図せぬクロスドメイン認証の危険はあり得ません。
  575. サーバのドメインが明示的にチェックされるからです。
  576. しかし、将来にわたってもそうであるかどうかはわかりません。
  577. 実行時にドメインを見つけるような実装に変わったり、
  578. 別のアダプタ (Kerberos など) を使うことになるかもしれません。
  579. 一般論として、あいまいなアカウント名はセキュリティ問題の原因となりやすいものです。
  580. 修飾した形式のアカウント名を使うようにしましょう。
  581. </para>
  582. </note>
  583. </sect3>
  584. <sect3 id="zend.auth.adapter.ldap.options-common-server-specific.openldap">
  585. <title>OpenLDAP 用のオプション</title>
  586. <para>
  587. OpenLDAP、あるいは posixAccount 形式のスキーマを用いる一般的な
  588. LDAP サーバ用のオプションとして注目すべきものは次のとおりです。
  589. <table id="zend.auth.adapter.ldap.options-common-server-specific.openldap.table">
  590. <title>OpenLDAP 用のオプション</title>
  591. <tgroup cols="2">
  592. <thead>
  593. <row>
  594. <entry>名前</entry>
  595. <entry>補足説明</entry>
  596. </row>
  597. </thead>
  598. <tbody>
  599. <row>
  600. <entry><emphasis role="strong">host</emphasis></entry>
  601. <entry>
  602. すべてのサーバでこのオプションは必須です。
  603. </entry>
  604. </row>
  605. <row>
  606. <entry><emphasis role="strong">useStartTls</emphasis></entry>
  607. <entry>
  608. セキュリティの観点からは、これは <code>true</code> にしておくべきです。
  609. この場合、サーバに証明書をインストールしておく必要があります。
  610. </entry>
  611. </row>
  612. <row>
  613. <entry>
  614. <code>useStartTls</code> の代替として用いられます (上を参照ください)。
  615. </entry>
  616. </row>
  617. <row>
  618. <entry><emphasis role="strong">username</emphasis></entry>
  619. <entry>
  620. 必須、かつ DN である必要があります。OpenLDAP のバインド時には、
  621. ユーザ名が DN 形式であることが必須だからです。
  622. 特権アカウント以外を使用するようにしましょう。
  623. </entry>
  624. </row>
  625. <row>
  626. <entry><emphasis role="strong">password</emphasis></entry>
  627. <entry>
  628. 上のユーザ名に対応するパスワード。しかし、
  629. 匿名バインドによるユーザ検索を
  630. LDAP サーバがサポートしている場合には省略することもできます。
  631. </entry>
  632. </row>
  633. <row>
  634. <entry><emphasis role="strong">bindRequiresDn</emphasis></entry>
  635. <entry>
  636. 必須、かつ <code>true</code> である必要があります。
  637. OpenLDAP のバインド時には、ユーザ名が DN 形式であることが必須だからです。
  638. </entry>
  639. </row>
  640. <row>
  641. <entry><emphasis role="strong">baseDn</emphasis></entry>
  642. <entry>
  643. すべてのサーバでこのオプションは必須です。
  644. 認証対象となるアカウントが位置する DN を指すようにします。
  645. </entry>
  646. </row>
  647. <row>
  648. <entry><emphasis role="strong">accountCanonicalForm</emphasis></entry>
  649. <entry>
  650. オプションで、デフォルト値は 4 (<emphasis>alice@foo.net</emphasis>
  651. のようなプリンシパル形式) です。これは、ユーザがバックスラッシュ形式の名前
  652. (<emphasis>FOO\alice</emphasis> など)
  653. を使用する場合には望ましくありません。バックスラッシュ形式の名前の場合は
  654. 3 を使用します。
  655. </entry>
  656. </row>
  657. <row>
  658. <entry><emphasis role="strong">accountDomainName</emphasis></entry>
  659. <entry>
  660. 必須です。<emphasis role="strong">accountCanonicalForm</emphasis>
  661. が 2 の場合は不要ですが、これはおすすめしません。
  662. </entry>
  663. </row>
  664. <row>
  665. <entry><emphasis role="strong">accountDomainNameShort</emphasis></entry>
  666. <entry>
  667. AD とともに使用するのでなければこれは必須ではありません。
  668. それ以外の場合、もし
  669. <emphasis role="strong">accountCanonicalForm</emphasis> 3 を使用するのなら
  670. このオプションは必須で、
  671. <emphasis role="strong">accountDomainName</emphasis>
  672. に対応する短縮名を指定しなければなりません
  673. (たとえば <emphasis role="strong">accountDomainName</emphasis> が
  674. <emphasis role="strong">foo.net</emphasis> なら
  675. <emphasis role="strong">accountDomainNameShort</emphasis>
  676. の適切な値は <emphasis>FOO</emphasis> となるでしょう)。
  677. </entry>
  678. </row>
  679. </tbody>
  680. </tgroup>
  681. </table>
  682. </para>
  683. </sect3>
  684. </sect2>
  685. </sect1>
  686. <!--
  687. vim:se ts=4 sw=4 et:
  688. -->