Plone3.0でユーザ情報をActive Directoryと連携させてみた

なんでPloneを選んだか

先日の日記でも書いたが、社内での情報共有システムを作りたいと思っている今日この頃。

会社とかだとクライアントPCのユーザアカウントがADで管理されていることが多いと思うが、自分の勤めてるとこもその辺はADで管理されてる。

そこで、すでにADで管理されている
・ログイン名
・パスワード
あたりの情報を情報共有システムからも利用したいと思う。

あわよくば
・所属
・Eメールアドレス
・表示名
・グループ
あたりの情報も持ってきたいところ。

「ADとのLDAP連携で実現できそうだ」というのは察しがついていたので、LDAP連携機能をそなえたWikiCMSを色々調べたところ、Ploneならできそうだということがわかった。

Pythonが好きなのもあるので、とりあえずはPloneで試してみることにした。
調べていく際、日本語の情報があまりWebでみつけられなかったので、この日記にも情報をあげていこうかなと。

検証環境構成

先に検証環境の構成を提示しておく

Ploneサーバ側

DebianUbuntuの方が慣れているので迷ったんだけど、いずれ他のメンバーが参画するときの事も考えてCentOSにした。

  • Plone => Unified Installerでインストールものとする

pythonzopeのバージョンなどを気にしながらやるのはかったるかったというのがひとつ。
どうせなら最終的に楽に横展開できるものにしたかったので、シンプルなものを選んだというのがもうひとつ。

ADサーバ側
  • OS => Windows 2003 Server Enterprise Edition

たまたま構築済みの環境があったので使いまわした。
SFUとかはいれてないです。

事前検証

Ploneでの検証を始める前に、Ploneサーバ-ADサーバ間でldapの通信ができるかどうかをldasearchで検証してみた。

  • ADサーバのIPが192.168.1.250
  • ドメイン名がad.local
  • 検索には一般ユーザを使用
    • Domain Admins等のグループには属していない一般のユーザを想定
    • ユーザ名"testuser1",パスワードが"password"
  • Usersの下にぶら下がっている"testuser2"の情報を調べたい

とすると、こんな感じ。

$ ldapsearch -x -D testuser1@ad.local -w password -h 192.168.1.250 -b "cn=users,dc=ad,dc=local" "sAMAccountName=testuser2"

こんな感じで結果が返ってくればOK

# extended LDIF
#
# LDAPv3
# base  with scope subtree
# filter: sAMAccountName=testuser2
# requesting: ALL
(以下略)

私事だが、ちょうどLPIC301の勉強をしている身なので、この段階で調べた事は勉強になった。

新しいバージョンのPloneを試すがうまくいかず…

一番最初はPlone 3.2.3で検証を始めた(その時の最新だったので)。
が、うまくいかず。プロダクト等のインストールはうまくんだけど、ログインしようとするとログにエラーが出力される。ログでググっても有益な情報がみつからず。
tcpdumpで見る限り、ldapの通信は発生してるようだがなんでかうまくいかない。

色々調べてるうちにめんどくさくなって、「とりあえず他のバージョンを試してみよう」という方向に転換した。

次に試したのが、2.5.5。「枯れてるバージョンの方がうまくいくんじゃないか?」みたいな安易な発想でチョイス。
3.2とはファイルの構成とかだいぶ異なっててとまどった。zopeで使用するPythonldapモジュールを扱えるとこまではうまくいくんだが、プロダクトのインストールがうまくいかなかった(プロダクトのバージョン選定でミスってたのかも)。

Plone3.0.6でうまくいったのでその記録

Plone3.0.6で試したらすんなりうまくいったので、記録しとく。
面倒なの細かい情報はあとで追記するかもだけど、とりあえずやったことがわかるようにしておく。

事前準備-他のアプリのインストール

過不足あるかもだけど、以下のような感じでアプリをインストールしておく

$ yum install gcc gcc-c++ openldap openldap-devel openssl-devel
Plone本体のインストール
$ cd /tmp
$ wget https://launchpad.net/plone/3.0/3.0.6/+download/Plone-3.0.6-UnifiedInstaller.tar.gz
$ tar xzvf Plone-3.0.6-UnifiedInstaller.tar.gz
$ cd Plone-3.0.6-UnifiedInstaller
$ ./install.sh standalone

↓こんな感じのが出力されるはずなのでメモっとく(後からでも調べられるけど)

  Username: admin
  Password: xxxxxxx
initスクリプトの作成

