仕事でとあるアプリケーションの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を検索に行きたい

何かアイディア／知見があればご教授いただけませんか。
CC BY-SA 3.0
2017-06-13T15:07:50.333
35546
2017-06-14T11:43:42.947
2017-06-13T15:49:09.360
3974
23770
question
windows apache openldap ldap
Apache／ActiveDirectory認証 認証ユーザIDのデータを加工し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=くまもん))` となる。
CC BY-SA 3.0
2017-06-14T02:15:33.770
35551
2017-06-14T10:57:21.983
2017-06-14T10:57:21.983
5008
5008
35546
answer