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 に元のグループが登録されていない場合は
ログインをやり直すことになります。
※自分のホームディレクトリには、グループがどんな状態であろうとも書けてしまうため。
上記のことが面倒くさい(っていうか、やってられない)場合は、ここを参照するとかなり解決します。