FTPサーバ(ProFTPD)の構築


FTPサーバは、RedHat組み込みのwu-ftpdはいろいろ問題が多いようなのと、他のディストリビューションで採用されていること、設定がApacheに似ていて分かり易そうなことから、ProFTPDでいくことにしました。
このデーモンは、設定でNATルータ越えでPASVモ−ドでのFTPサービスの提供ができます。PASVモードでのNATルータ越えのインターネット公開の設定や、FTPサーバの公開サーバ公開のための設定も参考にしてください。

Xinetdを2.3.11-1.8.0にバージョンアップすると、RECORDオプションでエラーがでるので削除しました。
PAMの設定がまずいので、loginの設定をそのまま使うように修正しました。
1.2.8RC1以降、転送量制御のディレクティブが変更になっているとのご指摘があったので、追記しました。
ProFTPD1.2.10rc1から「NLST」のオプション指定が未サポートになり、FFFTPなどではデフォルトのままではファイル一覧が取得できないので注意が必要です。これはRFC959に基づく変更であり、クライアントの設定を変更して「LIST」コマンドでファイル一覧を取得するようにすれば大丈夫です。
なお、このままではドットファイルが見えなくなるので、見せる必要があるなら、「ListOptions」ディレクティブを 「ListOptions "-a"」のように、proftpd.conf に追記してください。

■ProFTPDのダウンロードとインストール

ProftpdはRPMが簡単に作成できるので、なるべくこちらを参照ください。
  ProFTPDを本家のこちらからダウンロードします。おやじがダウンロードしたバージョンは、1.2.5rc1(2002.04.20現在)です。
インストールは、任意の場所にソースを展開してコンパイルします。
 $ tar zxfv proftpd-1.2.5rc1.tar.gz
 $ cd proftpd-1.2.5rc1
 $ ./configure
 $ make
 $ su
 # make install

 # mkdir /var/log/proftpd   ← 詳細ログ用ディレクトリの作成(詳細ログが必要なければ不要)


■ProFTPDの設定

