Hatena::ブログ(Diary)

現場のためのソフトウェア開発プロセス - たかのり日記 このページをアンテナに追加 RSSフィード Twitter

2008-08-31

[]LDAPTracの認証と権限の管理を行う 00:03 LDAPでTracの認証と権限の管理を行うを含むブックマーク LDAPでTracの認証と権限の管理を行うのブックマークコメント

今日は久しぶりにいい天気でしたが、夜には、また急激な雨。個人的には涼しいのはうれしいのですが、なんか日本の気候も大分変ってしまった感じですね。


さて、Trac0.11がリリースされたこともあって、何かと調査しているのですが、今回はLDAPに関する情報についてです。

Tracでは、LDAPを利用して認証や権限の管理を行うことができます。大規模に利用したい場合、LDAPでユーザ認証や権限の管理ができるのはとても便利です。


認証については、apacheの認証機能を利用して比較的簡単にできるのですが、権限はLDAPスキーマが関連しており、設定が複雑です。いろいろ調べて実現できるようになったのですが、情報が少ないのでまとめておきます。



動作環境

以下の環境で検証を行いました。



LDAP環境の構築

LDAPのDirectory Serviceには、OpenDSを使用しました。

OpenDSは、Javaで開発されたDirectory Serviceです。以下のサイトで「Install with QuickSetup」を選択すると、Java Web Start経由でインストールすることができます。


https://opends.dev.java.net/public/downloads_index.html


[OpenDS]Server Settings

インストール先のディレクトリは任意の場所を指定します。

初期状態では、ルートユーザのパスワードが空になっていますが、パスワードを指定しておきます。

f:id:szk-takanori:20080901013006p:image:w300

[OpenDS]Topology Options

ここでは、「This will be a standalone server」を選択しておきます。

f:id:szk-takanori:20080901013005p:image:w300

[OpenDS]Directory Data

「Directory Base DN:」はデフォルトのままですが、「dc=example,dc=com」を指定します。

また、「Import Automatically-Genarated Sample Data」を選択すると、指定した数だけユーザを自動生成できます。

f:id:szk-takanori:20080901013004p:image:w300


インストールが完了したら、OpenDSの起動を確認します。

以下のバッチファイルを実行すると、OpenDSの状態画面が表示され、起動/停止の操作を行うことができます。


<OpenDS_HOME>\bat\status-panel.bat

f:id:szk-takanori:20080901013003p:image:w250


接続の確認には、LDAPブラウザを利用すると簡単です。今回は、LDAP Adminを利用しています。


[LDAP Admin]接続設定

f:id:szk-takanori:20080901013518p:image:w300

[LDAP Admin]LDAPの情報

f:id:szk-takanori:20080901013517p:image:w300


接続が成功すると、先ほど自動生成したユーザが登録されていることが確認できます。



Trac用のLDAPの設定

LDAPインストールが完了したら、次は、Trac用の設定を行います。Tracの権限をLDAPで管理できるようにするためには、Trac用のスキーマを登録しておくことが必要になります。OpenDSでは、ldifファイル(LDAPデータ交換形式ファイル)を、以下のディレクトリに配置することで、スキーマを追加することが可能です。


<OpenDS_HOME>\config\schema

今回は、以下のようなファイルを定義し、上記ディレクトリに配置しました。

スキーマの内容は、以下のサイトを参考にして作成しています。


http://trac-hacks.org/wiki/LdapPluginTests


dn: cn=schema
objectClass: top
objectClass: ldapSubentry
objectClass: subschema

attributeTypes: ( 1.3.6.1.4.1.15527.143
    NAME 'tracperm'
    DESC 'Trac Permission'
    EQUALITY caseIgnoreMatch
    SUBSTR caseIgnoreSubstringsMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} )
    
objectClasses: ( 1.3.6.1.4.1.15527.8
    NAME 'tracuser'
    DESC 'Regular user with Trac permission'
    SUP top
    STRUCTURAL
    MUST ( uid $ cn $ userpassword )
    MAY  ( tracperm $ sn $ description ) )
    
objectClasses: ( 1.3.6.1.4.1.15527.9
    NAME 'tracgroup'
    DESC 'Trac permission for groupofnames'
    SUP top
    AUXILIARY
    MAY  ( tracperm ) )

