wu-ftpd でディレクトリ制限
2000-08-08 作成 福島
2000-12-16 更新 福島
2001-07-27 更新 福島
TOP > tips > wuftpd
・ユーザ who を chroot の対象にする
 ※TELNET禁止の設定もします。
[ /etc/passwd ]
who:x:500:500::/home/who:/bin/bash
を
who:x:500:500::/home/who/./:/usr/bin/passwd
に変更

・通常 shell の代わりに passwd コマンドとしたので、FTP にこれを許可させる。
[ /etc/shells ]
/usr/bin/passwd
を追加

・ユーザ who をゲストユーザにするための細工を施す。
[ /etc/ftpaccess ]
chmod           no              guest,anonymous
delete          no              guest,anonymous
overwrite       no              guest,anonymous
rename          no              guest,anonymous
を
chmod           no              anonymous
delete          no              anonymous
overwrite       no              anonymous
rename          no              anonymous
chmod           yes             guest
delete          yes             guest
overwrite       yes             guest
rename          yes             guest
に変更

・ユーザ who をゲストユーザに指定する。
guestuser who
を追加
※複数指定する場合は
 guestuser who who1 who2
 とします。

・アノニマスを禁止する。
[ /etc/ftphosts ]
deny anonymous *
を追加

・タイムゾーンを合わせる。
guest ログイン (あるいは anonymous) の場合、chroot するため、
chroot 先の ls がタイムゾーンを読めなくなるので GMT で表示される。
これを、ローカルタイムに変更する。
(chroot しても読めるファイルとして置いておく)
cp -p /usr/share/zoneinfo/Japan /home/ftp/etc/localtime
chmod 444 /home/ftp/etc/localtime


共通ディレクトリのメンテナンス
バーチャルドメインを使用して、複数のWebサーバを立ち上げると便利ですね。 理想から言うと、特定のユーザが特定のWebディレクトリをメンテナンスするのがいいです。 /home/www.virtual1.com/htdocs/index.html グループ : virtual1.com /www.virtual2.com/htdocs/index.html グループ : virtual2.com として、ブラウザからは http://www.virtual1.com/index.html http://www.virtual2.com/index.html と見せたい場合は [ /etc/group ] virtual1.com:x:1000:who10 virtual2.com:x:1001:who20 ※who10,who20 は通常のユーザIDです。 としておけば、それぞれが担当のドメインをメンテナンスすれば良いわけです。
drwxrwxr-x   70 www      virtual1     4096 Dec 10 01:42 /home/www.virtual1.com/htdocs/
-rw-r--r--    1 who10    who10        5449 Dec 10 01:42 /home/www.virtual1.com/htdocs/index.html

drwxrwxr-x   70 www      virtual2     4096 Dec 10 01:42 /home/www.virtual2.com/htdocs/
-rw-r--r--    1 who20    who20        5449 Dec 10 01:42 /home/www.virtual2.com/htdocs/index.html
しかし、現実は違います。 企業やサークルのホームページなどは、複数の人間で1つのコーナーを作成することが一般的です。 つまり、who10 や who20 を複数の人間で使いまわすことになります。 そこで問題が起きます。 「上書きしたいのにユーザが違うから出来ない!」 「www.virtual1.com ってどのアカウントだっけ?」 「そんなことイチイチ覚えてなんかいられるか〜!」 「私は普通にアップロードするからアカウントは1個しか覚えないからね!」 「ファイルを上書きしたヤツは誰だ!」 てな具合です。 Webデザイナーは Macintosh ユーザが多かったり、理屈の通らないユーザだったりするので、 「この位、普通だろ」 というエンジニアの言葉は聞き入れてもらえません。 ※確かに使いにくいです。 というわけで、 [ /etc/group ] virtual1.com:x:1000:who10,who11 virtual2.com:x:1001:who20,who21 という構成に変更します。 一見うまくいくように見えますが、どっこい違います。 ファイルはプライマリグループで作成されてしまうのです。 ※ファイルの作成時 = 初回アップロード時 これは他のユーザがそのファイルを更新できなくなることを意味します。 いくらグループ書き込み属性を立てようとも、who10 のファイルを who11 が更新できません。
drwxrwxr-x   70 www      virtual1        1 Dec 10 01:42 /home/www.virtual1.com/htdocs/
-rw-r--r--    1 who10    who10        5449 Dec 10 01:42 /home/www.virtual1.com/htdocs/index.html -- who11 が上書き不能

drwxrwxr-x   70 www      virtual2        1 Dec 10 01:42 /home/www.virtual2.com/htdocs/
-rw-r--r--    1 who20    who20        5449 Dec 10 01:42 /home/www.virtual2.com/htdocs/index.html -- who21 が上書き不能
who10 のプライマリグループを virtual1.com にしてしまえば who11 は更新できるようになります。 しかしそれでも who11 が作成したディレクトリを who10 が消すことは出来ません。
drwxrwxr-x   70 www      virtual1        1 Dec 10 01:42 /home/www.virtual1.com/htdocs/
-rw-rw-r--    1 who10    virtual1     5449 Dec 10 01:42 /home/www.virtual1.com/htdocs/index.html
-rw-rw-r--    1 who11    who11           1 Dec 10 01:42 /home/www.virtual1.com/htdocs/subdir/    -- who10 が削除不能
-rw-rw-r--    1 who11    who11           1 Dec 10 01:42 /home/www.virtual1.com/htdocs/subdir/sub.html

