インフラ環境の準備
クラウドプロバイダのコンソールにアクセスし、仮想サーバー(軽量アプリケーションサーバーまたはVPS)をプロビジョニングします。FTP接続に使用するドメイン名は、必要に応じて別途取得しサーバーに紐付けてください。
VSFTPDのインストールとサービス状態確認
システムのパッケージキャッシュを更新した上で、FTPサーバーソフトウェアであるVSFTPDをインストールします。
sudo apt update && sudo apt install vsftpd -y
インストールが完了すればデーモンは自動起動します。以下のコマンドを実行し、21ポートが正常にLISTEN状態にあるか確認してください。
sudo ss -tuln | grep :21
出力に該当ポートが表示されない場合は、システムサービスを手動で起動します。
sudo systemctl start vsftpd
FTP専用アカウントとディレクトリ構成
セキュリティ分離の観点から、FTP接続に使用する専用ユーザを作成し、ホームディレクトリを制限します。
まず、FTPデータ格納用のベースパスを生成します。
sudo mkdir -p /srv/ftp_storage
専用アカウントを追加します。初期状態ではログインシェルを標準のbashとして設定します。
sudo useradd -d /srv/ftp_storage -s /bin/bash ftp_user
パスワードを定義し、PAM設定ファイルを削除します(VSFTPDの独自認証フローと競合する可能性があるため)。
sudo passwd ftp_user
sudo rm -f /etc/pam.d/vsftpd
SSHや端末からの直接ログインを拒否するため、ログインシェルを `/usr/sbin/nologin` に変更します。
sudo usermod -s /usr/sbin/nologin ftp_user
設定ファイルの調整
設定ファイル `/etc/vsftpd.conf` を編集します。既存設定をバックアップしたのち、以下のパラメータ群を適用してください。
# TCP接続の制御
listen=YES
listen_ipv6=NO
# ユーザ制限とセキュリティ基盤
chroot_local_user=YES
allow_writeable_chroot=YES
seccomp_sandbox=NO
# 許可リストによるアクセス管理
userlist_deny=NO
userlist_enable=YES
userlist_file=/etc/vsftpd.allowed_list
# ファイル書き込み制御
write_enable=YES
# パッシブモード(データ接続用)
pasv_enable=YES
pasv_min_port=49000
pasv_max_port=49010
pasv_address=YOUR_PUBLIC_IP
pasv_addr_resolve=YES
pasv_promiscuous=YES
※ `pasv_address` には、クラウドコンソールで確認したサーバーのグローバルIPアドレスを記述してください。
許可リスト登録とファイル権限付与
設定で指定した `vsftpd.allowed_list` ファイルを作成し、先ほど作成したアカウントを登録します。
echo "ftp_user" | sudo tee /etc/vsftpd.allowed_list > /dev/null
sudo chmod 644 /etc/vsftpd.allowed_list
FTPデータディレクトリの所有権を移動し、公開用サブフォルダを作成して書き込み権限を付与します。
sudo chown ftp_user:ftp_user /srv/ftp_storage
sudo chmod 755 /srv/ftp_storage
sudo mkdir /srv/ftp_storage/upload_area
sudo chmod 777 /srv/ftp_storage/upload_area
設定を反映させるため、VSFTPDサービスを一時的に再起動します。
sudo systemctl restart vsftpd
ネットワークファイアウォールと接続検証
クラウドプロバイダのセキュリティグループまたはコンソール設定にて、TCP 21番ポートおよび設定したパッシブポート範囲(49000-49010)のインバウンド許可ルールを追加してください。準備が整ったら、FileZillaやWinSCPなどのFTPクライアントから認証接続を試行します。
接続障害の事例と対応策
不可ルート化アドレスの返却エラー
クライアントが「サーバーから返されたIPアドレスがルーティングできない」と報告する場合、リスニング設定が競合している可能性があります。以下の設定を確認し、IPv6リスニングを無効化してください。
listen=YES
listen_ipv6=NO
パッシブモード接続時のセキュリティ拒否(425エラー)
ディレクトリリスト取得時に `425 Security: Bad IP connecting` が発生する場合は、IP検証処理が厳格になっているためです。以下のパラメータが設定ファイルに正記されているか確認し、サービス再起動後に再テストしてください。
pasv_promiscuous=YES