TL;DR
/etc/pure-ftpd/pure-ftpd.conf
は罠- 設定は
sudo tee /etc/pure-ftpd/pure-ftpd.conf/(項目名) <<< (設定値)
で - 本記事では最低限+αの設定方法しか述べません
きっかけ
- GCEでf1-microのインスタンス作って最低限の設定でFTPサーバを立てたかった
- 有名な競合ソフトのvsftpdはFTPSで繋ぐとユーザ認証完了直後の挙動がおかしいのでパス
インストール
お茶の子さいさい、ここで迷うことはないでしょう
sudo apt install -y pure-ftpd
Pure-FTPdの設定
ここが地味に地雷原です。TL;DRにも書きましたが、設定ファイルに思われる/etc/pure-ftpd/pure-ftpd.conf
はただのハリボテです。これを変更しても、systemdで(すなわちサーバ起動時に)起動するPure-FTPdのデーモンには設定が反映されません。どう設定すれば反映されるのでしょうか。
反映させるには、/etc/pure-ftpd/conf
の中に設定項目の名前で、設定値を内容としたファイルを作ることが必要です。それでは、私が既定値から変更した設定内容と、その理由を紹介していきます。また、以下のコマンドは、予めcd /etc/pure-ftpd/conf
した後で実行したものです。
なお、インストール時の初期設定は、以下の通りになっています。
MinUID = 1000
UnixAuthentication = no
NoAnonymous = yes
FSCharset = UTF-8
AltLog = clf:/var/log/pure-ftpd/transfer.log
PAMAuthentication = yes
PureDB = /etc/pure-ftpd/pureftpd.pdb
TLSCipherSuite = HIGH
FTPS関連
sudo tee TLS <<< 3
sudo tee TLSCipherSuite <<< AESGCM+TLSv1.3:AESGCM+ECDHE+TLSv1.2
TLS = 3
は、FTPSをサポートしないクライアントからの接続を切ります。Ubuntuには自動発行されたオレオレ証明書(後述)がありますし、ドメインを予め取っておけば、Let's Encryptの証明書がタダで取れます。オレオレ証明書でも、検証目的程度ならば、FTPクライアント次第ではどうにかなります。なお、TLS = 1
にすると、TLSなしのFTPでのログインも許可します。
TLSCipherSuite
は、デフォルトがHIGH
という高セキュリティを謳いながらセキュリティ的に微妙な暗号スイートを含む設定値を使いたくなかった・今どきTLS1.2に対応していないクライアントはおかしいのが変更理由です。
PASVモード関連
sudo tee PassivePortRange <<< '60000 60099'
sudo tee MaxClientsNumber <<< 50
50台の分ポートを確保しました。検証目的ならば、もっとポート数を減らしてもよいでしょう。(例: 60000~60009)
ポート範囲は、明示的に指定してファイアウォールの設定難度下げ・FW開放ポート数を減らすことによるセキュリティ向上を狙いました。
セキュリティ関連
以下はユーザ自身のホームディレクトリ以外のディレクトリにアクセスすることを許可する場合のみ設定してください。
sudo tee ChrootEveryone <<< no
TLS証明書の設定
TLS証明書・秘密鍵ファイルへの既定のパスは、/etc/ssl/private/pure-ftpd.pem
にハードコーディングされています。オレオレ証明書を使用する場合、
sudo cat /etc/ssl/private/ssl-cert-snakeoil.key /etc/ssl/certs/ssl-cert-snakeoil.pem | sudo tee /etc/ssl/private/pure-ftpd.pem
で一発です。きちんとした証明書を使う場合は、秘密鍵→証明書の順番でcat
します。証明書のパスを変更する場合、以下の設定のどちらかが必要です。
sudo tee CertFileAndKey <<< "(証明書単独) (秘密鍵)"
sudo tee CertFile <<< (合体済証明書)
ファイアウォールを開ける
PassivePortRange
で指定した範囲のポート・21番ポートを開けてください。以下はUFWを使う場合の設定です。
sudo ufw allow ftp
sudo ufw allow 60000:60099/tcp
FTPユーザの作成
GCEなどを利用するなど、常用しているユーザにパスワードがない場合に必要です。
sudo useradd (ユーザ名)
sudo passwd (ユーザ名)
接続ユーザを制限するなど、さらなるセキュリティを求める場合は、LDAPを使用する・仮想ユーザを作るなどしてください。本記事では解説しません。
Pure-FTPdの設定反映
sudo systemctl restart pure-ftpd
起動確認
ss -ltn