ProFTPDの設定は、/usr/local/etc/proftpd.confを編集します。FTPの用途は、WWWサーバへのコンテンツのアップロード(パーミッションの設定が楽)と家庭内でのデータのやり取りだけであり、anonymousFTPは公開しないというポリシーで設定してあります。設定は、例によってエディタで簡単に。修正した部分のみ記載しています。(青字は削除、赤字は追加、緑字は変更したものです。)

  1. サーバ名の変更(どうでもいい)

    ServerName "ProFTPD Default Installation"

           ↓追加、変更

    #ServerName "ProFTPD Default Installation"
    ServerName "ProFTPD"

  2. サーバタイプの変更

    ServerType standalone

           ↓追加、変更

    #ServerType standalone
    ServerType inetd

     デフォルトは、デーモン起動のstandaloneですが常時使用するものでもないので、メモリ利用効率を考えxinetd.d経由の起動とし、inetdに変更。
     MaxInstancesディレクティブは、許可された同じ接続の最台数をコントロールするものでDoS attacks等に有効。inetdモードでは無効なため、特にコメントアウトしていない。

  3. NATルータ越えでPASVモードでインターネット公開する場合の設定の追加

     最近は、いくつかのメーカや機種で本設定を行わなくてもルータで同等の対応を行うものが増えてきているので、まずは、本設定を行わずにPASVを動かしてみるとよい。対応済みルータで本設定を行うと逆にLISTで止まるようになるので注意が必要。

    # PASVモードでインターネット公開する場合の設定
    MasqueradeAddress    ルータのWAN側アドレス 又は ドメイン名
    PassivePorts        最小ポート番号 最大ポート番号

    ・MasqueradeAddress

     MasqueradeAddressでは、ルータのWAN側アドレス又はドメイン名が指定できるが、固定IPの場合はルータのWAN側アドレスでも良いが、動的IPの場合は、必然的にDDNSでのドメイン名になる。一般的には関係ないが、おやじのようにインターネットと同じドメイン名で内向きDNSを建てていると、自宅DNSでは自分のドメイン(おやじの場合なら、example.zive.net)は牽けないため接続できない。おやじが使用しているZiveさんでは、3つまでホスト名登録ができるので、FTP専用のホスト名(ex. exampleftp.zive.net)を登録し、このドメイン名をMasqueradeAddressに記述することで、この問題を回避できる。
     なお、動的IPの場合、サーバタイプがstandaloneになっているとIPの変化が起きてもDNSを牽き直さないので、必ずinetdで走らせる必要がある。
     現在は、自宅DDNSでの運用に切り替えたので、この目的専用のホスト名を内向きのゾーンにDDNSで登録し、そのアドレスを指定してある。(DNSとしては内向きだが、あるホスト名だけは動的IPアドレスが牽けるようにしてあり、これで対処している。)

    ・PassivePorts
     PassivePortsでは、PASVモードで使用するポート番号(1024以上)の最小と最大で範囲指定する。おやじは、家庭用なのでそれほど多くは必要ないのと使いまわしされるので、MaxInstancesと同じ30ポートとし、他のデーモンで使ってない4000-4029とした。
     なお、このポートはインターネット側から接続が開始されるので、ルータのスタティックNATでサーバにNATすると同時に、フルタリングも開ける必要がある。

  4. PAM認証の設定の追加

    # PAM認証の設定
    AuthPAMConfig ftp


     ログイン時に、PAMのエラーログが毎回出ていた(接続はできるが)ので設定を追加した。このとき、PAMの設定も必要であり、下記のように追加する。

  5. ユーザ・グループの変更

    User nobody
    Group nogroup

           ↓追加、変更

    User nobody
    #Group nogroup
    Group nobody

     デフォルトでは、nogroupというグループになっていますが、RedHatにはnogroupというグループはないため、追加してもいいのですがここでは、権限の低い既存のnobodyに変更。

  6. アクセスディレクトリの制限(追加)

    DefaultRoot                     ~ !wheel

     ”~” 指定により、接続ユーザにユーザのhome以上を見せないようにするが、これでは不便なのでwheelグル−プのユーザ(おやじ)のみ自由にアクセスできるように設定。

     上記設定では、/houme/user以下がrootディレクトリとなり、Maildir等システム関係のディレクトリ・ファイルが見え、誤操作でおかしてしまう可能性もある。従って、以下のように設定変更し、一般ユーザはpublic_html以下しかアクセスできないようにした。

    DefaultRoot                     ~/public_html !wheel

     更に、グループの制御に関してはカンマで区切って複数のグループを記述でき、それらのアンド条件で適用される。従って、下記の例では、ftpユーザで且つwheelユーザではないユーザがpublic_html以下しかアクセスできないようになる。ただ、この設定はDefaultRootと~ftp,!wheelの間は[Space]にしないと有効にならなかった。他のディレクティブは、[Tab]で問題はないのだが?

    DefaultRoot                     ~/public_html ftp,!wheel

  7. アクセスユーザの制限(追加)

    <Limit LOGIN>
     Order allow, deny
      Allow from 127.0.0.1, 192.168.1., 172.16.0. 192.168.1.0/24, 172.16.0.0/16
      Deny from all
    </Limit LOGIN>


     localhostとおやじ宅内(192.168.1.0/24, 172.16.0/16)からのみ、アクセスを許容し、それ以外は拒否するように設定。

     ProFTPD-1.2.6にアップしたところ、上記設定があると家庭内から一切アクセスできなくなってしまったが、ふと思いついて、アドレス表記を簡略形の「192.168.1., 172.16.0.」ではなく、「192.168.1.0/24, 172.16.0.0/16」と表記したところ、ProFTPD-1.2.6でも機能することが判明しました。(2002.11.16)

  8. 詳細ログの取得設定(追加:将来用)

    LogFormat allinfo "%t :  %u (%a [%h]) : [%s], %T, %m (%f)"
    LogFormat write "%t : %u : %F (%a)"
    LogFormat read "%t : %u : %F (%a)"
    LogFormat auth "%t : %u (%a [%h])"

    ExtendedLog /var/log/proftpd/all.log ALL allinfo
    ExtendedLog /var/log/proftpd/write.log WRITE write
    ExtendedLog /var/log/proftpd/read.log  READ read
    ExtendedLog /var/log/proftpd/auth.log AUTH auth


     現状はローカル運用のため必要ないが、将来に備えて設定。

  9. ログイン時間の短縮化 (追加)(2003.01.26)

    UseReverseDNS off   (DNS逆引きを停止:時間短縮にはさほど効果なし)
    IdentLookups off     (Identの停止:xinet.d設定の変更によりパラメータが有効になる。効果絶大)

  10. anonymousFTPの停止

    anonymousFTPは、運用しないため、全項目をコメントアウト。

◆追加の設定

