質問: 仕事でとあるアプリケーションのApacheを利用し、 認証はActiveDirectoryの情報を利用し認証する必要が発生しました。 **環境** サーバA:Apache2.4/Webアプリケーション サーバB:ActiveDirectory **想定仕様** ユーザはブラウザでWebアプリケーションにアクセスすると 認証ダイアログが表示され、ユーザID、パスワードを入れると、 ApacheがActiveDirectoryに問い合わせをし認証をし、Webアプリケーションにログインできる。 上記だけであれば、例えば以下 ``` AuthLDAPUrl"ldap://hogesv01:389/OU=person,dc=hogedomain,dc=jp?userPrincipalName?sub?(objectClass=*)" AuthLDAPBindDN userhoge@hogedomain.jp AuthLDAPBindPassword userhogeのパスワード Require ldap-attribute objectClass=person ``` のようなapache設定で認証設定が可能だと思います。 今回、問題なのは、 ユーザは「ドメインを抜いたユーザ名を入力する」という要件があることです。 例えば、userPrincipalNameが`user01@hogedomein.jp`だとすると、 ユーザはログインIDで`user01`のみを指定するということです。 Apacheの設定でユーザの認証を、 ユーザIDを前方一致でActiveDirectoryを検索に行き、 userPrinicipalNameで認証を実行が出来る必要があるのですが、 そのような設定方法はapacheでは可能なのでしょうか。 いろいろ調べましたが方法が分からず、 何か良い方法や良いアイディアはないものでしょうか。 ActiveDirectory自体の設定を変えるというのは他社管理サーバのため 難しくApacheの設定でなんとかしたい...というのが想いです。 **イメージ** ユーザ→→[user01を入力]→→→Apache→→→[user01@hogedomein.jpで検索]→ActiveDirectory ※Apacheでユーザが入力した値を加工し、ActiveDirectoryを検索に行きたい 何かアイディア/知見があればご教授いただけませんか。
回答: `sAMAccountName` (Windows 2000 より前のユーザー ログオン名) を使ってみてください。 ``` AuthLDAPUrl"ldap://hogesv01:389/OU=person,dc=hogedomain,dc=jp?sAMAccountName?sub?(objectClass=*)" ``` 追記: > > userPrincipalNameをどうしても使いたいという要件があり、 > > なおかつ、 > > ブラウザから入力されたIDをActiveDirectryのuserPrincipalNameで前方一致検索をしたいという要求なのです。。。 > > > これを実現するには Apache の `mod_authnz_ldap` では難しいので、次のいずれかを検討してみてください。 1. mod_authnz_ldap 自体を改造してご希望の動作に変更する 2. もしくは Web アプリケーションで認証機能を持たせて LDAP認証のロジックを書く 前方一致検索するには、次のようなロジックになると思います。 1. 検索フィルタを、`(userPrincipalName=入力されたユーザ名*@hogedomain.jp)` として LDAP検索すれば前方一致検索になると思います。 2. 検索結果から1件ずつ取り出して、取り出したエントリーのDNと、入力されたパスワードで LDAPサーバーにバインドして 成功すればログイン成功、失敗だったら次の1件を取り出して繰返す。 3. 1件も成功しなければログイン失敗。 Apache の `mod_authnz_ldap` では難しい理由ですが、このモジュールは `(アトリビュート=入力されたユーザ名)` という様に検索してしまうので、完全一致しないとダメなのです。 例: * `AuthLDAPUrl` で設定した アトリビュートが `userPrincipalName` で検索フィルタが `(objectClass=*)` の場合 * かつ、入力されたユーザが `くまもん` の場合 * 検索フィルタ=`(&(objectClass=*)(userPrincipalName=くまもん))` となる。