FTPサーバーの設定


参考文献:FreeBSDパーフェクトネットワーク(毎日コミュニケーションズ)
参考サイト:FreeBSDあれこれ
FreeBSDで最初から使用できるftpには、システム内のどこにでもアクセスできるような、セキュリティ上の問題があるため、個人的に使用する分には問題はありませんが、一般的には高機能なwu-ftpd等に置き換えてやる必要があります。
尚、ここではおおむねFreeBSDパーフェクトネットワークを参考にしていますが、Apache同様wu-ftpdの専門の解説書を参考にすることをおすすめします。(奥が深いことと、説明しきれない為)

wu-ftpdのインストール
インストールは、/stand/sysinstallで、CD-ROMからインストールするか、packageのFTPサイト等から取ってきてください。

インストールしますと、/usr/local/etcの中に、以下の設定ファイルが作られます。
これらを、.exampleの拡張子を取って、リネームしておきます。
ftpaccess.example
ftpconversions.example
ftpgroups.example
ftphosts.example
ftpusers.example


hoge# cd /usr/local/etc
hoge# cp ftpaccess.example ftpaccess
hoge# cp ftpconversions.example ftpconversions
hoge# cp ftpgroups.example ftpgroups.example
hoge# cp ftphosts.example ftphosts.example
hoge# cp ftpusers.example ftpusers.example

ftpの置き換え
まず、標準のftpから、wu-ftpdに置き換えます。
/etc/inetd.confをエデイタで開いて、以下の行(2カ所あると思いますが)を書き換えます。
ftp	stream	tcp	nowait	root	/usr/libexec/ftpd	ftpd	-l

				↓下のように書き換える

ftp	stream	tcp	nowait	root	/usr/local/libexec/ftpd	ftpd	-l	-a
上のように-aオプションを付けておかないと、設定ファイルのftpaccessを参照しません。

そして、/etc/hosts.allowの中の、ftpdのアクセス制限が、以下のようになっているか確認をします。以下のようになっていなければ書き換えましょう。
ftpd	:	ALL	:allow
上のような設定になっていないと、Anonyomaus FTPのような不特定多数からのアクセスが受け付けられません。

そして、inetdにHUPシグナルをおくって、/etc/inetd.confを再読込させます。

#hoge killall -1 inetd
以上で、ftpの置き換えは終了です。

Anonymous FTP
次に、Anonymous FTPの設定を行います。Anonymous FTP(著名)その名の通り、誰だかわからない相手からの接続のための設定です。
まずは、システムの中にftpのアカウントを作ります。
vipwとコマンドを入力して作成しますが、viエデイタでの操作になりますので、viエデイタの簡単な操作方法を書いておきます。
k↑(カーソルを上に移動)
j↓(カーソルを下に移動)
h←(カーソルを左に移動)
l(小文字のL)→(カーソルを右に移動)
iカーソルの位置の前に文字を進入(入力モードへ)
aカーソルの後に文字を進入(入力モードへ)
ESCキー入力モードからコマンドモードへ
xカーソルの位置の1文字を削除
ddカーソルの位置の行の削除
ZZファイルに保存をして終了
:q! Enterキー保存をせずに強制終了

vipwとコマンドを入力して、以下のようにユーザーを追加してください。
ftp:*:50:50::0:0:FTP pseudo-user:/var/ftp:/sbin/nologin
上記の例の「/var/ftp」と言う場所は、Anonymous FTPでログインした際のディレクトリになりますので、各自の環境に合わせて換えてください。

そして、/etc/groupの中に
ftp:*:50:
とでも追加して置いてください。
これで、ユーザー名が「ftp」もしくは「anonymous」でアクセスがあると、ftpdはAnonymous FTPとしてのサービスを行うようになります。

次にAnonymous FTP用のディレクトリを作成します。

hoge# mkdir	/var/ftp
hoge# chown	root:wheel /var/ftp
hoge# chmod	555 /var/ftp
以上で、ftpユーザー用のホームディレクトリの準備は完了です。
以後、Anonymous FTPユーザーは/var/ftpのディレクトリがルートディレクトリとなって、これより上のディレクトリには、アクセスできなくなります。

まだまだ、必要な作業はあります。
さらに、以下のようなディレクトリを作成します。

hoge# cd	/var/ftp
hoge# mkdir	bin
hoge# mkdir	etc
hoge# mkdir	usr
hoge# mkdir	usr/bin
hoge# chmod	-R 111 *
hoge# mkdir	pub
hoge# chmod	555 pub
/bin
/etc
/pub
usr/bin
/var/ftpの中に上記のディレクトリを作成しました。

