はじめに
LDAPサーバを管理しているとクライアント側からLDAP認証開始時に質問を受けることがよくある。LDAPがニッチのためか、話が嚙み合わないことが多い。そこで、意思疎通が可能になる程度の内容でLDAP認証について簡単にまとめおく。
LDAPとは
そもそもLDAPとはLightweight Directory Access Protoclの略省で「ディレクトリサーバ」へアクセスするためのプロトコルである。
LDAPの目的としては情報を整理して管理するためのものであり以下のような特徴をもつ
-
ツリー構造
-
読み取りが高速
-
基本的な属性があらかじめ定義されてる(電話番号、パスワードなど)
LDAPは上記で示したように本来は認証に特化したものではない。しかし、LDAPが持っている機能のなかに認証を実施してくれる操作がある。そのため、LDAP認証は認証操作という一部の機能を利用しているだけにすぎない。
LDAPの詳細については今回のメインテーマではないため、別サイトを参照していただきたい。
LDAP認証ってなにもの?
LDAP認証とは具体的にはLDAP Bindという認証を実施してくれる操作があり、それを利用している。
LDAP Bindのポイントとしては、KEYとしてDNを使い、Passwordによって認証している。クライアント側にOK・NGの認証結果(コード)を返す。
LDAP認証を利用すれば、クライアント側(アプリケーション)としてはパスワードを自分で比較することはしなくて済むようになるため、安全に簡単に認証を扱えることになる。
ちなみDNとはDistinguished Nameの略(識別名)でツリー構造の中で一意となるLDAPのKEYになるものである。
LDAP認証のからくり
アプリケーションのログイン画面で入力するIDは通常DNでなくアプリケーションで使うIDである。そのため、LDAP認証を実施するためには入力されたIDからDNを生成する必要がある。この変換がLDAP認証の肝になる。変換方法に統一的なプロトコルはなくクライアント側に任されるが、おおむね以下のような方法で実現している。
検索を組み合わた方法
ログイン画面で入力されたIDを利用してLDAPサーバを検索してDN生成する。この方法の大まかな流れは以下になる。
-
LDAP Searchを利用してIDの紐づくDNをLDAPサーバから検索して取得する
-
取得したDNを用いて、LDAP Bind で認証操作を実施する
ポイントしてはLDAP Searchを使って検索するところになるだろう。この操作のイメージをつけることが重要になる。
アプリケーションのLDAP認証の設定情報にはこのLDAP Serachのための設定情報が必要になる。検索のイメージがないとどのように値を設定してよいかわからず、悩むことになるだろう。
例えば、Tomcatのserver.xml
にあるLDAP認証の設定は以下となる。
<Realm className="org.apache.catalina.realm.JNDIRealm"
connectionName="CN=USERNAME,DC=example,DC=com"
connectionPassword="Passwordxxxx"
connectionURL="ldap://xxx.example.com"
authentication="simple"
userBase="DC=example,DC=com"
userSearch="(uid={0})"
userSubtree="true"
・・・
connectionName
はLDAPを検索するためのユーザのDNとなる。これはクライアント(アプリケーション)にログインするものではない。connectionPassword
は検索ユーザのためのパスワードになる。検索するユーザも基本的はLDAPサーバに認証されて、そのあと検索操作を実行する。一般的にはReadOnly程度の権限しかないようなユーザを利用することになる。
userBase
は検索するツリー構造の起点となる。これはLDAP Searchに必要なプロパティである。UserSearch
はIDを紐づける検索条件になる。この条件に当てはまるユーザを検索してDNを生成することになる。そのため、DNの中にIDが入っていなくてもよいことになる。userSubtree
は起点より配下も見に行ってよいかの確認となる。
このように設定においてLDAP Searchの知識が必要になってくる。そのため、必要があればLDAP Search特に検索条件の作り方などについては調べてほしい。
上記ではTomcatを例に出したが、多くのアプリケーションがこの方法を採用している。
置換を使った方法
こちらの方法をとっているクライアントは少ないが、DN=CN={0},O=yy,C=xx
などのようにIDを置換するだけでDNを組み立てる方法もある。
この方法の場合はLDAP Searchの設定情報がいらないため、シンプルな設定になる。しかし、ツリーの場所を固定しているため複雑なツリー構造の場合に対応できない。ただし、認証のみためにLDAPサーバを構築するのであれば、すべてのDNを同一階層に置けばよいので、このようなことも可能になる。
#おわりに
LDAP認証を利用する際には、IDからどのようにDNを作り出しているかがポイントになる。特に検索を組み合わせたパターンの場合、LDAPになじみがない人にとってはイメージできず、設定の意味が全く理解できなかったのでないかと思われる。この記事で少しでもイメージがつき、設定がスムーズにできるようになってもらえれば幸いである。