必須じゃないだろうけどどうせなので作っとく。出来上がりに自信なしだけど。

/etc/init.d/ploneに以下を貼り付ける

#!/bin/sh
# zope Init script for starting up the Zope server
#
# chkconfig: - 87 12
# description: Zope Application Server
#
# config: /home/zope/etc/zope.conf
# pidfile: /var/run/zope/zope.pid

case "$1" in
   start|stop|status|restart|reload|debug|test)
       su -c "/opt/Plone-3.0.6/zinstance/bin/zopectl $@"
       ;;
   *)
       echo $"Usage: $0 {start|stop|status|restart|reload|debug|test}"
       exit 1
esac
exit 0

自動で起動するように設定しとく

$ chmod +x /etc/init.d/plone
$ chkconfig plone on
python-ldapのインストール

以下の手順でインストール

$ cd /tmp
$ wget http://pypi.python.org/packages/source/p/python-ldap/python-ldap-2.3.9.tar.gz#md5=a9f9f16338288d118a1ae6266c993247
$ tar zxvf python-ldap-2.3.9.tar.gz
$ cd python-ldap-2.3.9
$ /opt/Plone-3.0.6/Python-2.4.4/bin/python setup.py build
$ /opt/Plone-3.0.6/Python-2.4.4/bin/python setup.py install

インタラクティブシェルでテストしてみる

$ /opt/Plone-3.0.6/Python-2.4.4/bin/python 

>> import _ldap

⇒エラーがでなければOK

PloneLDAPのインストール

必要なプロダクトがバンドルされてるものがあるのでそれを利用する。AD上のユーザが持っている属性に日本語が含まれている場合に問題が起きないようにencodingの設定もいじっておく。

$ cd /tmp
$ wget http://plone.org/products/ploneldap/releases/1.0/PloneLDAP-bundle-1.0rc3.tar.gz
$ tar xzvf PloneLDAP-bundle-1.0rc3.tar.gz
$ cp -rp LDAPMultiPlugins/ /opt/Plone-3.0.6/zinstance/Products/
$ cp -rp LDAPUserFolder/ /opt/Plone-3.0.6/zinstance/Products/ 
$ cp -rp PloneLDAP/ /opt/Plone-3.0.6/zinstance/Products/
$ sed -i '/opt/Plone-3.0.6/zinstance/Products/LDAPUserFolder/utils.py' -e 's/latin1/utf-8/'
$ /etc/init.d/plone start
ZMI/Ploneでの設定/テスト

ZMIを開いて、ploneサイト配下にあるacl_userの下に「ActiveDirectory Multi Plugin」プロダクトを追加する。

必要事項を埋めて。Add。Manager DNのところは"ユーザ名@ドメイン名"でいけた。普通にDNを指定しても良いと思う。


無事追加できたらプロダクトを有効にする

赤枠の項目でクリックして

追加したプロダクトを右側にもってくる

おわったらチェックを入れてUpdateボタンをクリック

次に適宜設定、テストする。

追加時に入力した情報はここの画面で設定変更できる

Usersタブでユーザ検索をしてみて、うまく連携がとれてるか確認

グループのとこにも、ADのグループがついかされてると思う

最後にPloneサイトにて、AD上のアカウントでログインをしてみて、うまくいくか確認しよう

現状わかってる問題点・課題

実際に社内でサイトを構築するとなると、ADの側の設定は触れない。となるとPloneの設定に自分のアカウントとパスワードを入力する必要がある。
多くの場合、定期的にパスワードを更新するような設定がされいると思う。自分の会社もそう。
となると、パスワード更新の度にPloneの設定を変更する必要が出てきそう。
若干面倒だけど、そんなに頻繁にあるものじゃないから良しとするか。でも、セキュリティ的に問題がある気もするなぁ…

ユーザーがログインする際に入力したユーザ名/パスワードを、ADのユーザ情報参照時のバインドユーザとして使えるようにならんもんだろうか。

今後

  • AD上で管理されてるの他の情報(所属とかメルアドとか)を利用するところとかをまだ全然触れていないので調べて行きたい。
  • その後は便利なプロダクトを探そうと思っている。
    • Q&Aサイトをつくるのに便利なプロダクとはないだろうか。
  • アクセスコントロールやサイト構成についても決めなくては
  • レスポンス向上策も施したい(Vanish,CacheFuなど)。
    • 2.5.5ではCacheFuが簡単に入れられたのに
  • バックアップ・リストア等の運用面も考えないと