Gollem:バックエンドデータを扱うWebベースのファイルマネージャ

gollem_thm.png

 チーム内でファイルを共有する方法は数多くあるが、ブラウザだけでアクセスできてファイルへのユーザアクセスをさまざまな方法で認証できるものは少ない。そうした軽量かつユニバーサルなアクセスを約束してくれるのが、Webブラウザで動作するファイルマネージャ Gollem だ。Gollemを使えば、WebDAVやFTP、従来のファイルシステム、あるいはSQLデータベースに接続し、そこでファイルを管理することができる。

 GollemはHorde Application Frameworkのサブプロジェクトであり、Hordeと一緒にインストールする必要がある。HordeはPHPインタフェースを備えており、こうしたインタフェースはセッション処理、フォーム、認証、暗号化といった重要な機能を持つ。

 GollemにはUbuntu Hardy用のパッケージが用意されているが、Fedora 9やopenSUSE 11のものは存在しない。ただし、Fedora 9とopenSUSE 11のどちらの場合も、Hordeのパッケージが見つかるはずなので、そちらをインストールすることでGollem自体のソースtarballからのインストールがずっと簡単になる。今回は、Gollem H3(1.0.4)のソースtarballからのインストールを64ビット版Fedora 9マシンに対して行うことにする。

 GollemはHordeのサブプロジェクトなので、デフォルトでは、メインであるHordeシステムの下位ディレクトリにインストールする必要がある。以下のコマンドは、HordeをFedora 9リポジトリからインストールしたうえで、GollemのtarballをHordeディレクトリ内に展開する。さらにgollemディレクトリの名前からバージョン番号の部分を削除し、Gollemがファイルを保存するためのvfsrootディレクトリを作成する。

# yum install horde horde-enhanced
# cd /usr/share/horde
# tar xzf /FromWeb/gollem-h3-1.0.4.tar.gz
# chown -R root.apache gollem*
# mv gollem* gollem

# mkdir -p vfsroot
# chown -R apache gollem

 Gollemのtarballには多くの.distファイルが含まれており、これらがデフォルト設定用のファイルになっている。下記のコマンドの「for foo」という行は、こうしたデフォルト設定のコピーを実際の設定ファイルとして作成するものだ。また、Hordeを使って設定を完了できるように、Apacheから書き込み可能な設定ディレクトリも作成している。

# cd ./gollem/config
# cd config
# for foo in *.dist; do cp $foo `basename $foo .dist`; done
# chmod g+w .

 なおここでは、設定ファイルのbackends.phpを編集して、デフォルトのvfsrootを、テスト中にGollemで使用するために作成した別のディレクトリに変更した。