次に、/pub以外のディレクトリに、OSの/のディレクトリにあるものと同じものをコピーします。
cd /var/ftpのままで、

hoge# cp /bin/ls bin/
hoge# cp /sbin/md5 bin/
hoge# chmod 111 bin/*
hoge# cp /usr/bin/gzip usr/bin/
hoge# cp /usr/bin/tar usr/bin
hoge# chmod 111 usr/bin/*
これで、pub以下に公開するファイルをumask値222にしておけば、公開が可能です。

早速アクセスしてみましょう。
以下のように、パスワードにメールアドレスを指定して、ログインします。
WU-FTPD1.GIF - 8,549BYTES
以下の様な感じで接続できてると思います。
もちろん、これより上位のディレクトリにはアクセスできません。
WU-FTPD2.GIF - 14,110BYTES

次に、/var/ftp/etc/にまたまた必要なファイルを持ってきます。
以下のことは、あまりよく理解できなかったのですが、パーフェクトネットワークに記載されている通りにします。
通常のユーザー名やグループ名が記載されているファイルを、/etcから/var/ftp/etcに持ってきます。

hoge# cp /etc/gorup /var/ftp/etc
hoge# cp /etc/master.passwd /var/ftp/etc
hoge# cd /var/ftp/etc
hoge# chmod 444 gorup
hoge# chmod 600 master.passwd
/var/ftp/etcにコピーされた、gorupファイルの中の不要な行は削除します。
現在作られているanonymous用のファイルのオーナーやグループは、「root」と、「wheel」だけなので、groupファイルは以下のような行だけにします。
勘違いしてはいけないのは、/var/ftp/etc/以下のgroupファイルやmaster.passwdに、以下のような設定をすると言うことです。
wheel:*:0:

master.passwdは、
root:*:0:0::0:0::/nonexistent:/nonexistent
だけにしておきます。
また、master.passwdファイルの中は、不必要な行だけでなく、不必要なエントリも全てつぶしておくか、ダミーのエントリを入力しておくのが好ましいようです。
そして、これだけでは、ユーザー名がきちんと表示されないので、以下のようにコマンドを入力します。

