FTPサーバを構築してみましょうヾ(゚∀゚)ノ
今回は、Proftpdというデーモンを使用します。

さて、今回はFTP、FTPSサーバを立てます。
FTPは皆さんが知っているあのFTPですが、FTPSは聞きなれない方が多いと思うので説明を。
FTPSとは「FTP over SSL/TSL」の事です。
パケットキャプチャとかができる人ならご存知だと思うのですが、FTPでの通信はIDは勿論パスワードまでも平文でタレ流しになっています。
それはセキュリティ的にも良くないので、SSLを上乗せして暗号化しちゃえ!というのがFTPSです。

FTPはセキュリティの問題が、FTPSには接続できるソフトが限られているので注意して下さい。
接続可能なソフトは、有名どころではNextFTP(シェアウェア)とSmartFTP(フリーウェア)がFTPSでの接続に対応しています。
今回はrpmforge経由でインストールを行います。

Proftpdインストール
# rpm -ivh http://ftp.belnet.be/packages/dries.ulyssis.org/redhat/el4/en/i386/RPMS.dries/rpmforge-release-0.2-2.2.el4.rf.i386.rpm
※rpmforgeリポジトリインストール(CentOS4)

# vi /etc/yum.repos.d/rpmforge.repo
※競合を避ける為に、yumを無効にする
enabled = 1
※変更
enabled = 0


# yum -y --enablerepo=rpmforge install proftpd
※Proftpdインストール


Proftpd設定
# vi /etc/proftpd.conf
ServerType      standalone
※変更
ServerType      inetd
※xinetd経由で起動

DefaultRoot      ~ !adm
※変更
DefaultRoot      ~/public_html !wheel
※wheelグループ以外のユーザの基本ディレクトリをpublic_htmlにする

#TLSEngine                      on
#TLSRequired                    on
#TLSRSACertificateFile          /etc/pki/tls/certs/proftpd.pem
#TLSRSACertificateKeyFile       /etc/pki/tls/certs/proftpd.pem
#TLSCipherSuite                 ALL:!ADH:!DES
#TLSOptions                     NoCertRequest
#TLSVerifyClient                off
##TLSRenegotiate                ctrl 3600 data 512000 required off timeout 300
#TLSLog                         /var/log/proftpd/tls.log
※変更
TLSEngine                       on
TLSRequired                     off
※暗号化接続のみ許可する場合はon、通常接続も許可する場合はoff
TLSRSACertificateFile           /usr/share/ssl/certs/proftpd.pem
TLSRSACertificateKeyFile        /usr/share/ssl/certs/proftpd.pem
※サーバ証明書の格納先を変更
TLSCipherSuite                  ALL:!ADH:!DES
TLSOptions                      NoCertRequest
TLSOptions                      NoSessionReuseRequired
※1.3.3rc1よりTLSオプションが変更になりました
TLSVerifyClient                 off
##TLSRenegotiate                ctrl 3600 data 512000 required off timeout 300
TLSLog                          /var/log/proftpd/tls.log

※以下は最終行に追加
ExtendedLog                     /var/log/proftpd/access.log WRITE,READ default
※アクセスログを取得
ExtendedLog                     /var/log/proftpd/auth.log AUTH auth
※認証ログを取得
TimesGMT                        off
※タイムスタンプを日本時間へ修正
MasqueradeAddress               hoge.ravenz.livedoor.biz
※外部からのPASV接続を可能にする為、公開しているFQDNとは別のFQDNを設定する
PassivePorts                    50000 50100
※PASVポートを指定

MasqueradeAddressの箇所は外部からのPASV接続に対応するが、内部から接続を行うとグローバルIPアドレスで接続しようとしてしまい、結果アクセスできなくなる。
上記設定を行う場合は、内部からはPASVを外してアクセスする事。

# vi /etc/xinetd.d/xproftpd
※起動スクリプト変更
service ftp
{
        log_on_success          += DURATION USERID
        ↓※変更
        log_on_success          += HOST PID

        log_on_failure          += USERID
        ↓※変更
        log_on_failure          += HOST

        disable                 = yes
        ↓※変更
        disable                 = no

        env                     = TZ=JST-9
        ※タイムスタンプを日本標準に合わせる
}

タイムスタンプの修正はconfでも行ったが、起動スクリプトでも行う事。

MasqueradeAddressの設定は、PASVモードの時に伝えるIPアドレスの事です。
ここがローカルIPアドレスになると、外部からのPASV接続時にもローカルIPアドレスで接続しようとするので接続できません。
この設定をして内部からPASV接続する場合、グローバルIPアドレスとして接続するので接続できなくなります。
・・・なんか凄く分かりにくいんですが、要するに外部からPASVで接続する為の機能で、内部からはPASV設定しちゃダメ!って事です。

タイムスタンプの問題はchrootした際のglibc-2.3のバグみたいです。
アップロードしたファイルのタイムスタンプのクライアントでの表示やログがGMT(9時間前)になってしまう。
おやじさんの所に詳しく書いてあるので、気になる人は見てみましょうヾ(゚∀゚)ノ

サーバ証明書作成
# cd /usr/share/ssl/certs
# make proftpd.pem
※サーバ証明書作成
Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:BystonWell
Locality Name (eg, city) [Newbury]:Country of Lawu
Organization Name (eg, company) [My Company Ltd]:RavenzNetwork
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:ravenz.livedoor.biz
Email Address []:ravenz.wing@gmail.com
※上から「国」「都道府県」「市区町村」「サーバ名(適当でOK)」「空」「外部と通信する時に使用するサーバアドレス」「管理者メールアドレス」


Proftpd起動
# chkconfig xproftpd on
※Proftpd自動起動の設定
# /etc/rc.d/init.d/xinetd restart
※xinetd再起動


これで、ProftpdはFTP、FTPSで接続可能です。
実際に接続して、正しくアップとダウンができるかどうか確認してください。
今回は基本的な構築についてまとめました。次回はちょっとマニアックな方向けのカスタマイズをご紹介したいと思います。