スキーマの登録ができているかどうかは、LDAP AdminのSchema Viewerを利用して確認できます。

メニューから、「Tools」→「Schema...」と選択し、「tracperm」を検索してスキーマが登録されていることを確認します。

f:id:szk-takanori:20080901013516p:image:w300



Tracで利用するユーザ/グループの作成

Trac用のスキーマの登録が完了したら、Tracを操作するユーザやグループの設定をします。

今回は、以下のような定義をしました。


マネージャ権限を指定するユーザuid=manager01,ou=TracUsers,dc=example,dc=com
マネージャ権限を持つグループcn=managers,ou=TracPermissionGroups,dc=example,dc=com

  • 組織(ou)の作成
    • 要素を右クリックし、メニューから「New」→「Organizational unit...」を選択。
    • 組織の名前を入力する。
    • ユーザの登録先である「TracUsers」と権限グループの「TracPermissionGroups」を作成。
  • ユーザ(uid)の作成
    • 作成した「TracUsers」を右クリックし、メニューから「New」→「User...」を選択。
    • ユーザプロパティを入力するダイアログが開かれるため、必要な値を指定。
    • パスワードを指定する必要があるが、右クリックメニューの「Set password...」から指定しようとするとエラーとなるため、「Edit Entry...」の「userPassword」属性を編集して指定。
  • グループ(cn)の作成
    • 作成した「TracPermissionGroups」を右クリックし、メニューから「New」→「Entry...」を選択。
    • objectClassに「groupOfNames」「tracgroup」を追加。
    • 「cn」「tracperm」属性を設定(tracperm属性を指定しておくのがポイント。複数の権限を指定したい場合は、tracperm属性を複数指定する)。
    • 「member」属性に、ユーザを追加。

組織(ou)ユーザ(uid)グループ(cn)
f:id:szk-takanori:20080901014021p:image:w200f:id:szk-takanori:20080901014018p:image:w200f:id:szk-takanori:20080901014019p:image:w200

これでやっと、LDAPの設定が完了です。


Tracログイン認証の設定

認証の設定は、Apacheのhttpd.confで指定します。

TracLightningのインストールは完了しており、「SampleProject」というプロジェクトが登録されているものとします。


  • httpd.conf
LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
<LocationMatch "/[^/]+/login">
   AuthType Basic
   AuthName "Enter your LDAP ID"
   AuthBasicProvider ldap
   Order Allow,Deny
   Allow from All
   AuthLDAPBindDN "cn=Directory Manager"
   AuthLDAPBindPassword ****
   AuthLDAPURL "ldap://ldaphost:389/?uid?sub?(objectClass=*)"
   Require ldap-attribute objectClass=person
</LocationMatch>

上記の設定をしたら、TracLightningを起動し、SampleProjectにアクセスします。

ログイン」リンクをクリックし、先ほど作成したmanager01ユーザのユーザID/パスワードを指定して、ログインが成功すれば、認証の設定は成功です。


ただし、この状態では、権限はLDAPで指定したものは有効になっていません。有効にするためには、TracのLdapPluginを利用して設定することが必要です。



Tracの権限の設定

権限をLDAPを利用して管理するには、LdapPluginをイントールして設定を行います。

LdapPluginは、Trac0.10までの対応ですが、Trac0.11でも動作しました。


まずは、以下のサイトから、LdapPlugin(2008/08/31時点ではv0.5.1)をダウンロードします(Subversionリポジトリから直接取得する必要があります)。


http://trac-hacks.org/wiki/LdapPlugin


LdapPluginを取得したら、コマンドプロンプトから、以下のようにしてインストールします。

通常は、「<TracLight_HOME>\python\Lib\site-packages」配下に「LdapPlugin-x.x.x-py2.x.egg」というファイルが作成されます。

>cd <LdapPlugin_HOME>
>python setup.py install

次に、trac.iniの設定を行います。定義する項目は、LdapPluginのページに説明がありますが、必要なもののみ指定すれば問題ありません。


[trac]
#permission_store = DefaultPermissionStore
permission_store = LdapPermissionStore

[components]
ldapplugin.* = enabled

