FTP Server
ファイル転送プロトコルサーバー。インターネット上でのファイル送受信の基本プロトコル。多様な実装(vsftpd、ProFTPD、Pure-FTPd等)が存在。
サーバー
FTP Server
概要
FTP(File Transfer Protocol)サーバーは、インターネット上でファイルの送受信を行うための基本的なプロトコルを実装したサーバーソフトウェアです。1971年に初版が公開された歴史あるプロトコルで、インターネット黎明期からの標準的なファイル転送手段として長く使用されています。vsftpd(Very Secure FTP Daemon)、ProFTPD、Pure-FTPdなど多様な実装が存在し、それぞれ異なる特徴と利用場面を持ちます。現在はセキュリティ面での制約からSFTPやHTTPSベースのファイル転送が推奨されることが多いですが、レガシーシステムとの互換性や特定の用途で継続的に利用されています。
詳細
FTP Server 2025年版は、セキュリティ強化と現代的な運用要件への対応が進化のポイントとなっています。従来のプレーンテキスト通信の課題を受け、FTPS(FTP over SSL/TLS)やSFTP(SSH File Transfer Protocol)との組み合わせによるセキュアな運用が標準化されています。vsftpdは軽量で高いセキュリティ機能を提供し、ProFTPDはApacheライクな設定ファイルにより柔軟なカスタマイズが可能、Pure-FTPdは5分で構築できる簡潔性を特徴としています。コンテナ化、自動化、CI/CDパイプラインでの活用など、現代的なDevOps環境での利用も継続されており、特定のワークフローや既存システムとの統合において重要な役割を果たしています。
主な特徴
- シンプルなプロトコル: 理解しやすく実装しやすい基本設計
- 多様な実装: vsftpd、ProFTPD、Pure-FTPdなど特徴の異なる選択肢
- 幅広い互換性: 古いクライアントから最新システムまで対応
- 柔軟な認証: 匿名アクセス、ユーザー認証、仮想ユーザー対応
- 転送再開機能: 大容量ファイルの中断・再開転送サポート
- 帯域制限: ネットワーク使用量の制御機能
メリット・デメリット
メリット
- インターネット黎明期からの実績による高い互換性と安定性
- シンプルなプロトコル設計により理解しやすく導入が容易
- 多くのプラットフォームとクライアントソフトウェアで標準サポート
- 軽量でリソース使用量が少なく低スペックサーバーでも動作
- レガシーシステムや組み込み機器での豊富な実装例
- ファイル転送に特化したシンプルで確実な動作
デメリット
- プレーンテキスト通信によるセキュリティリスク(パスワード盗聴等)
- NATファイアウォール環境でのPassiveモード設定の複雑さ
- 現代的なセキュリティ要件(多要素認証等)への対応不足
- SFTPやHTTPSに比べて機能面での制約
- 設定ミスによるセキュリティホールのリスク
- モダンなクラウド環境での利用には追加のセキュリティ対策が必要
参考ページ
書き方の例
vsftpd のインストールと基本設定
# Ubuntu/Debianでのインストール
sudo apt update
sudo apt install vsftpd
# CentOS/RHEL/Fedoraでのインストール
sudo dnf install vsftpd
# サービス状態確認
sudo systemctl status vsftpd
# サービス有効化・起動
sudo systemctl enable vsftpd
sudo systemctl start vsftpd
# 設定ファイルバックアップ
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
# 基本設定(/etc/vsftpd.conf)
sudo tee /etc/vsftpd.conf << 'EOF'
# 基本設定
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
# セキュリティ設定
chroot_local_user=YES
allow_writeable_chroot=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
# パッシブモード設定
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
pasv_address=your_server_ip
# ログ設定
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
# パフォーマンス設定
max_clients=50
max_per_ip=5
local_max_rate=1000000
EOF
ProFTPD のインストールと設定
# Ubuntu/Debianでのインストール
sudo apt install proftpd-basic
# CentOS/RHEL/Fedoraでのインストール
sudo dnf install proftpd
# 基本設定(/etc/proftpd/proftpd.conf)
sudo tee /etc/proftpd/proftpd.conf << 'EOF'
# 基本設定
Include /etc/proftpd/modules.conf
UseIPv6 off
IdentLookups off
ServerName "ProFTPD Server"
ServerType standalone
DeferWelcome off
# ポート設定
Port 21
# ユーザー・グループ設定
User proftpd
Group nogroup
MaxInstances 30
# セキュリティ設定
RootLogin off
RequireValidShell off
AuthUserFile /etc/proftpd/ftpd.passwd
AuthGroupFile /etc/proftpd/ftpd.group
DefaultRoot ~
# パッシブモード設定
PassivePorts 30000 31000
# ログ設定
SystemLog /var/log/proftpd/proftpd.log
TransferLog /var/log/proftpd/xferlog
# 制限設定
<Limit SITE_CHMOD>
DenyAll
</Limit>
# ディレクトリ設定
<Directory />
AllowOverwrite on
</Directory>
# 仮想ホスト例
<VirtualHost ftp.example.com>
ServerName "Example FTP Server"
DefaultRoot /srv/ftp
MaxClients 20
</VirtualHost>
EOF
# 仮想ユーザー作成
sudo ftpasswd --passwd --name=testuser --uid=1001 --gid=1001 \
--home=/srv/ftp/testuser --shell=/bin/false
Pure-FTPd のインストールと設定
# Ubuntu/Debianでのインストール
sudo apt install pure-ftpd
# CentOS/RHEL/Fedoraでのインストール
sudo dnf install pure-ftpd
# 基本設定(設定ファイルアプローチ)
sudo mkdir -p /etc/pure-ftpd/conf
# 各種設定項目
echo "21" | sudo tee /etc/pure-ftpd/conf/Bind
echo "50" | sudo tee /etc/pure-ftpd/conf/MaxClientsNumber
echo "8" | sudo tee /etc/pure-ftpd/conf/MaxClientsPerIP
echo "no" | sudo tee /etc/pure-ftpd/conf/AnonymousOnly
echo "no" | sudo tee /etc/pure-ftpd/conf/NoAnonymous
echo "yes" | sudo tee /etc/pure-ftpd/conf/ChrootEveryone
echo "yes" | sudo tee /etc/pure-ftpd/conf/CreateHomeDir
echo "30000 31000" | sudo tee /etc/pure-ftpd/conf/PassivePortRange
# 仮想ユーザー設定
echo "yes" | sudo tee /etc/pure-ftpd/conf/PureDB
sudo pure-pw useradd testuser -u 1001 -g 1001 -d /srv/ftp/testuser
sudo pure-pw mkdb
# TLS設定
echo "1" | sudo tee /etc/pure-ftpd/conf/TLS
# 証明書作成
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/pure-ftpd.pem \
-out /etc/ssl/private/pure-ftpd.pem \
-subj "/C=JP/ST=Tokyo/L=Tokyo/O=Example/CN=ftp.example.com"
sudo chmod 600 /etc/ssl/private/pure-ftpd.pem
セキュリティ強化設定
# vsftpd SSL/TLS設定
sudo tee -a /etc/vsftpd.conf << 'EOF'
# SSL/TLS設定
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.key
# 追加セキュリティ
hide_ids=YES
use_sendfile=YES
seccomp_sandbox=NO
isolate_network=YES
EOF
# 証明書作成(vsftpd用)
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/vsftpd.key \
-out /etc/ssl/certs/vsftpd.pem \
-subj "/C=JP/ST=Tokyo/L=Tokyo/O=Example/CN=ftp.example.com"
# ファイアウォール設定
sudo ufw allow 21/tcp
sudo ufw allow 30000:31000/tcp
# fail2ban設定(/etc/fail2ban/jail.local)
sudo tee -a /etc/fail2ban/jail.local << 'EOF'
[vsftpd]
enabled = true
port = ftp,ftp-data,ftps,ftps-data
filter = vsftpd
logpath = /var/log/vsftpd.log
maxretry = 3
bantime = 3600
[proftpd]
enabled = true
port = ftp,ftp-data,ftps,ftps-data
filter = proftpd
logpath = /var/log/proftpd/proftpd.log
maxretry = 3
bantime = 3600
EOF
sudo systemctl restart fail2ban
ユーザー管理と仮想ユーザー設定
# vsftpd仮想ユーザー設定
# 仮想ユーザーデータベース作成
sudo mkdir -p /etc/vsftpd/users
# ユーザーリストファイル作成
sudo tee /etc/vsftpd/virtual_users.txt << 'EOF'
user1
password1
user2
password2
EOF
# DB形式に変換
sudo db_load -T -t hash -f /etc/vsftpd/virtual_users.txt /etc/vsftpd/virtual_users.db
sudo chmod 600 /etc/vsftpd/virtual_users.db
# PAM設定(/etc/pam.d/vsftpd_virtual)
sudo tee /etc/pam.d/vsftpd_virtual << 'EOF'
auth required pam_userdb.so db=/etc/vsftpd/virtual_users
account required pam_userdb.so db=/etc/vsftpd/virtual_users
session required pam_loginuid.so
EOF
# vsftpd設定に追加
sudo tee -a /etc/vsftpd.conf << 'EOF'
# 仮想ユーザー設定
guest_enable=YES
guest_username=ftp
pam_service_name=vsftpd_virtual
user_config_dir=/etc/vsftpd/users
virtual_use_local_privs=YES
EOF
# 個別ユーザー設定例
sudo mkdir -p /etc/vsftpd/users
sudo tee /etc/vsftpd/users/user1 << 'EOF'
local_root=/srv/ftp/user1
write_enable=YES
download_enable=YES
max_rate=500000
EOF
# FTPユーザー用ディレクトリ作成
sudo mkdir -p /srv/ftp/{user1,user2}
sudo chown ftp:ftp /srv/ftp/user*
高度な設定とパフォーマンスチューニング
# 高パフォーマンス設定(vsftpd)
sudo tee -a /etc/vsftpd.conf << 'EOF'
# パフォーマンス設定
tcp_wrappers=YES
use_sendfile=YES
connect_timeout=60
data_connection_timeout=300
idle_session_timeout=600
accept_timeout=60
# 同時接続制限
max_clients=100
max_per_ip=10
local_max_rate=2000000
anon_max_rate=1000000
# 帯域制限(バイト/秒)
local_max_rate=0 # 無制限
anon_max_rate=100000 # 100KB/s制限
EOF
# システム制限設定
sudo tee -a /etc/security/limits.conf << 'EOF'
ftp soft nofile 65536
ftp hard nofile 65536
ftp soft nproc 32768
ftp hard nproc 32768
EOF
# カーネルパラメータ調整
sudo tee -a /etc/sysctl.conf << 'EOF'
# FTP パフォーマンス向上
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_congestion_control = bbr
EOF
sudo sysctl -p
モニタリングとログ管理
# ログ監視スクリプト
cat > /usr/local/bin/ftp-monitor << 'EOF'
#!/bin/bash
# FTP監視スクリプト
echo "=== FTP Server Status $(date) ==="
systemctl is-active vsftpd
echo
echo "=== Active Connections ==="
netstat -an | grep :21
echo
echo "=== Recent Transfers ==="
tail -20 /var/log/vsftpd.log | grep -E "(UPLOAD|DOWNLOAD)"
echo
echo "=== Failed Login Attempts ==="
tail -50 /var/log/auth.log | grep vsftpd | grep -i fail
echo
echo "=== Disk Usage ==="
df -h /srv/ftp
echo
EOF
chmod +x /usr/local/bin/ftp-monitor
# ログローテーション設定(/etc/logrotate.d/vsftpd)
sudo tee /etc/logrotate.d/vsftpd << 'EOF'
/var/log/vsftpd.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
copytruncate
}
EOF
# リアルタイム監視
sudo tail -f /var/log/vsftpd.log
# 接続統計取得
sudo netstat -an | grep :21 | wc -l # アクティブ接続数
# 転送統計
grep "$(date '+%Y %m %d')" /var/log/vsftpd.log | grep UPLOAD | wc -l
grep "$(date '+%Y %m %d')" /var/log/vsftpd.log | grep DOWNLOAD | wc -l
自動化とバックアップ
# 自動バックアップスクリプト
cat > /etc/cron.daily/ftp-backup << 'EOF'
#!/bin/bash
# FTP設定・データバックアップ
BACKUP_DIR="/backup/ftp/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# 設定ファイルバックアップ
cp /etc/vsftpd.conf $BACKUP_DIR/
cp -r /etc/vsftpd/ $BACKUP_DIR/vsftpd-config/
cp /etc/pure-ftpd/ $BACKUP_DIR/pure-ftpd-config/ 2>/dev/null || true
# ユーザーデータバックアップ
tar -czf $BACKUP_DIR/ftp-data.tar.gz /srv/ftp/
# ログバックアップ
cp /var/log/vsftpd.log $BACKUP_DIR/
cp /var/log/proftpd/ $BACKUP_DIR/proftpd-logs/ 2>/dev/null || true
# 古いバックアップ削除(30日保持)
find /backup/ftp/ -type d -mtime +30 -exec rm -rf {} \;
echo "FTP backup completed: $BACKUP_DIR"
EOF
chmod +x /etc/cron.daily/ftp-backup
# 設定検証スクリプト
cat > /usr/local/bin/ftp-validate << 'EOF'
#!/bin/bash
# FTP設定検証
echo "=== FTP Configuration Validation ==="
# vsftpd設定チェック
if [ -f /etc/vsftpd.conf ]; then
echo "Checking vsftpd configuration..."
vsftpd -olisten=NO /etc/vsftpd.conf
echo "vsftpd config: OK"
fi
# ポートチェック
echo "Checking FTP ports..."
netstat -tlnp | grep :21 && echo "FTP port 21: OK" || echo "FTP port 21: NOT LISTENING"
# SSL証明書チェック
if [ -f /etc/ssl/certs/vsftpd.pem ]; then
echo "Checking SSL certificate..."
openssl x509 -in /etc/ssl/certs/vsftpd.pem -text -noout | grep "Not After"
fi
# ディスク容量チェック
echo "Checking disk space..."
df -h /srv/ftp
echo "Validation completed."
EOF
chmod +x /usr/local/bin/ftp-validate