# vi backends.php
...
$backends['file'] = array(
    'name' => 'Virtual Home Directories',
    'driver' => 'file',
    'preferred' => '',
    'hordeauth' => false,
    'params' => array(
        // The base location under which the user home directories live.
        'vfsroot' => '/usr/share/horde/gollem/vfsroot,

 また、何らかの理由でPHPのPEARリポジトリがPHPのデフォルトのinclude_pathに含まれていなかったため、Gollemが動作するようにphp.iniファイルも編集する必要があった。

# vi /etc/php.ini
...
; UNIX: "/path1:/path2"
include_path = ".:/php/includes:/usr/local/php/site-includes:/usr/share/pear"

 「/etc/httpd/conf.d」内に追加されたgollem.confファイルは、vfsrootのファイルがApacheによって直接提供されるのを防ぐ働きをする。Hordeの設定内容によっては、Gollemのvfsrootにあるすべてのファイルの所有者がApacheになる。直接のダウンロードをブロックしないと、各ユーザは、通常のhttp要求としてvfsrootディレクトリに直接アクセスすることで、どんなユーザのファイルでもほとんどダウンロードできるようになってしまう。また、horde.confファイルを編集してApacheを再起動することで「local connections only」(ローカル接続のみ)の制限も無効にした。

# cd /etc/httpd/conf.d
# vi gollem.conf

<DirectoryMatch "^/usr/share/horde/gollem/vfsroot/.*">
	Order Deny,Allow
	Deny from all
</DirectoryMatch>

# vi horde.conf
...

<Directory /usr/share/horde>
        # Comment out the following 3 lines to make Horde accessible from anywhere
        <b>#</b>Order Deny,Allow
        <b>#</b>Deny from all
        <b>#</b>Allow from 127.0.0.1

# service httpd restart

 Horde環境内におけるGollemの設定は、Webブラウザで「http://localhost/horde」を読み込むことで完了する。メインページ左側のツリーメニューで「Administration」→「Setup」を選択し、「File Manager」(gollem)と「Horde」の双方のステータスが「Application is ready」になっていることを確認する。両者の準備ができていない場合は、Horde側でそれらの設定と有効化が行える。

 Fedoraマシンのデフォルトの状態では、認証を行わなくても管理者として自動的にログインできるようにHordeが設定されている。Hordeによるユーザの認証方法を変更するには、「Administration」→「Setup」ページで「Horde」を選択し、「Authentication」タブに切り替える。そのページの下のほうに、PAMからetc/passwd、IMAP、Samba、LDAP認証に至るまでのあらゆるオプションを含むドロップダウンメニューがある。そのなかで最も設定が簡単なのは、htpasswdファイルを使った基本的なHTTP認証だった。そこで、「HTTP(Basic Authentication/.htpasswd)authentication」を選択し、htpasswd_fileを「/usr/share/horde/config/htpasswd」に設定した。以下のコマンドにより、新しいhtpasswdファイルが作成され、ユーザbenと管理者がそこに追加される。

# cd /usr/share/horde/config/
# htpasswd -c htpasswd  Administrator
# htpasswd    htpasswd  ben
# chown root.apache htpasswd
# chmod 640 htpasswd

gollem1_thumb.png
Gollem

 htpasswdによる認証を使用する場合、Hordeに設定されるユーザとLinuxのユーザアカウントとの間には何の関係もない。つまり、Gollemへのログインと新しいファイル「foo.txt」の作成をユーザbenとして行うと、このファイルはファイルシステム上では「vfsroot/ben/foo.txt」となり、ユーザapacheが所有者になる。ファイルの所有者をLinuxのユーザアカウントにする場合は、Hordeユーザの認証時に、HordeにLinuxユーザへの変更を行わせる必要がある。なお、ほかの認証手法を使用する場合については、こちらのFAQを参照してもらいたい。右に、Gollemでbenのvfsrootの下位ディレクトリを表示中のスクリーンショットを示す。

 Gollemを使えば、通常のファイルシステムのvfsrootではなく、PostgreSQLデータベースにファイルを保存することもできる。リレーショナルデータベースを利用したファイルの保存に意味があるのは、別のリレーショナルデータベースに保存されている情報を、ユーザがアップロードしたり編集したりするドキュメントにリンクさせる場合だろう。これを試すには、データベースのセットアップを以下のように行う。Hordeは多くのデータベースをサポートしているので、ほかにもMySQLなどのデータベースが利用できるが、その方法については、以下の例に示したのと同じscripts/sqlディレクトリにあるREADMEファイルを参照してほしい。また、下記のコマンドの最後の行にあるパスワードも変更する必要があるだろう。

# su - postgres
$ cd /usr/share/horde/scripts/sql
$ psql -d template1 -f create.pgsql.sql
$ psql -qc "ALTER USER horde WITH PASSWORD 'horde';" template1 postgres

 データベースのセットアップが済んだら、管理者としてHordeにログインし、「Administration」→「Setup」→「Horde」の該当するデータベースのタブを開いて、適切なデータベースエンジンと証明書がHordeに設定されていることを確認する。Hordeからデータベースに接続できるようになると、いつでもファイルの保存にデータベースが利用できる。「File Manager」の下にある「SQL Server」リンクをクリックすると、「Virtual Home」(vfsrootを利用)ストレージのときとよく似たインタフェースが現れる。ファイルをSQL Serverストレージにアップロードしたあと、postgresとしてコンソールにログインすると、新しいファイルとその内容をhorde_vfsテーブルから取得することができた(以下を参照)。

$ psql horde
horde=# select *,decode(vfs_data, 'hex') from horde_vfs;
 vfs_id | vfs_type | vfs_path | vfs_name | vfs_modified | vfs_owner |                          vfs_data                          |              decode
--------+----------+----------+----------+--------------+-----------+------------------------------------------------------------+----------------------------------
      1 |        1 |          | zzz.txt  |   1225149849 |           | 547565204f63742032382030393a32343a30342045535420323030380a | Tue Oct 28 09:24:04 EST 2008\012
(1 row)

 先ほどのスクリーンショットで「File Manager」の下に2つのSQL Serverリンクがあることに気付いたかもしれない。最初のリンク「SQL Server」は、リレーショナルデータベース内にある複数ユーザ向けの共有ディレクトリである。一方、2番目のリンクは、スクリーンショットでは途中から表示が消えているが、「SQL Server with home」であり、リレーショナルデータベース内の個人用ストレージとなる。私の環境では、「SQL Server with home」のほうを使おうとすると、テスト用ファイルのアップロード時に「ErrorFolder "home/ben" does not exist」というエラーが発生した。

 「SQL Server」のほうを選択した場合は、新しいフォルダhomeを作成し、そこにそのユーザのhomeディレクトリを作成することができる。また、「home/Administrator」と「home/ben」を作成すれば、管理者でログインしてもbenでログインしても「SQL Server with home」の機能を利用できることがわかった。問題は、SQLデータベースを調べたところ、データベース内のすべてのファイルでvfs_ownerが設定されていなかったことだ。これは、私がbenでログインして「SQL Server」を選択した場合でも、「home/Administrator」を参照したり、管理者が自らの「SQL Server with home」ディレクトリにアップロードしたファイルを表示したりできることを意味する。

 「gollem/config/backends.php」ファイルの「SQL Server with home」というエントリには、設定を変更してもよさそうな項目が2つある。まず、「createhome」を「false」ではなく「true」にすると、ログイン時にGollemがリレーショナルデータベース内にホームディレクトリを自動的に作成してくれる。また、VFSファイルの保存に使用するテーブルを変更することも考えられる。SQL with homeのファイル用とは別のテーブルを使用すれば、ユーザはもはやほかのユーザのホームディレクトリを参照できなくなる。

# vi /usr/share/horde/gollem/config/backends.php
...
$backends['sqlhome'] = array(
    'name' => 'SQL Server with home',
    'driver' => 'sql',
...
    // The default connection details are pulled from the Horde-wide SQL
    // connection configuration.
    'params' => array_merge($GLOBALS['conf']['sql'], array('table' => 'horde_vfs_home')),
...
//    'root' => '/home',
//    'home' => '/home/' . Auth::getAuth(),

    'home' => Auth::getAuth(),

 もちろん、データベースに新しいhorde_vfs_homeテーブルを作成する必要もある。以下のコマンドでは、「/usr/share/horde/scripts/sql/create.pgsql.sql」にあるこのテーブルのスキーマを、テーブル名だけ変えて使っている。このテーブルの設定が済めば、自らのHordeユーザしかアクセスできない個人用のファイルをSQLデータベースに保存できるようになる。

#  su - postgres
$ psql horde
\c horde horde;
You are now connected to database "horde" as user "horde".

horde=> CREATE TABLE horde_vfs_home (
    vfs_id        BIGINT NOT NULL,
    vfs_type      SMALLINT NOT NULL,
    vfs_path      VARCHAR(255) NOT NULL,
    vfs_name      VARCHAR(255) NOT NULL,
    vfs_modified  BIGINT NOT NULL,
    vfs_owner     VARCHAR(255) NOT NULL,
    vfs_data      TEXT,

    PRIMARY KEY   (vfs_id)
);

horde=> CREATE INDEX vfs_home_path_idx ON horde_vfs_home (vfs_path);
horde=> CREATE INDEX vfs_home_name_idx ON horde_vfs_home (vfs_name);

 Hordeを利用しているせいで、Gollemの設定が困難になる場合もある。ただし、Gollemが起動して動作するようになれば、ユーザはHordeとGollemを利用して、リレーショナルデータベースに対してファイルの読み書きが行えるようになる。また、ほかにもHordeを利用したアプリケーションについて調べて、Hordeサーバの設定にじっくり取り組むべきかどうかを判断するとよいだろう。

 Gollemには、期待されているようなファイル管理機能の一部が見当たらない。たとえば、ファイルシステムまたはSQLを利用した場合のどちらでも、ディレクトリの再帰的な削除はできなかった。同じように再帰的コピーも試したがやはりだめだった。ディレクトリを選択したうえで、コピーと別の場所への貼り付けをしようとしてもできなかった。こうした再帰的な操作を日常的に行うことはないかもしれないが、Webインタフェースでそうした機能が使えないことに上級ユーザは不満を感じるだろう。

 以上のように、Gollemを利用すれば、Webインタフェースを設定して、FTPサーバ、リレーショナルデータベース、またはサーバ自体のファイルシステム上でチーム内のユーザどうしがファイルを共有することができる。

Ben Martinは10年以上前からファイルシステムに携わっている。博士号を持ち、現在はlibferris、各種ファイルシステム、検索ソリューションを中心としたコンサルティング業務に従事。

Linux.com 原文(2008年11月07日)