Anonymous FTPサーバを作る

自前のNetBSDミラーサーバが欲しくなったので、NetBSD/i386 3.0で作ったサーバにAnonymous FTPサーバを立ててみる。
まず、/etc/inetd.confを書き換えてFTPサーバを有効にする。「ftp」で始まる行が見つからなければ以下の1行を追加する。
大抵は先頭に「#」を入れて以下の内容がコメントとして用意してあるので、「#」を削除して有効化するだけで使える。
これで一般ユーザからのFTP接続が可能になる。

ftp    stream tcp nowait root /usr/libexec/ftpd    ftpd -ll

次に/etc/ftpd.confに「umask all 022」を追加する。これで一般ユーザがアップロードしたファイルのパーミッションが640ではなく、644になる。
同様に「umask guest 022」を追加すると、anonymousでFTP接続したユーザがアップロードしたファイルのパーミッションも640ではなく、644になる。
さらに「upload guest off」を追加すると、anonymousでFTP接続したユーザはアップロードできなくなる。
/etc/ftpd.confは最初存在しないので無ければ新規に作成してやる。

umask all 022
umask guest 022
upload guest off

で、一番重要なanonymousでFTP接続したユーザのホームディレクトリを用意してやる。場所はどこでもいいので、とりあえず適当に「/usr/share/ftpd」とか作ってみる。

mkdir /usr/share/ftpd

ここに昔はFTP接続した際にlsコマンドが使えなくなるので、binディレクトリをパーミッション111で用意して/bin/lsを入れておいたらしいけど、NetBSD/i386 3.0のftpdは無くてもlsコマンドが使えるっぽい。
ただ、lsコマンドを使った際にユーザとグループが表示されず、ユーザIDとグループIDの表示になってしまうので、etcディレクトリをパーミッション111で用意して/etc/groupと/etc/pwd.dbをパーミッション444でコピーしておく。

mkdir -m 111 /usr/share/ftpd/etc
cp /etc/group /usr/share/ftpd/
cp /etc/pwd.db /usr/share/ftpd/etc/
chmod 444 /usr/share/ftpd/etc/*

本物の/etc/groupや/etc/pwd.dbを使うのに抵抗がある場合は見せてもいい(もしくはユーザIDやグループIDを見せたくない)ユーザとグループのみを記したgroupとmaster.passwdをetcディレクトリに作成して、master.passwdからpwd.dbをpwd_mkdbコマンドで作成する。

vi /usr/share/ftpd/etc/group
wheel:*:0:
nobody:*:39:
vi /usr/share/ftpd/etc/master.passwd
root:*:0:0::0:0:::
ftp:*:1005:39::0:0:::
pwd_mkdb -d /ftp /usr/share/ftpd/etc/master.passwd
chmod 444 /usr/share/ftpd/etc/*

最後にftpユーザを作成する。ユーザIDやグループIDは何でもいいが、Apacheのパッケージに習うならばftpってグループを作成してやるのが良いかも知れない。ログインは出来ないようにシェルに/sbin/nologinを指定しておく。

groupadd ftp
useradd -d /usr/share/ftpd -g ftp -s /sbin/nologin ftp

FTP接続時のログは/var/log/xferlogに書き込まれる。anonymousでFTP接続する際にパスワードがわりに入力するメールアドレスなどもここに記録される。

May 30 14:04:51 hoge ftpd[23142]: connection from foo.bar.com to hoge.bar.com
May 30 14:04:58 hoge ftpd[23142]: ANONYMOUS FTP LOGIN FROM foo.bar.com, hogehoge@bar.com (class: guest, type: GUEST)
May 30 14:05:02 hoge ftpd[23142]: Data traffic: 0 bytes in 0 files
May 30 14:05:02 hoge ftpd[23142]: Total traffic: 391 bytes in 0 transfers