hoge# pwd_mkdb -d /var/ftp/etc /var/ftp/etc/master.passwd
とします。
pwd_mkdb: warning, unkonown root shell
というワーニングが出ますが、ここでは全く関係がないので、無視して置くそうです。(^^;
以上でAnonymous FTPの設定は、全て終了です。

ftpaccessの設定
ftpaccessでユーザーに対して様々な設定を行います。
ここでは、実ユーザー(このサーバーに登録してあるユーザー)に対して、自分のディレクトリよりは上位に行けないように、制限をしてみます。
何もしない状態では、実ユーザーはAnonymousユーザーとは違い、サーバー内どこにでもほいほいと侵入出来てしまいます。
/usr/local/etc/ftpaccessのファイルを開きますと、以下のようになっていると思います。
class   all   real,guest,anonymous  *
limit   all   10   Any              /etc/msgs/msg.dead

readme  README*    login
readme  README*    cwd=*

message /welcome.msg            login
message .message                cwd=*

compress        yes             all
tar             yes             all

log commands real
log transfers anonymous,real inbound,outbound

shutdown /etc/shutmsg

email user@hostname
最後の行に以下の内容を追加してください。
guestgroup Foo-Group
Foo-Grpupは、アクセスを制限したいユーザーのグループ名です。
例えば、制限させたいユーザーfreemanが、g-groupに属していた場合には、g-groupにしてください。
グループとは、FreeBSDにユーザーを追加するときに、ユーザー名とパスワードの他に、属するグループも決めると思います。その時のグループ名です。
また、/etc/groupのファイルの中で、新たに追加することも出来ますので、エデイタで開いて見てみましょう。
開くと、以下のような感じになっていると思います。
# $FreeBSD: src/etc/group,v 1.19 1999/08/27 23:23:41 peter Exp $

wheel:*:0:root,freeman
daemon:*:1:daemon
kmem:*:2:root
sys:*:3:root
tty:*:4:root
operator:*:5:root
mail:*:6:
bin:*:7:
news:*:8:
man:*:9:
games:*:13:
staff:*:20:root
guest:*:31:root
bind:*:53:
uucp:*:66:
xten:*:67:xten
dialer:*:68:
network:*:69:
nogroup:*:65533:
nobody:*:65534:
ftp:*:50:
ftp-private:*:51:
Foo-Group:*:52:freeman
新たなグループを定義したい場合には、Foo-Group:*:52:freemanみたいな感じで追加します。 52という数字は、ここでは使用されずに開いている様なので、52番としておきます。

次に、vipwで、パスワードファイルを編集します。
freeman:*:2000:2000::0:0:user:/usr/home/freeman/./:bin/sh
上記のように.ピリオドを侵入します。
ピリオドの箇所はセパレーターと言って、要するにこの例では、/usr/home/freeman/よりも上位のディレクトリにはアクセスさせないと言う意味です。
/usr/home/は、ユーザーディレクトリですね。ユーザー追加時に作られますので、システムによって違いがあります。
以後、ユーザーfreemanは/usr/home/freeman/がルートディレクトリになります。

さて、またまた、Anonyomaus FTPでもやったように、ユーザーfeemanさん用にOSのコマンド類をコピーしてやらなければなりません。
ここの部分は、他のサイトで公開されていたやり方を参考にしました。
まずは、3つのディレクトリを作成します。

hoge# mkdir /usr/home/freeman/bin
hoge# mkdir /usr/home/freeman/dev
hoge# mkdir /usr/home/freeman/etc

次に各ファイルをコピー&作成します。

hoge# cp /bin/ls /usr/home/freeman/bin/
hoge# cp /etc/passwd /usr/home/freeman/etc/
hoge# cp /etc/group /usr/home/freeman/etc/
hoge# cd /usr/home/freeman/dev/
hoge# mknod zero c 3 12

そして、ユーザーに各ファイルを壊されないように、パーミッションを変更します。

hoge# chmod 111 /usr/home/freeman/bin
hoge# chmod 111 /usr/home/freeman/etc
hoge# chmod 111 /usr/home/freeman/dev
hoge# chmod 111 /usr/home/freeman/bin/ls
hoge# chmod 444 /usr/home/freeman/etc/passwd
hoge# chmod 444 /usr/home/freeman/etc/group
hoge# chmod 444 /usr/home/freeman/dev/zero
以上で、freemanさんのアクセス制限は終了ですが、まだ他にこの設定をしていないユーザーは、サーバーの中を自由に歩き回れますので、freemanさん同様にアクセス制限をしてやる必要があります。

接続例
WU-FTPD3.GIF - 8,319BYTES

/(ルート)になっていますね。
WU-FTPD4.GIF - 20,772BYTES

ftpusers
ftpusersは、FTPのアクセスをさせたくないユーザー名を書いておくファイルです。ここにサーバーの実ユーザー名を書いておきますと、そのユーザーはFTPアクセスができません。

ftphosts
特定のホストからアクセス制限をするためのファイルです。
allow	"ユーザー名"	allowhost1 allowhost2 ......
deny	"ユーザー名"	denyhost1 denyhost2 .....
例えば、ユーザ名がhogeで、bar.jpと192.168.110.0/24からのアクセスを拒否したい場合は、deny hoge *.bar.jp 192.168.111.*と記述します。

ftpconversions
wu-ftpdはファイルの拡張子によって、自動変換機能を持っていますので、その変換のルールをこのファイルの中に記述します。
パーフェクトネットワークによると、デフォルトのままでは実ユーザーに対してこの機能がうまく働かないので、以下のように書き換えることを推奨しています。
尚、このように書き換えてもmd5だけは、うまく働かきませんが、あまり必要性もないのでそのままにしておきます。(^^;
cksumとcompress特に必要性もないので、撤去という方法です。
 :.Z:  :  :/usr/bin/gzip -d -c %s:T_REG|T_ASCII:O_UNCOMPRESS:UNCOMPRESS
 :.gz: :  :/usr/bin/gzip -cd %s:T_REG|T_ASCII:O_UNCOMPRESS:GUNZIP
 :   : :.gz:/usr/bin/gzip -9 -c %s:T_REG:O_COMPRESS:GZIP
 :   : :.tar:/usr/bin/tar -c -f - %s:T_REG|T_DIR:O_TAR:TAR
 :   : :.tar.Z:/usr/bin/tar -c -Z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+COMPRESS
 :   : :.tar.gz:/usr/bin/tar -c -z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+GZIP
 :   : :.md5:/bin/md5sum %s:T_REG::MD5SUM


BACK