先週の予告通りAuth0を使ったLDAP連携についてです。
LDAP。触ったの3年ぶり位。前職の時にはLDAP連携とかも作ってましたが転職してからはほとんど名前を聞くこともなくなってました。
世の中的にもそんなもんなんじゃないかと思ってるんですが、Active Directory使っているところは今でも普通に使ってるのかな?
★ LDAPとは
今さら説明不要かもしれませんが、とりあえず雑な説明を(^^;
LDAPとはLightweight Directory Access Protocolの略で、「Lightweight」「Directory Access」という単語が示す通り
- - 軽量
- - ディレクトリ構造(ツリー構造)のデータにアクセス
という特徴を持つプロトコルです。(直訳やんけ)
LDAPサーバにはOpenLDAP、Apache DSなどの実装があり、ユーザ管理に使われることが多いです。(組織の階層構造を表すのにディレクトリ構造が都合良いため)
といっても、純粋LDAPサーバはほとんど普及しておらず実際に使われているプロダクトのほとんどはActive Directory(以下AD)です。
ADはMS独自の製品でLDAPサーバよりも遥かに多機能ですが、LDAPインターフェースを備えているので(プロトコルとしての)LDAPでもアクセスできます。
MS独自APIでしかアクセスできないと利用者が限られてしまうのでオープンなプロトコルであるLDAPも使えるようになっているということです。
★ クラウドとLDAP
HerokuやSalesforce等のクラウドサービスのサーバは当然ながらインターネット上にあります。
一方で企業のユーザを管理するLDAP/ADサーバはほとんどの場合イントラネット内にあります。
このためクラウドサービスから企業内のLDAP/ADサーバに直接アクセスすることは普通はできません。
★ Auth0とLDAP
この課題をAuth0はどうやって解決しているんだろう?という点に興味津津だったんですが、その答えはこれ。
https://github.com/auth0/ad-ldap-connector
なんのことはない。企業内に中継用のコネクタサーバをインストールしてもらうだけです。
。。。あー、うん。。。。これが許されるんならどうにでもなるわー。
なんかもっと画期的な方法があるのかと期待したけど、どうやらそんなものはないらしい。。。(--
上記のGitHubがコネクタサーバのリポジトリなわけですが、具体的には以下のように設定していきます。
- Auth0のダッシュボードでAD/LDAPのコネクションを作成
- LDAP Connector(node.js製サーバ)をイントラネット内のサーバにインストール
- LDAP ConnectorでAuth0のAPIキーとLDAPサーバへの接続情報を設定
- (必要であれば) LDAP Connectorインストールディレクトリ直下のconfig.jsonにユーザ検索クエリを設定
実際に試してみてちょっとはまったのは以下の2点です。
- Windows用のインストーラが提供されているが、それでProgram files以下に保存した場合うまく動かない。(おそらくインストールディレクトリ直下の設定ファイルの書き換えがうまくいっていない)
- 検索クエリの変更方法がソースをGREPしないとわからなかった
デフォルトの検索クエリは「(sAMAccountName={0})」なので、ADを使っている場合は変更不要なはずです。
が、テストはApacheDSで行ったため変更が必要でその方法がドキュメントに載ってなかったんですよね。。。(後から気が付きましたがGitHub上のREADME.mdには載ってました。)
このあたりもLDAPはほとんどADでしか使われてないんだなという背景をうかがわせます。
ちなみに今回は試せませんでしたが、ADでKerberosが有効になっている場合ログイン画面もスキップした完全なシングルサインオンもできるようです。
★ まとめ
クラウドからのLDAP連携。多分そうだろう、とは思ってましたがやはり直接やる方法はないようですね。
Auth0は自前のLDAP Connectorを企業内にインストールさせているわけですが、そんなやり方で良ければ自前でもできるな~と思ったりもします。
Auth0製のLDAP Connectorがオープンソースで公開されているので、LDAP連携の部分をコピってちょっと直すだけでもそれっぽいものが作れそうな気がしますしね。(^^;
実際に必要な場面になったら、どうするかはわかりませんがとりあえずやり方だけはなんとなくわかりました。