image header
Index >> Plamo Linux Fan >> ProFTPDメモ
                ProFTPDメモ
2003/11/08更新

1.目的
 ProFTPDは、比較的新しいFTPデーモンです。もっとも一般的に使われているwu-ftpdに比べて、軽くて設定が容易です。特に設定に関しては、Apache的なディレクティブを用いていたり、設定ファイルが単一(proftpd.confのみ)で見通しがいいなど、理解しやすい配慮がされています。
 僕は、特にwu-ftpdで言うところのGuestユーザをchrootするために、/etc/passwdをいじらなくていい点と、Apache同様VirtualHostが簡単に出来る点に興味があっていじり始めました。しかし、いじっているうちに、wu-ftpd ではリコンパイルしなくては出来なかったDNS Lookupの設定が出来ることに気がつきました。wu-ftpd 2.6.x でお使いの方で、DNS に登録されていない(生IPの)ホストからの接続が妙に遅いと感じたことがある方もおいででしょう。これはDNS Lookupのタイムアウト待ちをしているかららしいのです。ProFTPD だと明示的にOFFできるので、少し快適な環境をユーザに提供できそうですね。

2.入手先
本体
ftp://ftp.proftpd.org/distrib/source/proftpd-1.2.9.tar.bz2
2003/11/08時点で最新版。
proftpd.confにいくつかの新しいディレクティブが追加されています。主に、セキュリティ強化に関するものに思えます。
3.導入方法

 ここでは、prefix を Plamo-2.2.x で提供されているパッケージに合わせています。別に合わせる必要のない方は、--prefix を指定せずに構築してください。
 また、Plamo-3.x で提供されているパッケージにあわせたい場合は、さらに --sysconfdir=/etc、--localstatedir=/var を指示してください。
 なお、Plamo-3.3 では tar コマンドがGNUのものになっているので、解凍オプションは、xvfj となります。ご注意ください。

  1. インストール
    # tar xvfI proftpd-1.2.9.tar.bz2
    # cd proftpd-1.2.9
    # ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-shadow
    # make
    # su
    password:
    # make install

  2. 起動設定など

    ProFTPDは、wu-ftpd などと同様 inetd から逐次起動することもできますが、単独でデーモンとして起動することも出来ます。VirtualHostなどはデーモンで無いと動かないなどの事情もあるので、デーモンとして起動することをひとまずお勧めしておきます。既存のwu.ftpdが起動されないように、inetd の設定を変更しておいてください。

# vi /etc/inetd.conf
# cat /etc/inetd.conf | grep ftpd
#ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -i -a
↑コメントアウトする
# kill -HUP `cat /var/run/inetd.pid`
# vi /etc/rc.d/rc.local
# cat /etc/rc.d/rc.local
...
fi [ -x /usr/sbin/proftpd ]; then
  echo -n "Starting ProFTPD "
  /usr/sbin/proftpd
fi
 なお、ProFTPD自体にもアクセスコントロール機能はあるのですが、どうしても tcpwrapper を使いたいという理由で従来通りの起動をさせたいなら、上記の in.ftpd -l -i -a の部分を、in.proftpd に書きかえ、/usr/etc/proftpd.conf をちょっといじればOKです。下のほうでこれは示します。
4.運用

 ひとまずこれまでの作業でProFTPDは動作可能なはずです。ちょっと動かして見ましょう。

# /usr/sbin/proftpd
# ps ax | grep proftpd
18854 ? S 0:00 proftpd (accepting connections)

 こんな具合になっていれば、動いていると思われます。デフォルトでは、ポート21への接続を待っており、接続があると1接続あたり1つのプロセスが起動されます。最大の接続数は、先に出てきた proftpd.conf ファイルで設定します。/usr/etc/proftpd.conf として存在するはずです。
 このファイルの記述に関する詳細は、インフォサイエンスの日本語訳を見ていただくとして、ひとまず僕がいじった個所を。