上記以外で、使用環境によっては設定しておいたほうが良いと思われるパラメータを参考までに上げておきます。
  1. 時刻表示の変更

    時刻表示はデフォルトでGMTになっており、日本を対象にするなら下記設定を追加することにより、local timeに変更される。

    TimesGMT off

  2. Resume機能のサポート

    大きなファイルのダウンロードやアップロード中に回線断等のトラブルにより転送が中断してしまった場合、クライアントがサポートしていれば、中断点から再開できるのが、Resume機能である。ダウンロードはデフォルトで機能が有効になっているが、アップロードは無効になっている。有効にしたければ、下記設定を追加する。但し、アップロードを許可すると言うことは、REST コマンドによって再開するので、クライアントのオペミス(同一名称のままアップロード)で、先に保存されたファイルが壊れたりすることがあるので、特にanonymousでは絶対に使用しないほうが良い。

    # Allow clients to resume downloads (default on)
    AllowRetrieveRestart on


    # Allow clients to resume uploads (default off)
    AllowStoreRestart on


  3. アップロード中断ファイルの自動削除

    大きなファイルをアップロードすることがない場合は意味がないが、アップロード中に回線断等ではなく、クライアント操作で転送を中断(ABORコマンドによる中断)した場合に、下記設定を行っておくと自動的に中途半端なファイルを削除してくれる。上記、AllowStoreRestartとは背反である。

    # Enable automatic deletion of partially uploaded files (default off)
    DeleteAbortedStores on

  4. 同一ホストからの同時接続数の制限

    ダウンロードツール等を使用すると、複数セッションを設定して高速でダウンロードできるが、特定ユーザに細い回線を占有されてしまう。これを制限するのが下記設定で、数字は同時接続数であり、デフォルトは無制限である。制限されたときは、下記メッセージが返送される。

    # The maximum number of clients allowed to connect per host.(default none: no limit)
    MaxClientsPerHost 1

    [デフォルトメッセージ]

     Results in: 530 Sorry, the maximum number clients (%m) from your host are already connected. (%mは制限値)

  5. 異なるホストからの同一ユーザでの同時接続数の制限

    違った場所からの同一ユーザでのログインを制限できる。制限するには下記設定を行うが、数字は同時接続数である。制限されたときは、下記メッセージが返送される。

    # The the maximum number of times different hosts. (default none: no limit)
    MaxHostsPerUser 1

    [デフォルトメッセージ]

     Results in: 530 Sorry, the maximum number of hosts (%m) for this user already connected. (%mは制限値)

  6. アップロードファイル容量の制限

    アップロードを許可している場合、オペミスで大容量のファイルをアップしてしまったり、anonymousでいたずらされたりすることを防止できる。最悪はHDDを使い切ってシステムロックすることも考えられるので、設定しておいたほうが良い。但し、この設定で制限できるのはファイルの大きさだけなので、quotaでHDDの使用量制限を併用することを勧める。なお、ダウンロードの制限もMaxRetrieveFileSizeで可能であるが、あまり意味はない。
    下記の上の例は全てを3MByteに制限する例であり、下の例はanonymousのみ50KByteに制限する例である。 単位は、"Gb" (Gigabytes), "Mb" (Megabytes), "Kb" (Kilobytes), "B" (bytes)である。

    # Restrict upload to only 3 megabytes
    MaxStoreFileSize 3 Mb

    # Restrict anonymous uploads to 50k, but allow unlimited upload size for everyone else
    MaxStoreFileSize 50 Kb user anonymous
    MaxStoreFileSize *


  7. タイマ関係の設定

    タイマ関係としては、以下が設定可能であるが、家庭内で使用するには基本的にデフォルト値で問題ないはずなので、特に追加記述は不要である。各自の動作環境を想定して変更すると良い。敢えて変更するなら、TimeoutStalledで、ストール(止まった)したままでいつまでも繋いでおく必要もないので、10分(600)程度で切断しても良いと思われる。トータル時間を制限するなら、TimeoutSession を指定すれば、転送の遅いユーザは切ることもできる。
    なお、ここで無制限としても、巨大なファイルを細い回線で時間をかけて転送していると、転送が切れてしまう(転送完了後に切れることが多いはず)ことがある。これは、クライアントの実装にもよるが、データ転送中は制御コネクションにデータが流れないためルータのNATテーブルが消えてしまうことから発生する。制御コネクションのKeepaliveとしてNOOPコマンドを投げているクライアントもある。

     
    # Sets the idle connection timeout (default: 600)
    TimeoutIdle 600

    # Sets the login timeout (default: 300)
    TimeoutLogin 300 

    #  Sets the connection without transfer timeout (default: 600)
    TimeoutNoTransfer 600

    # Sets a timeout for an entire session (default: none)
    TimeoutSession none

    # Sets the timeout on stalled downloads (default: 0 {no limit})
    TimeoutStalled 600

  8. 転送量の制御

    [ProFTPd 1.2.7以前]

    非常に負荷が重い場合意外は意味がないが、下記設定でダウンロードの転送量を制御できる。アップロードも同様のパラメータがある。
    制御用のパラメータは3つあり、単独又は組み合わせて使用する。


    # The allowed byte per second download bandwidth in the given config context. (default :0)
    RateReadBPS 30000

    # The amount of bytes to be transferred without any bandwidth limits. (default :0)
    RateReadFreeBytes 100000

    # RateReadHardBPS forces the bandwidth to the given RateReadBPS value after
    # the RateReadFreeBytes amount of file was transfered. (default :off)
    RateReadHardBPS on


    [ProFTPd 1.2.8RC1以降]

    従来、転送量の制御は、RateRead* と RateWrite* で行えるようになっていたが、1.2.8rc1 から本ディレクティブは廃止され TransferRate というディレクティブに変更、集約された。
    TransferRate ディレクティブのパラメータは以下のとおりであり、コンテキストはserver config, <VirtualHost>, <Global>, <Anonymous>, <Directory>, .ftpaccessなので、制御単位に合わせて適宜設定する。

    TransferRate [ cmds] [ kilobytes-per-sec[:free-bytes]] [ ["user"|"group"|"class" expression]]


    下記設定例では、ダウンロードにおいて wheel グループ以外は、5KByte/sに転送量を制限されるが、1Kbyte以下のファイルはこの限りではないとなる。

     TransferRate RETR 5.0:1024 group !wheel


    [ Class ディレクティブ]

    class ディレクティブは、 server config (共通部)に下記のように記述する。

     Class [ "name" limit|regex|ip value]

    下記の例では、local と default の二つのクラスを作成している。この設定では、デフォルトは最大10コネクションしか張れないが、ホスト名が *.foo.com で且つアドレスが 172.16.1.* なら最大100コネクション張れることになる。

    Classes on
    Class local limit 100
    Class default limit 10
    Class local regex *.foo.com
    Class local ip 172.16.1.0/24

