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]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]接続設定
Trac用のLDAPの設定
LDAPのインストールが完了したら、次は、Trac用の設定を行います。Tracの権限をLDAPで管理できるようにするためには、Trac用のスキーマを登録しておくことが必要になります。OpenDSでは、ldifファイル(LDAPデータ交換形式ファイル)を、以下のディレクトリに配置することで、スキーマを追加することが可能です。
<OpenDS_HOME>\config\schema
今回は、以下のようなファイルを定義し、上記ディレクトリに配置しました。
スキーマの内容は、以下のサイトを参考にして作成しています。
http://trac-hacks.org/wiki/LdapPluginTests
- 09-trac.ldif
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のログイン認証の設定
認証の設定は、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を取得したら、コマンドプロンプトから、以下のようにしてインストールします。
通常は、「
>cd <LdapPlugin_HOME> >python setup.py install
次に、trac.iniの設定を行います。定義する項目は、LdapPluginのページに説明がありますが、必要なもののみ指定すれば問題ありません。
- trac.ini
[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のインストールはされているようなので、何が原因かいろいろと調べてみたところ、どうやら、pythonのLDAPモジュールが不足しているようです。そのため、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の設定となりますが、それぞれの定義は独立したものなので、変更する際は両方の定義を更新する必要があります。