ftpサーバの選択としてproftpdを使うことにする。選択肢としては他にwu-ftpdもあるがchroot
の設定がめんどくさいということもあり、proftpdを選択した。
サーバとftp通信するにはもともとOSに付属のin.ftpd(solaris)などを使ってもよいが
これではまったくアクセス制御が利いていない。※tcp_wrappersを使えばある程度できるが・・・
さらanonymousftpサーバを公開するにも設定がかなり面倒である。

 そこで管理も簡単でin.ftpdやwu-ftpdのようにコマンドやライブラリなどを
いちいちユーザ単位でコピーしなくてもユーザにftpをさせることができるproftpdで
サーバを構築することにすると後の管理者が代わってもすぐに慣れてくれるでしょう。
 また設定ファイルなどもapacheのようにディレクティブ単位で設定できるので、直感とまではいかないが
apacheに慣れた管理者であれば、そう苦労はしないであろう。

【準備】
ftp://ftp.proftpd.org/distrib/source/proftpd-1.2.4.tar.gz
から最新版をダウンロードしておきます。
今回の場合はproftpd-1.2.4が最新。

【インストール】
※前提条件としてSolaris8で構築する場合はここのフリーソフトのインストールは
行っているものとする。Linuxでは特に前提条件は気にしなくてもよい。
手順としてはLinuxでもまったく同じでよいが、wu-ftpdが起動している場合無効にしておくか、rpm -eで
削除しておけばよい。


bash-2.05# cp /usr/local/arc/proftpd-1.2.4.tar.gz /usr/local/src/
bash-2.05# cd /usr/local/src
bash-2.05# gzip -d < proftpd-1.2.4.tar.gz | tar xf -
bash-2.05# rm proftpd-1.2.4.tar.gz
bash-2.05# cd proftpd-1.2.4
bash-2.05# ./configure 2>&1 |tee configure.log
bash-2.05# make 2>&1 | tee make.log
bash-2.05# make install 2>&1 | tee make_install.log

●インストールされるコマンド
/usr/local/sbin/proftpd
/usr/local/bin/ftpcount
/usr/local/bin/ftpwho
/usr/local/sbin/ftpshut

その他manファイルが/usr/local/man/man(1,5,8)
にいくつかコピーされます。


【設定】
設定用の雛型ファイルは/usr/local/etc/proftpd.conf
にインストール時にコピーされているのでこのファイルを編集することになる。

ftpサーバへのアクセスとして下記の2つの方法でアクセスできるようにする
・anonymousユーザ(一般公開用に読み取りのみ許可しパスワードなしでアクセス)
・通常のユーザ(そのマシンにある通常のユーザ用でパスワード要求あり)

●anonymous用のアカウントの作成
bash-2.05# useradd -c 'ftp for anonymous' -g nobody -d /export/home/ftp -s /bin/false ftp
bash-2.05# mkdir /export/home/ftp;chown -R ftp:nobody /export/home/ftp


●/usr/local/etc/proftpd.confの編集
※編集する前に一つだけ決めておかなければならない重要な事項として
proftpdをスタンドアロンモード起動するか、inetd(or xinetd)から起動するかである。
今回はスタンドアロンから起動する。
inetd(or xinetd)から起動するとproftpdでアクセス制御をせずtcpwrapperなどでアクセス制御が可能になるが
今回はfirewallでセキュリティは確保しproftpd自体でアクセス制御をするのでスタンドアロンで起動することにする。

bash-2.05# vi /usr/local/etc/proftpd.conf
#適当にサーバ名を入れておきましょう。
ServerName "home ftp"

#ここでinetdの場合はinetdにしておきましょう。その場合はinetd.confに記述する必要があります。
ServerType standalone   

