Apache WebDAV (mod_dav_fs) Disk Quota パッチ 吉山あきら 2002/12/01 ■まえがき 通常、ISP で提供される1ユーザ当たりのディスク容量の制限は、Disk Quota と呼ばれる OS の機能を用いて実現されています。これは、所有者が同 一のファイル/ディレクトリの総量を一定量に制限する機能で、Solaris や HP-UX などの商用 OS はもちろん、Linux や *BSD などのフリー OS にも標準 で用意されています。 従来、ISP に対するファイルのアップロード手段には FTP が用いられてき ました。FTP でファイルをサーバにアップロードする際、通常は FTP デーモ ンが root 権限で起動し、ログインした一般ユーザの権限に移行してファイル/ ディレクトリを作成します。このため、作成されたファイル/ディレクトリの 所有者はログインユーザになります。 ところが、Apache はセキュリティ上の理由により、root 権限での動作を推 奨していません。このため、Apache は通常、専用の一般ユーザや nobody ユー ザとして動作するよう設定されます。このため、Apache WebDAV で作成された ファイルの所有者は Apache の動作ユーザになるため、ユーザ単位での Disk Quota 機能が使えません。この問題は ISP における WebDAV サービス提供の ネックであり、Apache による WebDAV の普及を妨げる一因であったと考えて います。 本パッチは、Apache WebDAV が新しくファイル/ディレクトリを作成・移動 する際、特殊なコマンドを呼び出す事で、Apache を一般ユーザ権限で動 作させながら Disk Quota 機能を有効にするためのものです。 ■本パッチの戦略 本パッチを適用した Apache は、ファイル/ディレクトリの作成/移動時に 特殊なツール(chown_user)を実行します。このツールは setuid されており、 引数で指定されたファイル/ディレクトリのパーミッションを 所有者:Apache の動作ユーザ → 配置ディレクトリの所有者 (rw) グループ:Apache の動作グループ(r → rw) その他:(r ないし何もなし) (ディレクトリはこれに x が入ったもの) に変更します。 通常、あるユーザ用のディレクトリに所有者が別ユーザのファイルを置く必 要はほとんどありません。よって、ファイル/ディレクトリの作成時に、それ が置かれるディレクトリ(配置ディレクトリ)の所有者と同じ所有者に変更する ようにしてしまえば、1ユーザのディレクトリ配下のファイル/ディレクトリ は全て同じ所有者を持つことになります。これにより Disk Quota を実現しま す。 ここで注意すべき事があります。ファイル/ディレクトリを操作できるユー ザをその所有者と Apache だけに制限するために、一般ユーザを Apache の動 作グループに登録してはいけません。 ■用意するもの ・Apache Web Server ver.2 (最新は 2.0.43) ・disk quota パッチ (010_diskquota.gz) ・chown_user ソース(chown_user.c.gz) ■構築 0)先述のソース、パッチをダウンロードし、同じディレクトリに置きます。 disk quota パッチ、chown_user ソースが gzip 圧縮されている場合は解凍 しておいて下さい。 1)Apache のソースを展開して、010_diskquota パッチを当てます。 なお、パッチは Debian の Apache2 用に作られています。通常のソースに 対して適用する場合は以下のように実行して下さい。 # gzip -dc httpd-2.0.43.tar.gz | tar -xvf - # cd httpd-2.0.43 # patch -p2 < ../010_diskquota 2)~httpd/srclib/apr/include/apr_file_diskquota.h にある chown_user コ マンドへのパスの設定(下記)を、インストールしようとしている環境に合わ せて下さい。(現在のパス"/usr/lib/apache2/chown_user" は Debian 環境 に合わせてあります) #define CHOWN_USER_PATH "/usr/lib/apache2/chown_user" FixMe: 誰か suexec と同様にパスを設定する方法を教えて下さい。 3)Apache を普通にインストールします。勿論、WebDAV 機能を有効にする事を 忘れないで下さい。詳しくは ~httpd/INSTALL を参照して下さい。 4)chown_user.c を修正します。冒頭の定義のうち #define ROOT_DIR "/var/www/dav" … WebDAV フォルダのトップディレクトリ #define MAX_PATH_LEN 128 … 操作するファイルの最大フルパス長 #define APACHE_OWNER "www-data" … Apache の動作ユーザ #define APACHE_GROUP "www-data" … Apache の動作グループ #define MIN_UID 1000 … ユーザ ID の最小値 #define MAX_UID 9999 … ユーザ ID の最大値 を修正します。適切に設定しないと実効後異常終了します。 注:実際には、APACHE_OWNER の定義は使用されていません。 5)chown_user.c をコンパイル・インストールします。 # gcc -Wall -o chown_user chown_user.c # chmod root.www-data chwon_user # chown 4050 chown_user # cp chown_user /usr/lib/apache2 "www-data" の所は Apache の動作グループ、"/usr/lib/apache2" は 2)で 指定したディレクトリを指定します。 6)Apache の設定ファイルを適切に設定し、DAV を有効にして下さい。最もシ ンプルな指定は下記のようになります。 --- /var/www/dav を WebDAV 有効にする設定 DAVLockDB /var/lock/apache2/DAVLock Alias /dav "/var/www/dav/" DAV on --- 6)Apache を起動し、機能を確認します。 ■chown_user コマンドのセキュリティ chown_user の使い方は下記の通りです。 # chown_user chown_user コマンドはできるだけ安全な作りにしたつもりです。下記の条 件チェックを行い、条件に合わない場合はエラー終了します。 ・一定長以上のパス名を拒否します(バッファオーバフロー対策)。 ・相対パスを拒否します。 ・ROOT_DIR で指定したディレクトリ配下でないパスを拒否します。 ・ROOT_DIR で指定したディレクトリそのものを拒否します。 ・通常のファイル、ディレクトリ以外のパスを拒否します。 ・複数のハードリンクを持つファイルへのパスを拒否します。 ・".."を含むパスを拒否します。 ・シンボリックリンクを含むパスを拒否します。 ・配置ディレクトリが MIN_UID、MAX_UID で指定された範囲以外の UID を持 つパスを拒否します。 ・Apache の動作グループと異なるグループを持つパスを拒否します。 他にもセキュリティに関する配慮として、以下のものがあります。 ・設定ファイル変更によるクラッキングを防止するため、chown_user は設定 ファイルを用いず、必要な設定は全てコンパイル時にソースに書き込むよう にしてあります。 ・グループを Apache の動作グループにして、パーミッションを 4050 にして あります。これにより、Apache 以外のユーザはこのコマンドを実行できま せん。 ・引数にパス名以外を必要としません。 ■アクセス制限について Apache の場合、単純に WebDAV 用に各ユーザのディレクトリに対してアク セス制限を付けると、ファイル閲覧の際にもアクセス制限が働いてしまいます。 Linux 2.4 以降の場合、特殊なマウントオプション(-o bind)で特定ディレク トリ配下を別のディレクトリにマウントできるので、片方で WebDAV 用にアク セス制限を付け、もう片方で WWW 用にアクセス制限をしないよう設定する方 法があります。 他の OS で実現する場合は、シンボリックリンクを許可するように設定して 上記と同様にするか、WebDAV 用と WWW 用の設定ファイルを用意し、ポート番 号を分けて2つの Apache を起動する事で問題を回避する事ができます。