アイフラッグラボ
iFLAG Labs is a technical information site which iFLAG offers.
iFLAG Labs provides you with the opportunity to experience and evaluate new and emerging innovations, technologies, and service from iFLAG.

トップページ»  OpenPNEのAD連携について

OpenPNEのAD(アクティブディレクトリ)連携について

 

□OpenPNE AD連携
こんにちは。アイフラッグの社内システム担当SKです。

今回は私の方からSNS『OpenPNE』を導入後の社内Active Directory(以下、ADと記載します。)との連携について記述して行きたいと思います。
OpenPNE自体の導入については、本家の手順通りに行えば問題ありませんでしたので、本記事では記載致しません。
http://www.openpne.jp/pne-downloads/openpne3/のセットアップ手順を参照して下さい。


・はじめに
OpenPNEとは・・
株式会社手嶋屋が開発をされた、Apache2.0ライセンスを採用して公開されるオープンソースSNS運営用プログラムです。
OpenPNEを使用することで、SNSサイトを簡単に開設することが可能となります。
デフォルトの機能や設置にはプログラミングの知識は必要ありませんので、
コミュニティサイト等の立ち上げが非常に簡単なオープンソースです。
http://www.openpne.jp/


今回社内にて自社のSNSサイトを立ち上げ、ナレッジの全体共有を行うツールとして使用出来ないかという要望があり、実際に導入してデモを行うことになり環境構築を行いました。


そこで課題として上がって来たのがアカウント管理についてでした。
OpenPNEでは初期導入した際、システム上のアカウント登録となり、社員数が多い企業では管理が非常に不便です。
※管理者が招待メールで全ユーザを招待するという方法になり、メールアドレスでの登録になります。


そこで既存の社内ADと連携できればアカウント管理をADで一元管理出来るので、連携する方法がないかを調査しました。


・AD連携について
OpenPNEは3.0以降のバージョンからプラグインを導入する事で機能拡張を行うことができます。
開発元でもプラグイン開発にはかなり力を入れているようで色々な機能をプラグインにて提供しているようです。


今回のAD連携についても下記プラグインを使用する事で実現可能との情報があり、実際に導入してみました。
導入したプラグイン名はopAuthLDAPPluginになります。
https://github.com/tejimaya/opAuthLDAPPlugin


READMEを参照し必要項目に社内ADの情報を入力していきます。
プラグイン導入後管理画面にアクセス。
認証プラグイン設定からopAuthLDAPPlugin設定を選択


設定するのは社内ADの下記情報

Server1 ldap host    LDAPサーバーのホスト名
Server1 ldap port     LDAPサーバーのポート
Server1 ldap basedn   最上位のDNを入力します。
Server1 ldap adn   ドメインを入力します。


設定後実際にログインしてみました。
社内ADのID/PWを入力すると問題なくADのID/PWでログイン出来ました!
しかし後々連携がうまくいっていない事に気がつきます・・・


その後プロフィール等の初期設定を行い、他の方のID/PWでログインして頂いたところ、
SKさんのプロフィールが表示されるんだけど・・・と報告を受けました。
試してみるとどのアカウントでログインしても1番最初に設定した私のプロフィールしか表示されない現象が起こりました。
うまくADのアカウントと紐付いていないのか。。。


調査を行った結果、認証時にユーザ登録されるテーブルのname:ldapレコード内の【value:】にはActiveDirectory側のユーザー名が入っている必要があるのですが空となっていました。
valueの値が空になっている為、アカウントが識別できずにどのユーザでログインしても同じプロフィールが表示されてしまうという現象が発生していた。
 

mysql> select * from member_config where name='ldap'\G
*************************** 1. row ***************************
             id: 6
      member_id: 2
           name: ldap
          value:     //本来であればこちらにusername@example.comのようにADアカウントの値が入る。
 value_datetime: NULL