DefaultServer on
#DefaultServer directive は、incoming の接続がホストのプライマリ IP アドレスや、<VirtualHost> 設定
#の記述で指定されたアドレスの一つのどちらにも向いていない場合、サーバの設定がデフォルトで使わ
#れるようにコントロールします。普通、そのような "unknown" の接続は "no server available to service
#your request" というメッセージが出て、切断されます。DefaultServer がプライマリサーバの設定か
#、virtual サーバに対して on になっていると、全ての unknown な行き先の接続はデフォルトサーバによっ
#て受け取られます。単一サーバの設定はデフォルトに設定されます。


Port 21
#その名の通りポート番号です。

Umask 022     
#ファイルやディレクトリを作ったときのumask値

MaxInstances 15
#standaloneモードで動かしているときの子プロセスの最大数

User ftp
Group nobody
#ftpサーバを実行するときのユーザとグループ、この辺はapacheと同じ考え方

<Directory /*>
AllowOverwrite on
</Directory>
#/ディレクトリは書き込みOKにする、ただしchrootした場合はログインした場所ということ

<Anonymous ~ftp>
User ftp
Group nobody
UserAlias anonymous ftp
MaxClients 20
<Limit WRITE>
DenyAll
</Limit>
</Anonymous>
#anonymousFTPの設定。とりあえず書き込みはできないのと接続数は20にしてある

TransferLog /var/log/ftpxferlog
ExtendedLog /var/log/ftp.log read,write
#ログの設定
#transferlogはwu-ftpd形式
#ExtendedLogは拡張形式でいろいろカスタマイズできます。今回はreadとwriteだけとっています。

<Limit LOGIN>
Order allow,deny
Allow from 131.248.155.
Allow from 131.248.81.
Allow from 127.0.0.1
Deny from all
</Limit>
#131.248.155.と131.248.81.ローカルホストからだけのftpを許可しています

DefaultRoot ~ !staff
#staffグループ以外はユーザ自分のホームディレクトリをルートディレクトリとしています。

UseReverseDNS off  
#名前解決をしない

WtmpLog off
#solaris8で構築する場合はoffにしておかないとログにwtmpがいわれる。

ServerAdmin "nitta@jinjin.com"
#サーバ管理者のアドレスを入れておきます

RootLogin off
#rootでログインできないように

RequireValidShell off
#これをoffにしておくと/etc/shellsにないシェルを使っているユーザはログインできない
#offにした場合は/etc/shellsは関係なくなる


MaxLoginAttempts 5
MaxClientsPerHost 1 "Too many connections from your host! You can connet 1/host!"
#同じ端末から1つの接続だけ許可し2つ目からはメッセージを返す。

MaxClients 10 "Too many connections by anonymous!"

#最大の接続数を10にし、それ以降はメッセージを返す。

DirFakeGroup on "nandeya"
DirFakeUser on "nandeya"
DirFakeMode 0000
#Fakeはls -lしたときに見た目だけのアクセス権を変更する

AccessGrantMsg "%u is valid Moriguchi-SC Member."
#ログインしたときに出すメッセージ

AllowChmod false
#chmodコマンドを許可しない

AuthPAM off
#PAMの機能を使わない。Solarisやlinuxではonにしておいてもよいでしょう

PidFile /var/run/proftpd.pid
#pidの場所を指定

ShowDotFiles off #default is off
#ドットファイルを表示させない

ServerIdent on ""

#ログインする前にデフォルトでproftpdサーバのバージョンなどが表示されてしまうので
#ログインする前のプロンプトには何も表示させないようにする。
まだまだ設定できる項目は山のようにあるので
http://www.proftpd.org/docs/configuration.html
を参考にしてください。
日本語に翻訳されたページもありますが最新ではないようなので本家を見ることをお勧めします。
参考までに翻訳されたページ

http://www.infoscience.co.jp/technical/proftpd/reference.html

●作成した設定ファイルに構文ミスがないかチェック
bash-2.05# /usr/local/sbin/proftpd -t /usr/local/etc/proftpd.conf
Checking syntax of configuration file
Syntax check complete.

【起動確認】
まずもともとのin.ftpdがinetd(xinetd)から呼びだされていたり
RedHatの場合にwu-ftpdが起動している場合はまずそれらを止めておいてください。


・solarisなどinetdを使っている場合
/etc/inetd.confのftpの行をコメントアウトしてしまいます。
・RedHat7.x以上などでxinetdを使っている場合
/etc/xinet.d/wuftpd
でdisableにしてxinetdプロセスにUSR1シグナルを送ってください。
# kill -USR1 xinetdプロセス番号
既存のftpサービスを止めた後に
# /usr/local/sbin/proftpd -c /usr/local/etc/proftpd.conf
# ls -l /var/run/proftpd.pid
# ftp localhost
ログインまでして確認してください。

●起動ファイル
# vi /etc/init.d/proftpd
#!/bin/sh
#Linuxの場合bashにしておいても問題ないと思う・・・試してないのではっきりいえない。

case "$1" in
start)
# Start daemons.
if [ ! -f /var/run/proftpd.pid ]; then
echo "Starting ProFTPD: \n"
/usr/local/sbin/proftpd -c /usr/local/etc/proftpd.conf > /dev/null 2>&1
else
echo "process proftpd allready running!\n"
exit 1
fi
;;
stop)
# Stop daemons.
if [ -f /var/run/proftpd.pid ]; then
echo "Shutting down ProFTPD: \n"
kill -15 `cat /var/run/proftpd.pid`
else
echo "process proftpd not running!\n"
exit 1
fi
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0
# chown root:sys /etc/init.d/proftpd
# chmod 744 /etc/init.d/proftpd
# ln -s /etc/init.d/proftpd /etc/rc2.d/S99proftpd
※Linuxの場合はすべてのランレベルにリンクしておきましょう。

●ログローテーション
# vi /usr/local/bin/newftplog.sh
#! /bin/sh
cd /var/log
LOG=ftpxferlog
test -f $LOG.6 && mv $LOG.6 $LOG.7
test -f $LOG.5 && mv $LOG.5 $LOG.6
test -f $LOG.4 && mv $LOG.4 $LOG.5
test -f $LOG.3 && mv $LOG.3 $LOG.4
test -f $LOG.2 && mv $LOG.2 $LOG.3
test -f $LOG.1 && mv $LOG.1 $LOG.2
test -f $LOG.0 && mv $LOG.0 $LOG.1
mv $LOG $LOG.0
cp /dev/null $LOG
chmod 644 $LOG

LOG=ftplog
test -f $LOG.6 && mv $LOG.6 $LOG.7
test -f $LOG.5 && mv $LOG.5 $LOG.6
test -f $LOG.4 && mv $LOG.4 $LOG.5
test -f $LOG.3 && mv $LOG.3 $LOG.4
test -f $LOG.2 && mv $LOG.2 $LOG.3
test -f $LOG.1 && mv $LOG.1 $LOG.2
test -f $LOG.0 && mv $LOG.0 $LOG.1
mv $LOG $LOG.0
cp /dev/null $LOG
chmod 644 $LOG

kill -HUP `cat /var/run/proftpd.pid`
# chmod 744 /usr/local/bin/newftplog.sh
# EDITOR=vi;export EDITOR
# crontab -e
毎週日曜日の午前3時にログローテーションを自動で行うようにします。
0 3 * * 0 /usr/local/bin/newftplog.sh > /dev/null 2>&1

以上でproftpdでのftpサーバの構築は終了ですが

現在のバージョンではLDAPでユーザ認証を行ったり
SQLへの接続をしたりといろいろproftpdでできるようですが
今回はそういった複雑な構築はしてません。というかする必要性が感じられない!
あまりに複雑にすると管理者の教育が大変です。
必要意応じてLDAPやSQLへの接続を構築した方が無難かも・・・
ちょっと弱気(*^^*)
proftpd1.2.4インストール(2001.11.1)