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

インストール先のディレクトリは任意の場所を指定します。
初期状態では、ルートユーザのパスワードが空になっていますが、パスワードを指定しておきます。

[OpenDS]Topology Options

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

[OpenDS]Directory Data

「Directory Base DN:」はデフォルトのままですが、「dc=example,dc=com」を指定します。
また、「Import Automatically-Genarated Sample Data」を選択すると、指定した数だけユーザを自動生成できます。


インストールが完了したら、OpenDSの起動を確認します。
以下のバッチファイルを実行すると、OpenDSの状態画面が表示され、起動/停止の操作を行うことができます。

<OpenDS_HOME>\bat\status-panel.bat



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

[LDAP Admin]接続設定

[LDAP Admin]LDAPの情報


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


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」を検索してスキーマが登録されていることを確認します。


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)


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

Tracのログイン認証の設定

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

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を取得したら、コマンドプロンプトから、以下のようにしてインストールします。
通常は、「\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)」の情報を確認すると、以下のような設定が確認できます。

対象 アクション
@managers TRAC_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の設定となりますが、それぞれの定義は独立したものなので、変更する際は両方の定義を更新する必要があります。