name_value_hash: 6fc0502a78ab799b41659c43fe4b073a
     created_at: 2013-02-12 11:42:44
     updated_at: 2013-02-12 11:42:44


実際に調査してみると既存のPluginではOpenLDAPには対応していましたが、
AD連携には対応しておらず連携する為には改修が必要な事が分かりました。


改修したプログラムは下記2つのファイルです。
・/plugins/opAuthLDAPPlugin/lib/user/opAuthAdapterLDAP.class.php
・/plugins/opAuthLDAPPlugin/lib/validator/opAuthValidatorLDAP.class.php


□改修ポイント
・opAuthAdapterLDAP.class.php
問題点:$ldap->getEntry()が空の値を返してしまう。


今回はこちらに空の値が入ってきてしまう為、対象テーブルに値が入らないという現象が発生していました。
ADの場合には、Cusername@example.comで返ってくる値が「username@example.com」のようになり、
これは、Zend_Auth_Adapter_LDAPのオプション(accountDomainName)を設定したときのデフォルトになります。
このフォーマットではgetEntry()は取得できないため、以下のように取得しています。
 

# diff opAuthAdapterLDAP.class.php opAuthAdapterLDAP.class.php.old
84,91c84
<       if (isset($entry['uid']) && isset($entry['uid'][0])) {
<       $uid = $entry['uid'][0];
<       }
<       else {
<       $uid = $this->getAuthForm()->getValue('bound_user');
<       }
---
>       $uid = $entry['uid'][0];


□改修ポイント
・validator/opAuthValidatorLDAP.class.php
問題点:uidを取得できない


LDAPエントリに「uid」という項目が存在することを前提に作られていますが、標準のADではuidという項目が存在しない為、
代わりにgetBoundUser()で取得した値を利用しています。
※OpenLDAPを使用する場合はuidの項目のままで取得できる。
 

# diff opAuthValidatorLDAP.class.php opAuthValidatorLDAP.class.php.old
86,96c86
<
<     if ($option['bindRequiresDn']) {
<       // for LDAP
<       $entry = $ldap->getEntry($ldap->getBoundUser());
<     }
<     else {
<       // for Active Directory
<       $accountname = $ldap->getCanonicalAccountName($uid,
<       Zend_Ldap::ACCTNAME_FORM_DN);
<       $entry = $ldap->getEntry($accountname);
<     }
---
>     $entry = $ldap->getEntry($ldap->getBoundUser());
110,119c100
<     if (isset($entry['uid']) && isset($entry['uid'][0])) {
<       $memberConfig = Doctrine::getTable('MemberConfig')->retrieveByNameAndValue('ldap', $entry['uid'][0]);
<     }
<     // Active Directory doesn't have uid entry.
<     // So I use BoundUser insted of uid.
<     else {
<       $bound_user = $ldap->getBoundUser();
<       $memberConfig = Doctrine::getTable('MemberConfig')->retrieveByNameAndValue('ldap', $bound_user);
<       $values['bound_user'] = $bound_user;
<     }
---
>     $memberConfig = Doctrine::getTable('MemberConfig')->retrieveByNameAndValue('ldap', $entry['uid'][0]);


上記のように改修する事で無事AD連携を行う事が出来ました。


今回OpenPNEのAD連携について色々なサイトを調査したのですが、連携についてはほとんど情報が無かった為、今回こちらのブログへ記述させて頂きました。
開発元にもこの結果をフィードバックさせて頂いたのですが、現状公開されているソースだとAD連携することができませんので、
これからOpenPNEを導入してアカウントをAD連携で管理したい場合はこちらを参考にして頂ければ幸いです。

アイフラッグラボ(IFLAG Labs)とは

アイフラッグラボとは、アイフラッグが提供する技術情報サイトです。アイフラッグが提供するスモールビジネス向けのITサービスの開発実績から培った技術ノウハウを公開していきます。技術情報が皆さまのサポートになれば幸いです。