[ldap]
# LDAPの有効
enable = true
# LDAPのサーバ情報
host = ldaphost
port = 389
# ユーザが所属するベースDN
basedn = dc=example,dc=com
# ベースDNからのユーザのRDN
user_rdn = ou=TracUsers
# ユーザIDを定義している属性
uidattr = uid
# ベースDNからのグループのRDN
group_rdn = ou=TracPermissionGroups
# グループIDを定義している属性
groupattr = cn
groupname = groupOfNames
# 権限をに関する設定
manage_groups = true
store_bind = true
# LDAPを操作するユーザの認証情報
bind_user = cn=Directory Manager
bind_passwd = ****

trac.iniを変更したので、TracLightningを再起動し、SampleProjectにアクセスします。

と思ったら、以下のようなメッセージが出て、アクセスに失敗してしまいます。

AttributeError: Cannot find an implementation of the "IPermissionStore" interface named "LdapPermissionStore". Please update the option trac.permission_store in trac.ini.


LdapPluginのインストールはされているようなので、何が原因かいろいろと調べてみたところ、どうやら、pythonLDAPモジュールが不足しているようです。そのため、LdapPluginはインストールが正常に完了しても、処理するときにエラーとなっていたようです。

たしかに、LdapPluginのサイトを良く見ると、「You need the Python LDAP module. It can be retrieved from python-ldap.」と書いてある・・・。


Windows用のpython-ldapモジュールは、以下のサイトからダウンロードできます。


http://www.osuch.org/python-ldap


インストール時に、Pythonインストールディレクトリを要求されますが、以下のディレクトリを指定すればOKです。


<TracLight_HOME>\python

再度、SampleProjectにアクセスします。

LDAPの設定が有効になっていれば、「403 Forbidden」と画面に表示されるはずです。これは、権限の設定先が、DefaultPermissionStoreからLdapPermissionStoreに変わったことにより、Tracへの権限設定が未設定の状態になったためです。


trac.iniで、DefaultPermissionStoreのままにしておいても、LDAPから権限情報は取得されますが、trac-adminコマンドで指定した権限をLDAPに登録する場合は、LdapPermissionStoreを指定しておく必要があります。


さて、manager01でログインすると、LDAPで指定した権限に基づき、Tracの権限が有効になっているはずです。manager01は、TRAC_ADMIN権限を保持するmanagersグループに属しているので、全ての操作が可能になっているはずです。

「管理(admin)」タブをクリックし、「パーミッション(Permissions)」の情報を確認すると、以下のような設定が確認できます。


対象アクション
@managersTRAC_ADMIN
manager01@managers

この権限は、tarc-adminコマンドを利用して、参照/追加/削除することも可能です。

  • 参照
>trac-admin <TracLight_HOME>\project\trac\SampleProject permission list
  • 追加
>trac-admin <TracLight_HOME>\project\trac\SampleProject permission add @<グループID> TRAC_ADMIN
  • 削除
>trac-admin <TracLight_HOME>\project\trac\SampleProject permission remove @<グループID> TRAC_ADMIN

グループへ権限を付与するときは、LDAPで定義されているグループIDの先頭に「@」を付けます。



ふぅ。

大分、長文になってしまいましたが、これで、LDAPを利用して、Tracの認証/権限の管理を行えるようになりました。Trac0.10の場合も同様にできるはずです。


認証はApacheの設定、権限はTracの設定となりますが、それぞれの定義は独立したものなので、変更する際は両方の定義を更新する必要があります。

Toshiyuki KawanishiToshiyuki Kawanishi 2009/03/31 14:32 お久しぶりです川西です。
ちょうど、Trac+LDAPの情報を探していたので、大変に役立ちました!ありがとうございます。
あと、SVNもLDAPで認証することって出来るでしょうか?

szk-takanoriszk-takanori 2009/04/04 22:15 たかのりです。
SVNもLDAP認証はできますよ。実績はあります。
具体的な方法が手元にないので、ちょっとうる覚えですが、おそらく以下のあたりが参考になると思います。
http://blogs.open.collab.net/svn/2007/03/subversion_ldap.html
http://www.jejik.com/articles/2007/06/apache_and_subversion_authentication_with_microsoft_active_directory/

トラックバック - http://d.hatena.ne.jp/szk-takanori/20080831/1220195015