drwxrwxr-x   70 www      virtual2     4096 Dec 10 01:42 /home/www.virtual2.com/htdocs/
-rw-rw-r--    1 who20    virtual2     5449 Dec 10 01:42 /home/www.virtual2.com/htdocs/index.html
これを回避するために、who11 のプライマリグループも virtual1.com にしてしまいましょう。 ※なんだかな〜〜・・・。
drwxrwxr-x   70 www      virtual1        1 Dec 10 01:42 /home/www.virtual1.com/htdocs/
-rw-rw-r--    1 who10    virtual1     5449 Dec 10 01:42 /home/www.virtual1.com/htdocs/index.html
-rw-rw-r--    1 who11    virtual1        1 Dec 10 01:42 /home/www.virtual1.com/htdocs/subdir/
-rw-rw-r--    1 who11    virtual1        1 Dec 10 01:42 /home/www.virtual1.com/htdocs/subdir/sub.html

drwxrwxr-x   70 www      virtual2        1 Dec 10 01:42 /home/www.virtual2.com/htdocs/
-rw-rw-r--    1 who20    virtual2     5449 Dec 10 01:42 /home/www.virtual2.com/htdocs/index.html
[ /etc/group ] virtual1.com:x:1000: virtual2.com:x:1001:who20,who21 取りあえず、めでたしめでたし・・・。
メンテナンスする人間が増えた場合には、上記に倣ってアカウントを増やしていけば良いでしょう。 ※ただし、複数ディレクトリに跨らないことが前提です。 どう言うことかというと、 「www.virtual1.com が出来るんだから、www.virtual2.com のメンテナンスも君がやりなさい」 などと言われた不幸な人が居たとします。 who10 さんです。 [ /etc/group ] virtual1.com:x:1000: virtual2.com:x:1001:who20,who21, who10 ここで、さっきと同じ問題がまた顔を出します。
drwxrwxr-x   70 www      virtual1        1 Dec 10 01:42 /home/www.virtual1.com/htdocs/
-rw-rw-r--    1 who10    virtual1     5449 Dec 10 01:42 /home/www.virtual1.com/htdocs/index.html
-rw-rw-r--    1 who11    virtual1        1 Dec 10 01:42 /home/www.virtual1.com/htdocs/subdir/
-rw-rw-r--    1 who11    virtual1        1 Dec 10 01:42 /home/www.virtual1.com/htdocs/subdir/sub.html

drwxrwxr-x   70 www      virtual2        1 Dec 10 01:42 /home/www.virtual2.com/htdocs/
-rw-rw-r--    1 who20    virtual2     5449 Dec 10 01:42 /home/www.virtual2.com/htdocs/index.html
-rw-rw-r--    1 who10    virtual1        1 Dec 10 01:42 /home/www.virtual1.com/htdocs/subdir/     -- who20 が削除不能
-rw-rw-r--    1 who10    virtual1        1 Dec 10 01:42 /home/www.virtual1.com/htdocs/subdir/sub.html
つまるところ、全ての FTP ユーザのプライマリグループを同一にしなくてはならなくなり、 virtual1.com のファイルを who21 に更新させたくないのに出来てしまうし、 そもそも、「グループ分けをしたかった意味は?」となります。 ちょっと複雑ですが、ここまで理解できたでしょうか? wu-ftpd には、ディレクトリによって強制的に実行時グループを変更させてしまう機能があるので、これを利用します。 簡単に言うと、「FTP で動的にグループを変更する」という機能です。 クライアント側の操作は以下の 2 行です。 SITE GROUP <ftp-group-name> SITE GPASS <password> 簡単ですね。 これさえも実行できないと言われたら・・・う〜ん、どうしよう。 幸いなことに、 「このディレクトリにはパスワードが掛かっているんだよ」 というと、多くの人は納得してくれます。(嗚呼よかった。この位の理屈は理解してもらえる。) で、前述の [ /etc/group ] virtual1.com:x:1000:who10,who11 virtual2.com:x:1001:who10,who21 は要らなくなります。 ただし、ユーザを登録しない [ /etc/group ] virtual1.com:x:1000: virtual2.com:x:1001: という設定は必要になります。 ・サーバ側の設定 もちろんサーバ側に設定が必要です。 [ /etc/ftpaccess ] private yes の 1 行を追加 /usr/sbin/privatepw -g virtual1.com v1 /usr/sbin/privatepw -g virtual2.com v2 を実行 ※これは、/etc/ftpgroups (一種のパスワードファイル) にパスワードを登録する操作です。  実行すると、いつもの様にパスワードを 2 度聞かれるので、答えれば終わりです。 ※仮想のグループ名 v1, v2 を指定しています。 FTP クライアントのコマンドモードを使用して、 SITE GROUP v1 SITE GPASS <上で入力したパスワード> と 2 行続けて実行すれば virtual1.com のディレクトリに入れるようになります。 ディレクトリに入った後は、該当グループでファイルの読み書きを行えます。 ※この場合は、ユーザ who10 、グループ virtual1.com となります。 注意:  これは、実行時グループ属性を変更するだけの操作です。  グループを変更した後は、それを保持し続けるので、  自分のディレクトリにファイルを作成する場合は、グループを戻す必要があります。  /etc/ftpgroups に元のグループが登録されていない場合は  ログインをやり直すことになります。  ※自分のホームディレクトリには、グループがどんな状態であろうとも書けてしまうため。
上記のことが面倒くさい(っていうか、やってられない)場合は、ここを参照するとかなり解決します。