ServerName
デフォルトのままではちと恥ずかしいので、適当に(^^;
UseReverseDNS off
DNS Lookupを抑止します。名前が引けないことによるログイン不全(笑)を解消します。
LsDefaultOptions "-a" -- Obsoleted
ディレクトリを表示する時の ls コマンドのオプションを指定します。.(ドット)で始まるファイル(.htaccessなど)を常に表示するようにするために、"-a"を指定しました。

2003/03/21 : 1.2.8からこのオプションは廃止されました。
その代わり、下記のディレクティブが追加されました。
ListOptions "-a"
意味は上と同じですが、各ユーザごとのディレクティブ(<Anonymous>、<VirtualHost>など)に限定して機能するようにもできる機能向上がなされました。
Group ftp
パッケージのものでは大丈夫だったんですが、コンパイルしたら Apache と同様、GroupID=-2 は通らなくなりました(泣) おなじ原因だと思うんですが、わからないのでひとまず ftp グループを作成して、ftp:ftp で動くようにしました。正攻法をご存知の方、教えてくださいm(_ _)m
※Plamo-MLのMOUEさんから、/etc/group 内で
nogroup::65534:
にするとOKらしいと情報を戴きました。ありがとうございますm(_ _)m
ScoreboardPath /var/run/proftpd -- Obsoleted
1.2.0rc3 になってログインしたとき、/var/log/messages に

run-time scoreboard file '' appears to be from a newer version of proftpd (1.2.0rc3).


なんてメッセージがでるようになったので、/var/run/proftpd を作成して、こう設定しました。一次配布元のドキュメントにもこう書いてあるのでそのままパクリ(^^;

・・・でしたが、これ、1.2.7では、

Fatal: ScoreboardPath: deprecated. Use 'ScoreboardFile /path/to/scoreboard/file' instead

なんて言われます。どうやら廃止したようです(^^;
$SOURCE/INSTALL によると、デフォルトでは、$PREFIX/var/proftpd/proftpd.scoreboard に作ることにしたようで、Plamo のパッケージ同等にConfigureしたなら、/usr/var/proftpd に作るということですね。
これが嫌だったら、下記のディレクティブを用います。
ScoreboardFile /path/to/scoreboardfile
proftpd.scoreboardファイルを作る場所を指定します。
Configureオプションにて --localstatedir=/var/run としても、同じ結果が得られます。
TransferLog /var/log/xferlog
wu-ftpd とおなじ場所に作ることにしました。混乱がなくていいかなぁ、っと(^^;
LogFormat default "%h %l %u %t \"%r\" %s %b"
LogFormat auth "%v [%P] %h %t \"%r\" %s"
LogFormat write "%h %l %u %t \"%r\" %s %b"
<Global>
  ExtendedLog /var/log/proftpd/access.log WRITE,READ write
  ExtendedLog /var/log/proftpd/auth.log AUTH auth
</Global>

もちろん、/var/log/proftpd は作成しておいてください。

 これだけではなんなので、いくつか目的別にいじる個所を書いて見ます。

  1. ftpユーザに~/以上を見せなくする(chrootする)

     wu-ftpd では、/etc/passwd やら /etc/ftpaccess やらいろんなところを直してやっと出来るこのchrootですが、ProFTPD では proftpd.conf ファイル中に1行挿入するだけで済みます。

    DefaultRoot                     ~
     入れる場所ですが、きっと基本的にはどこでもいいんでしょう。僕はなんとなく、元々あったDefaultServerのすぐ下に挿入しました。

     なお、既に wu-ftpd を使っていたときに同様の処理をしていた場合は、/etc/passwd ファイルを元に戻さないと期待した結果になりませんので、ご注意下さい。

  2. AnonymousFTPを使えなくする

     AnonymousFTP は、<Anonymous> ディレクティブによって制御されています。デフォルトでこのディレクティブはAnonymousFTPログインを許すようになっています。従って、単純に考えれば、このディレクティブ(<Anonymous>〜</Anonymous>)をコメントアウトしてしまえば、Anonymousログインは出来なくなりますが、もうちょっといい方法がありそうです。
     ここでは、<Limit>ディレクティブを使ってみます。インフォサイエンスの日本語マニュアルを見ると、LOGIN というキーワードが存在していて、LOGIN 操作自体の制御が出来るらしいですから、これをデフォルトの<Anonymous ~ftp>ディレクティブで囲まれた中へ追加してみます。

    <Limit LOGIN>
      DenyAll
    </Limit LOGIN>

     これで、Anonymousログインしようとすると、530 Login incorrect となればOKです。

  3. Resumeを有効にする

     よく巨大なファイルのFTPサーバへのアップロードやらFTPサーバからのダウンロードで、途中で回線が途切れてしまったり、何らかの事情で中断したあとで、続きをしたいときがありますね? こういうのをResumeという風に呼んだりするんですが、ProFTPDはデフォルトではこれらの動作を禁止しています。
     これらを許可したい場合は、AllowStoreRestart/AllowRetrieveRestart の2つのディレクティブで制御します。

    AllowStoreRestart on

     これでアップロードのResumeが、

    AllowRetrieveRestart on

     同様にこれでダウンロードのResumeが、それぞれ可能になります。
     なお、サーバ全域に行うことも、<Directory> やら <Anonymous> やらの中に書けば、その範囲に関してだけ行うことも可能です。

  4. inetデーモン経由で起動する

     既に書いた通り、inetデーモン経由でも使えます。その場合は、/etc/inetd.conf をいじると同時に、/usr/etc/proftpd.conf 内の ServerType ディレクティブもいじる必要があります。デフォルトではここは standalone になっていますから、これを inetd に書き換えてください。そうしないと起動してくれません。起動してくれないときは、/var/log/syslog を見てください。"Check the ServerType directive to ensure you are configured correctly." というメッセージが残っていれば、これが原因です。

  5. Passiveモードで使うポートを限定する

    ProFTPD のデフォルトでは、Passiveモードでの接続は出来なくなっています。

    嘘です(^^; 今はデフォルトでもPassiveで動くようです。でも、以前のバージョンでは確かに動かなかったんだけどなぁ・・・
     NATの内側のネットワークからFTP接続したいときなど、NATの設定上の問題でPassiveモードでないと接続できない場合があります。外部からの20番ポートへのアクセスを禁止されている場合などです。IP masquerade だったら、ip_masq_ftp というモジュールが勝手にやってくれますが、市販ルータではこれに相当する機能がついていない場合もあるようです。
      このようなネットワークから自宅などのNATの内側のホストへのFTP接続を許可しようとした場合、Passiveモードにしないと接続できないことになりますが、NATのフィルタの制限を緩める関係でネットワークの使用するポートが既知でありたいということもあります。

     このような場合の設定例が、こちらで紹介されています。Mini-HOWTO for ProFTPD and NAT という文書がそれです。/usr/etc/proftpd.conf 内で、下記のディレクティブを追記することで、上記のようなシチュエーションにおいてFTPサービスを利用可能にできます。

    MasqueradeAddress aa.bb.cc.d
    PassivePorts 10020 10024

     ここで、aa.bb.cc.d はNATの外側のグローバルアドレスです。IPアドレス固定のネットワークであれば、ここにIPアドレスを生々しく記述してもいいでしょう。もし、ISDNやxDSL、CATVなどの常時接続サービスを利用していて、IPアドレスが固定されていない場合は、DynamicDNSサービスをつかって名前でグローバルIPを引けるような環境を作った上で、ここにIPアドレスの代わりにDNSに登録した名前を用いることができます。
      これで、Passiveモードではポート10020から10024だけをFTPデータコネクションに利用しますので、NATの設定ではこれらのポートの外部からのアクセスを許すようにすればいいのです。
     なお、グローバルアドレスが固定されていない場合は、ProFTPD自体をinetdから起動するようにしたほうがいいみたいです。Standaloneで起動されていると、なにかの拍子にグローバルアドレスが変わってしまったときに接続できなくなります。ProFTPDがPORTコマンドで返してくるべきIPアドレスは、オンデマンドで名前引きするわけではなくて、起動時に見ているだけらしいので、昔のIPアドレスが返ってきてしまったりします(^^;

  6. SSH経由で接続する
     FTPをSSH経由で接続するようにすると、パスワードを暗号化してネットワークへ流すことができるので、セキュリティレベルが上がります。SSH経由で接続(SSH PortForwarding)については、こちらで書いていますので、参考にしてください。違いは、フォワードするポートをFTP用にすることです。
     ・・・ということを書こうと思ったら、もっと丁寧にかかれているサイトがありますね(^^; やっぱり。
     ご紹介しますのでそちらをご覧下さい。
    http://www.itboost.co.jp/inst/inst_17.php
     ポイントは、上の4.で示したような設定にくわえて、AllowForeignAddress On というディレクティブを追記することです。これをしないと、ProFTPDはSECURITY ALERTを吐いて接続させてくれません。
付録1.参考文献
ProFTPD Project
一次配布元です。
インフォサイエンスのProFTPDページ
マニュアルの日本語訳があり、便利です。Apacheといい、いろいろとありがとうございますm(_ _)m>インフォサイエンス様
NEWS
アーカイブに含まれているRC3への更新履歴を和訳したもの。パッシブモードの件以外僕にはどうでもいいよーな・・・(^^;
Geocrawler.com
NATで保護されたネットワークにProFTPDを外部へ公開する方法が記載されています。とっても助かりました。
Index >> Plamo Linux Fan >> ProFTPDメモ

image footer