vsftpdでftpsサーバ

ftpはchrootが簡単に使用できるので、様々な方々とOS領域には触れさせないようにしつつファイルをやり取りするのに大変便利なサーバです。
ftpは平文ですが、ftpsで暗号化通信させる設定も簡単です。

私はかつて「sshを使えるようにしとけばsftpもscpも使えるしその他諸々なんでもできるし問題ないだろ。ssh最強。」と考えていたのですが、ある日某ソフトウェアサポートセンターと大容量ファイルのやり取りした際に使用して大変便利だったので適宜使用しようかなと思い記録を残しておくことにしました。

その、某ソフトウェアサポートセンターでは必要時にユーザ作成してファイルをやり取りして使い終わったらユーザごと削除する運用をしているようでした。

様々な方々とのファイルやり取りにという観点だとあらゆる職場のファイアウォールをhttpsで突破しやすいことから「WebDAV最強！」と思っていた時期もありますが、かつてWindows標準のクライアント機能がちょいちょいバグってたりとか、バグ解消してもオレオレ証明書使えなかったりとかいう時期を経験して考えを改めております。いまは「ファイアウォール自由にいじれる回線用意すればいいじゃん」できないならもういいよシラネ。



## 環境情報

* OS: CentOS7.6
* ftpサーバ: 上記同梱のvsftpをyumでインストール



## /etc/vsftpd/vsftpd.conf

| 項目                   | デフォルト値       | 設定値                                                       | 説明                                                         |
| ---------------------- | ------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| anonymous_enable       | YES                | NO                                                           | anonymousユーザでのログインは禁止します。                    |
| xferlog_std_format     | YES                | NO                                                           | 通信記録もログに残すためにNOとします。<br />この設定を入れると/var/log/vsftpd.logにログ出力されるようになります。 |
| ftpd_banner            | （コメントアウト） | Welcome to blah FTP service.<br />（コメント内記載済み流用） | バージョン情報出力抑止の為に設定します。値はコメント記載値を流用します。 |
| chroot_local_user      | （コメントアウト） | YES<br />（コメント内記載済み流用）                          | chrootを使用します。<br />chroot先はデフォルトで各homeディレクトリになります。 |
| chroot_list_enable     | （コメントアウト） | YES<br />（コメント内記載済み流用）                          | chroot対象外ユーザリストを有効にします。                     |
| chroot_list_file       | （コメントアウト） | /etc/vsftpd/chroot_list<br />（コメント内記載済み流用）      | chroot対象外ユーザリストファイルを指定します。               |
| listen                 | NO                 | YES                                                          | IPv4通信を使用します。                                       |
| listen_ipv6            | YES                | NO                                                           | IPv6通信は使用しません。                                     |
| allow_writeable_chroot | （未記載）         | YES                                                          | chrootのルートディレクトリに対する書き込み権限がある場合を許可します。<br />各homeディレクトリをルートにするなら必須かと思われます。 |
| ls_recurse_enable      | （未記載）         | YES                                                          | ディレクトリリストの再帰表示を許可します。                   |
| ssl_enable             | （未記載）         | YES                                                          | ssl通信を使用します。                                        |
| rsa_cert_file          | （未記載）         | /etc/pki/tls/certs/vsftpd.pem                                | 証明書ファイルのパスを指定します。<br />（証明書と鍵を1ファイルにまとめた場合はこちらに設定します。） |
| rsa_private_key_file   | （未記載）         | /etc/pki/tls/certs/vsftpd.key                                | 秘密鍵ファイルのパスを指定します。<br />（証明書と鍵を1ファイルにまとめた場合はこちらの設定は不要です。） |
| ssl_request_cert       | （未記載）         | NO                                                           | SSLクライアント証明書は使用しません。                        |
| require_cert           | （未記載）         | NO                                                           | SSLクライアント証明書は使用しません。                        |
| ssl_sslv2              | （未記載）         | NO                                                           | SSLv2は使用しません。                                        |
| ssl_sslv3              | （未記載）         | NO                                                           | SSLv3は使用しません。                                        |
| ssl_tlsv1              | （未記載）         | YES                                                          | TLSv1を使用します。                                          |
| ssl_tlsv1_1            | （未記載）         | YES                                                          | TLSv1.1を使用します。                                        |
| ssl_tlsv1_2            | （未記載）         | YES                                                          | TLSv1.2を使用します。                                        |
| force_local_data_ssl   | （未記載）         | YES                                                          | SSL接続を必須とします。<br />平文通信させません。            |
| force_local_logins_ssl | （未記載）         | YES                                                          | SSL接続を必須とします。<br />平文通信させません。            |
| pasv_address           | （未記載）         | 192.168.57.21                                                | 自ホスト名を指定します。                                     |
| pasv_enable            | （未記載）         | YES                                                          | パッシブ通信を使用します。                                   |
| pasv_min_port          | （未記載）         | 60021                                                        | パッシブ通信用自サーバポートの最小値を指定します。<br />エフェメラルポート設定値内から選択した上で、予約済みポートとしました。 |
| pasv_max_port          | （未記載）         | 60022                                                        | パッシブ通信用自サーバポートの最大値を指定します。<br />エフェメラルポート設定値内から選択したうえで、予約済みポートとしました。 |



## エフェメラルポート設定確認及びPASV通信ポート予約

### 設定済みのエフェメラルポート範囲確認

```shell:command
# cat /proc/sys/net/ipv4/ip_local_port_range
32768   60999
```

### 使用ポート予約設定

```shell:command
# sysctl -a
# cat /etc/sysctl.d/01-vsftpd.conf
net.ipv4.ip_local_reserved_ports = 60021-60022
# sysctl --system
# sysctl -a
```



## firewalld設定

```shell:command
# firewall-cmd --list-all
# firewall-cmd --add-service=ftp --permanent
# firewall-cmd --add-port=60021-60022/tcp --permanent
# firewall-cmd --list-all --permanent
# firewall-cmd --reload
# firewall-cmd --list-all
```



## 備忘

ログ出力が日本語対応してない