PAMの設定

PAMの設定として、上記で指定したサービス名(ftp)のファイルを下記のように作成する。
PAMの設定がまずいので、loginの設定をそのまま使うように修正しました。(2003.09.13)

 # cd /etc/pam.d
 # cp login ./ftp

 # vi /etc/pam.d/ftp
 auth    sufficient    /lib/security/pam_rootok.so
 auth    required    /lib/security/pam_stack.so service=system-auth
 session  optional    /lib/security/pam_xauth.so
 account  required    /lib/security/pam_permit.so  

「Esc」、「:」、「w」、「q」で保存する。

■logrotateの設定

/etc/logrotate.d配下に下記のようにproftpdを作成するだけで、他のlog同様、1週間毎にlogrotateされます。

 # vi /etc/logrotate.d/proftpd
 /var/log/proftpd/all.log /var/log/proftpd/auth.log /var/log/proftpd/read.log /var/log/proftpd/write.log {
 # ftpd doesn't handle SIGHUP properly
 nocompress
 }
「Esc」、「:」、「w」、「q」で保存する。1行目は、/var/log/proftpd/*.logでもいいはず。

■ProFTPDの自動起動

RedHatでプレインストールされている/etc/xinetd.d/配下にあるwu-ftpd用の設定(元のファイル名は忘れました。別名で保存すればよかったかな?)をチョイチョイといじって、proftpdにリネームして保存し、xinetd経由でProFTPDを起動できるようにしました。
RedHat7.3でxinetdを2.3.9に上げると(2002-10-14 RHSA-2002:196) 、下記xinetd用のproftpd設定ファイルでは起動できなくなります。もともとゴミ設定ですのでserver_argsをコメントアウトするか、削除してください。(2002.10.17)
 ログイン時間を短縮化するため、log_on_successとlog_on_failureの設定を変更しました。(2003.01.26)
# default: on
# description: The wu-ftpd FTP server serves FTP connections. It uses \
# normal, unencrypted usernames and passwords for authentication.
service ftp
{
       socket_type     = stream
       wait          = no
       user          = root
       server         = /usr/sbin/in.ftpd
       server_args      = -l -a
       log_on_success   += DURATION USERID
       log_on_failure    += USERID
       nice          = 10
       disable         = yes
}

       ↓削除、追加、変更


# default: on
# description: The proftpd FTP server serves FTP connections. It uses \
# normal, unencrypted usernames and passwords for authentication.
service ftp
{
       socket_type     = stream
       wait          = no
       user          = root
       server         = /usr/local/sbin/in.proftpd
       server_args      =  (削除)
       log_on_success   += HOST PID      (ログイン時間の短縮化)
       log_on_failure    += HOST RECORD  (ログイン時間の短縮化。Xinetdエラー対策でRECORD削除) 
       nice          = 10
       disable         = no
}


Top Pageへ