FTP with vsftpd
Overview
- What you will learn: How to install and configure vsftpd (Very Secure FTP Daemon) on Ubuntu for secure file transfers. You will understand FTP active and passive modes, configure chroot jails for user isolation, enable TLS/SSL encryption, and set up virtual users backed by a PAM database.
- Prerequisites: Understanding of file sharing protocols (Lesson 34), basic Linux administration and firewall configuration
- Estimated reading time: 18 minutes
FTP Modes and vsftpd Installation
The File Transfer Protocol (FTP) uses two channels: a control channel (port 21) for commands and a data channel for file transfers. How the data channel is established differs between the two FTP modes.
In active mode, the client opens a random port and tells the server to connect back to it. This often fails when the client is behind a NAT firewall because the server cannot reach the client’s port. In passive mode, the server opens a random port from a configured range and tells the client to connect to it. Passive mode is strongly preferred in modern deployments because it works reliably through firewalls and NAT.
# Install vsftpd
$ sudo apt update
$ sudo apt install vsftpd
# Verify the service is running
$ sudo systemctl status vsftpd
# Backup the default configuration
$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
# Key FTP ports:
# Port 21: Control channel (commands)
# Port 20: Active mode data channel (server to client)
# Passive range: Data channel in passive mode (configurable)
# Active mode flow:
# 1. Client connects to server port 21
# 2. Client sends PORT command with its IP and random port
# 3. Server connects FROM port 20 TO client's specified port
# Passive mode flow:
# 1. Client connects to server port 21
# 2. Client sends PASV command
# 3. Server replies with its IP and a random port from pasv range
# 4. Client connects TO that server port for data transfer
Configuring vsftpd
The main configuration file is /etc/vsftpd.conf. vsftpd follows a security-first design — most features are disabled by default and must be explicitly enabled.
# /etc/vsftpd.conf — Production configuration
# Basic settings
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
xferlog_file=/var/log/vsftpd.log
connect_from_port_20=YES
# Chroot jail — confine users to their home directories
chroot_local_user=YES
allow_writeable_chroot=YES
# Or use a more secure approach:
# chroot_local_user=YES
# allow_writeable_chroot=NO
# local_root=/home/$USER/ftp
# Passive mode configuration
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
pasv_address=203.0.113.10
# User access control
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
# Connection limits
max_clients=50
max_per_ip=5
idle_session_timeout=300
data_connection_timeout=120
# Banner
ftpd_banner=Welcome to the secure FTP server.
The chroot_local_user=YES directive is critical for security — it confines each user to their home directory, preventing them from browsing the rest of the filesystem. The userlist_deny=NO setting inverts the user list logic, so only users explicitly listed in /etc/vsftpd.userlist are allowed to connect.
# Create the user list (only these users can connect)
$ sudo nano /etc/vsftpd.userlist
ftpuser1
ftpuser2
# Create an FTP user with proper directory structure
$ sudo useradd -m -s /usr/sbin/nologin ftpuser1
$ sudo passwd ftpuser1
# Secure chroot setup (home dir not writable, upload subdir writable)
$ sudo mkdir -p /home/ftpuser1/ftp/upload
$ sudo chown nobody:nogroup /home/ftpuser1/ftp
$ sudo chmod 555 /home/ftpuser1/ftp
$ sudo chown ftpuser1:ftpuser1 /home/ftpuser1/ftp/upload
# Allow nologin shell for FTP access
$ echo "/usr/sbin/nologin" | sudo tee -a /etc/shells
# Configure firewall for FTP
$ sudo ufw allow 21/tcp
$ sudo ufw allow 30000:31000/tcp
# Restart vsftpd
$ sudo systemctl restart vsftpd
# Test the connection
$ ftp localhost
# Or use a command-line client:
$ sudo apt install lftp
$ lftp -u ftpuser1 localhost
Enabling TLS/SSL Encryption
Plain FTP transmits credentials and data in clear text. Enabling TLS (FTPS — FTP over SSL/TLS) encrypts both the control and data channels, protecting sensitive information in transit.
# Generate a self-signed TLS certificate
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048
-keyout /etc/ssl/private/vsftpd.key
-out /etc/ssl/certs/vsftpd.crt
-subj "/C=US/ST=State/L=City/O=Org/CN=ftp.example.com"
# Add TLS settings to /etc/vsftpd.conf
$ sudo nano /etc/vsftpd.conf
# TLS/SSL configuration
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.crt
rsa_private_key_file=/etc/ssl/private/vsftpd.key
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
ssl_ciphers=HIGH
require_ssl_reuse=NO
# Restart vsftpd to apply TLS settings
$ sudo systemctl restart vsftpd
# Test TLS connection with lftp
$ lftp -u ftpuser1 -e "set ftp:ssl-force true; set ssl:verify-certificate no" localhost
# Test with curl
$ curl --ftp-ssl -u ftpuser1 ftp://localhost/
# Or with openssl for debugging:
$ openssl s_client -connect localhost:21 -starttls ftp
The force_local_data_ssl=YES and force_local_logins_ssl=YES settings are essential — they refuse unencrypted connections entirely. Setting ssl_sslv2=NO and ssl_sslv3=NO disables older, insecure protocol versions, leaving only TLS 1.x enabled. In production, use certificates from a trusted CA rather than self-signed certificates.
Virtual Users and Advanced Security
Virtual users exist only in a PAM database, not as real system accounts. This provides an additional layer of security because FTP users have no shell access and no system account to compromise.
# Install the PAM database utility
$ sudo apt install libpam-pwdfile apache2-utils
# Create a virtual user database
$ sudo htpasswd -c -d /etc/vsftpd/virtual_users.db vuser1
$ sudo htpasswd -d /etc/vsftpd/virtual_users.db vuser2
# Create a PAM service for vsftpd virtual users
$ sudo nano /etc/pam.d/vsftpd.virtual
auth required pam_pwdfile.so pwdfile=/etc/vsftpd/virtual_users.db
account required pam_permit.so
# Create a system user that maps to all virtual users
$ sudo useradd -d /home/vftp -s /usr/sbin/nologin vftp
$ sudo mkdir -p /home/vftp
# Create per-user configuration directories
$ sudo mkdir -p /etc/vsftpd/user_conf
$ sudo mkdir -p /srv/ftp/vuser1 /srv/ftp/vuser2
# Per-user config — /etc/vsftpd/user_conf/vuser1
local_root=/srv/ftp/vuser1
write_enable=YES
anon_world_readable_only=NO
# Add to vsftpd.conf for virtual user support
guest_enable=YES
guest_username=vftp
user_sub_token=$USER
local_root=/srv/ftp/$USER
virtual_use_local_privs=YES
pam_service_name=vsftpd.virtual
user_config_dir=/etc/vsftpd/user_conf
# Set permissions
$ sudo chown -R vftp:vftp /srv/ftp/
$ sudo chmod 755 /srv/ftp/vuser1 /srv/ftp/vuser2
# Monitoring and logging
$ sudo tail -f /var/log/vsftpd.log
# Check active FTP connections
$ sudo ss -tlnp | grep vsftpd
# Useful vsftpd log format setting
log_ftp_protocol=YES
xferlog_std_format=NO
# This enables detailed protocol logging for debugging
Key Takeaways
- FTP uses separate control (port 21) and data channels; passive mode is preferred over active mode because it works reliably through firewalls and NAT by having clients initiate all connections.
- vsftpd configuration in
/etc/vsftpd.conffollows a deny-by-default model; enablechroot_local_userto confine users to their home directories and useuserlist_enablewithuserlist_deny=NOfor a whitelist approach. - TLS encryption is mandatory for production FTP — enable
force_local_data_sslandforce_local_logins_sslto refuse unencrypted connections, and disable SSLv2/SSLv3 to prevent protocol downgrade attacks. - Virtual users backed by a PAM database provide superior security over system accounts — they have no shell access, no password entries in
/etc/shadow, and can be managed independently with per-user configuration files. - Configure passive port ranges (
pasv_min_port/pasv_max_port) and open them in the firewall; for servers behind NAT, setpasv_addressto the public IP so clients receive the correct connection address.
What’s Next
In the next lesson, you will learn how to deploy CUPS as a network print server, managing printers, print classes, and sharing configurations for both local and remote printing.
繁體中文
概述
- 學習內容:如何在 Ubuntu 上安裝和設定 vsftpd(Very Secure FTP Daemon)以實現安全的檔案傳輸。您將了解 FTP 主動和被動模式、設定 chroot 限制以隔離使用者、啟用 TLS/SSL 加密,以及設定由 PAM 資料庫支援的虛擬使用者。
- 先決條件:了解檔案共享協定(第 34 課)、基本 Linux 管理和防火牆設定
- 預計閱讀時間:18 分鐘
FTP 模式與 vsftpd 安裝
檔案傳輸協定(FTP)使用兩個通道:用於命令的控制通道(連接埠 21)和用於檔案傳輸的資料通道。資料通道的建立方式在兩種 FTP 模式之間有所不同。
在主動模式中,用戶端開啟一個隨機連接埠並告訴伺服器回連到該連接埠。當用戶端位於 NAT 防火牆後方時,這通常會失敗,因為伺服器無法到達用戶端的連接埠。在被動模式中,伺服器從設定的範圍中開啟一個隨機連接埠,並告訴用戶端連線到該連接埠。被動模式在現代部署中強烈建議使用,因為它能可靠地通過防火牆和 NAT。
# 安裝 vsftpd
$ sudo apt update
$ sudo apt install vsftpd
# 驗證服務正在執行
$ sudo systemctl status vsftpd
# 備份預設設定
$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
# 關鍵 FTP 連接埠:
# 連接埠 21: 控制通道(命令)
# 連接埠 20: 主動模式資料通道(伺服器到用戶端)
# 被動範圍: 被動模式的資料通道(可設定)
# 主動模式流程:
# 1. 用戶端連線到伺服器連接埠 21
# 2. 用戶端傳送 PORT 命令,包含其 IP 和隨機連接埠
# 3. 伺服器從連接埠 20 連線到用戶端指定的連接埠
# 被動模式流程:
# 1. 用戶端連線到伺服器連接埠 21
# 2. 用戶端傳送 PASV 命令
# 3. 伺服器回覆其 IP 和被動範圍中的隨機連接埠
# 4. 用戶端連線到該伺服器連接埠進行資料傳輸
設定 vsftpd
主要設定檔為 /etc/vsftpd.conf。vsftpd 遵循安全優先的設計 — 大多數功能預設為停用,必須明確啟用。
# /etc/vsftpd.conf — 生產環境設定
# 基本設定
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
xferlog_file=/var/log/vsftpd.log
connect_from_port_20=YES
# Chroot 限制 — 將使用者限制在其家目錄中
chroot_local_user=YES
allow_writeable_chroot=YES
# 被動模式設定
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
pasv_address=203.0.113.10
# 使用者存取控制
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
# 連線限制
max_clients=50
max_per_ip=5
idle_session_timeout=300
data_connection_timeout=120
chroot_local_user=YES 指令對安全性至關重要 — 它將每個使用者限制在其家目錄中,防止他們瀏覽檔案系統的其餘部分。userlist_deny=NO 設定反轉使用者清單邏輯,因此只有明確列在 /etc/vsftpd.userlist 中的使用者才能連線。
# 建立使用者清單(只有這些使用者可以連線)
$ sudo nano /etc/vsftpd.userlist
ftpuser1
ftpuser2
# 建立具有適當目錄結構的 FTP 使用者
$ sudo useradd -m -s /usr/sbin/nologin ftpuser1
$ sudo passwd ftpuser1
# 安全的 chroot 設定(家目錄不可寫,上傳子目錄可寫)
$ sudo mkdir -p /home/ftpuser1/ftp/upload
$ sudo chown nobody:nogroup /home/ftpuser1/ftp
$ sudo chmod 555 /home/ftpuser1/ftp
$ sudo chown ftpuser1:ftpuser1 /home/ftpuser1/ftp/upload
# 允許 nologin shell 進行 FTP 存取
$ echo "/usr/sbin/nologin" | sudo tee -a /etc/shells
# 設定 FTP 防火牆
$ sudo ufw allow 21/tcp
$ sudo ufw allow 30000:31000/tcp
# 重新啟動 vsftpd
$ sudo systemctl restart vsftpd
啟用 TLS/SSL 加密
純文字 FTP 以明文傳輸憑證和資料。啟用 TLS(FTPS — FTP over SSL/TLS)可以加密控制和資料通道,保護傳輸中的敏感資訊。
# 產生自簽名 TLS 憑證
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048
-keyout /etc/ssl/private/vsftpd.key
-out /etc/ssl/certs/vsftpd.crt
-subj "/C=US/ST=State/L=City/O=Org/CN=ftp.example.com"
# 將 TLS 設定加入 /etc/vsftpd.conf
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.crt
rsa_private_key_file=/etc/ssl/private/vsftpd.key
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
ssl_ciphers=HIGH
require_ssl_reuse=NO
# 重新啟動 vsftpd 以套用 TLS 設定
$ sudo systemctl restart vsftpd
# 使用 lftp 測試 TLS 連線
$ lftp -u ftpuser1 -e "set ftp:ssl-force true; set ssl:verify-certificate no" localhost
force_local_data_ssl=YES 和 force_local_logins_ssl=YES 設定至關重要 — 它們完全拒絕未加密的連線。設定 ssl_sslv2=NO 和 ssl_sslv3=NO 停用較舊、不安全的協定版本,僅保留 TLS 1.x 啟用。在生產環境中,使用來自受信任 CA 的憑證而非自簽名憑證。
虛擬使用者和進階安全性
虛擬使用者僅存在於 PAM 資料庫中,而非真正的系統帳戶。這提供了額外的安全層,因為 FTP 使用者沒有 shell 存取權限、在 /etc/shadow 中沒有密碼條目,並且可以透過每個使用者的設定檔獨立管理。
# 安裝 PAM 資料庫工具
$ sudo apt install libpam-pwdfile apache2-utils
# 建立虛擬使用者資料庫
$ sudo htpasswd -c -d /etc/vsftpd/virtual_users.db vuser1
$ sudo htpasswd -d /etc/vsftpd/virtual_users.db vuser2
# 為 vsftpd 虛擬使用者建立 PAM 服務
$ sudo nano /etc/pam.d/vsftpd.virtual
auth required pam_pwdfile.so pwdfile=/etc/vsftpd/virtual_users.db
account required pam_permit.so
# 建立映射到所有虛擬使用者的系統使用者
$ sudo useradd -d /home/vftp -s /usr/sbin/nologin vftp
$ sudo mkdir -p /home/vftp
# 建立每個使用者的設定目錄
$ sudo mkdir -p /etc/vsftpd/user_conf
$ sudo mkdir -p /srv/ftp/vuser1 /srv/ftp/vuser2
# 在 vsftpd.conf 中加入虛擬使用者支援
guest_enable=YES
guest_username=vftp
user_sub_token=$USER
local_root=/srv/ftp/$USER
virtual_use_local_privs=YES
pam_service_name=vsftpd.virtual
user_config_dir=/etc/vsftpd/user_conf
# 設定權限
$ sudo chown -R vftp:vftp /srv/ftp/
$ sudo chmod 755 /srv/ftp/vuser1 /srv/ftp/vuser2
# 監控和日誌
$ sudo tail -f /var/log/vsftpd.log
重點摘要
- FTP 使用獨立的控制通道(連接埠 21)和資料通道;被動模式優於主動模式,因為它讓用戶端發起所有連線,能可靠地通過防火牆和 NAT。
/etc/vsftpd.conf中的 vsftpd 設定遵循預設拒絕模型;啟用chroot_local_user將使用者限制在其家目錄中,並使用userlist_enable搭配userlist_deny=NO實現白名單方式。- TLS 加密對生產環境的 FTP 是必要的 — 啟用
force_local_data_ssl和force_local_logins_ssl拒絕未加密連線,並停用 SSLv2/SSLv3 以防止協定降級攻擊。 - 由 PAM 資料庫支援的虛擬使用者提供優於系統帳戶的安全性 — 它們沒有 shell 存取權限、在
/etc/shadow中沒有密碼條目,並且可以透過每個使用者的設定檔獨立管理。 - 設定被動連接埠範圍(
pasv_min_port/pasv_max_port)並在防火牆中開啟;對於 NAT 後方的伺服器,將pasv_address設為公開 IP,讓用戶端收到正確的連線位址。
下一步
在下一課中,您將學習如何部署 CUPS 作為網路列印伺服器,管理印表機、列印類別和共享設定,實現本機和遠端列印。
日本語
概要
- 学習内容:Ubuntu に vsftpd(Very Secure FTP Daemon)をインストール・設定して安全なファイル転送を実現する方法。FTP のアクティブモードとパッシブモード、ユーザー隔離のための chroot ジェイル設定、TLS/SSL 暗号化の有効化、PAM データベースによる仮想ユーザーの設定を学びます。
- 前提条件:ファイル共有プロトコルの理解(レッスン34)、基本的な Linux 管理とファイアウォール設定
- 推定読了時間:18分
FTP モードと vsftpd のインストール
ファイル転送プロトコル(FTP)は 2 つのチャネルを使用します:コマンド用の制御チャネル(ポート 21)とファイル転送用のデータチャネルです。データチャネルの確立方法は 2 つの FTP モードで異なります。
アクティブモードでは、クライアントがランダムなポートを開き、サーバーにそのポートへの接続を要求します。クライアントが NAT ファイアウォールの背後にある場合、サーバーがクライアントのポートに到達できないため、これはしばしば失敗します。パッシブモードでは、サーバーが設定された範囲からランダムなポートを開き、クライアントにそのポートへの接続を指示します。パッシブモードはファイアウォールと NAT を通じて確実に動作するため、現代の展開で強く推奨されます。
# vsftpd のインストール
$ sudo apt update
$ sudo apt install vsftpd
# サービスの稼働確認
$ sudo systemctl status vsftpd
# デフォルト設定のバックアップ
$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
# 主要な FTP ポート:
# ポート 21: 制御チャネル(コマンド)
# ポート 20: アクティブモードデータチャネル(サーバーからクライアント)
# パッシブ範囲: パッシブモードのデータチャネル(設定可能)
# アクティブモードのフロー:
# 1. クライアントがサーバーのポート 21 に接続
# 2. クライアントが PORT コマンドで自身の IP とランダムポートを送信
# 3. サーバーがポート 20 からクライアントの指定ポートに接続
# パッシブモードのフロー:
# 1. クライアントがサーバーのポート 21 に接続
# 2. クライアントが PASV コマンドを送信
# 3. サーバーが自身の IP とパッシブ範囲のランダムポートで応答
# 4. クライアントがそのサーバーポートに接続してデータ転送
vsftpd の設定
メインの設定ファイルは /etc/vsftpd.conf です。vsftpd はセキュリティファーストの設計に従い、ほとんどの機能はデフォルトで無効になっており、明示的に有効にする必要があります。
# /etc/vsftpd.conf — 本番環境設定
# 基本設定
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
xferlog_file=/var/log/vsftpd.log
connect_from_port_20=YES
# Chroot ジェイル — ユーザーをホームディレクトリに制限
chroot_local_user=YES
allow_writeable_chroot=YES
# パッシブモード設定
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
pasv_address=203.0.113.10
# ユーザーアクセス制御
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
# 接続制限
max_clients=50
max_per_ip=5
idle_session_timeout=300
data_connection_timeout=120
chroot_local_user=YES ディレクティブはセキュリティにとって不可欠です — 各ユーザーをホームディレクトリに制限し、ファイルシステムの他の部分を閲覧できないようにします。userlist_deny=NO 設定はユーザーリストのロジックを反転させ、/etc/vsftpd.userlist に明示的にリストされたユーザーのみが接続できるようにします。
# ユーザーリストの作成(これらのユーザーのみ接続可能)
$ sudo nano /etc/vsftpd.userlist
ftpuser1
ftpuser2
# 適切なディレクトリ構造を持つ FTP ユーザーの作成
$ sudo useradd -m -s /usr/sbin/nologin ftpuser1
$ sudo passwd ftpuser1
# 安全な chroot 設定(ホームディレクトリは書き込み不可、アップロードサブディレクトリは書き込み可能)
$ sudo mkdir -p /home/ftpuser1/ftp/upload
$ sudo chown nobody:nogroup /home/ftpuser1/ftp
$ sudo chmod 555 /home/ftpuser1/ftp
$ sudo chown ftpuser1:ftpuser1 /home/ftpuser1/ftp/upload
# nologin シェルでの FTP アクセスを許可
$ echo "/usr/sbin/nologin" | sudo tee -a /etc/shells
# FTP 用ファイアウォール設定
$ sudo ufw allow 21/tcp
$ sudo ufw allow 30000:31000/tcp
# vsftpd の再起動
$ sudo systemctl restart vsftpd
TLS/SSL 暗号化の有効化
プレーンテキスト FTP は資格情報とデータを平文で送信します。TLS(FTPS — FTP over SSL/TLS)を有効にすると、制御チャネルとデータチャネルの両方が暗号化され、転送中の機密情報が保護されます。
# 自己署名 TLS 証明書の生成
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048
-keyout /etc/ssl/private/vsftpd.key
-out /etc/ssl/certs/vsftpd.crt
-subj "/C=US/ST=State/L=City/O=Org/CN=ftp.example.com"
# /etc/vsftpd.conf に TLS 設定を追加
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.crt
rsa_private_key_file=/etc/ssl/private/vsftpd.key
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
ssl_ciphers=HIGH
require_ssl_reuse=NO
# TLS 設定を適用するため vsftpd を再起動
$ sudo systemctl restart vsftpd
# lftp で TLS 接続をテスト
$ lftp -u ftpuser1 -e "set ftp:ssl-force true; set ssl:verify-certificate no" localhost
force_local_data_ssl=YES と force_local_logins_ssl=YES の設定は不可欠です — 暗号化されていない接続を完全に拒否します。ssl_sslv2=NO と ssl_sslv3=NO を設定して古い安全でないプロトコルバージョンを無効にし、TLS 1.x のみを有効にします。本番環境では、自己署名証明書ではなく信頼された CA からの証明書を使用してください。
仮想ユーザーと高度なセキュリティ
仮想ユーザーは PAM データベースにのみ存在し、実際のシステムアカウントではありません。これにより追加のセキュリティ層が提供されます — FTP ユーザーはシェルアクセスを持たず、/etc/shadow にパスワードエントリがなく、ユーザーごとの設定ファイルで独立して管理できます。
# PAM データベースユーティリティのインストール
$ sudo apt install libpam-pwdfile apache2-utils
# 仮想ユーザーデータベースの作成
$ sudo htpasswd -c -d /etc/vsftpd/virtual_users.db vuser1
$ sudo htpasswd -d /etc/vsftpd/virtual_users.db vuser2
# vsftpd 仮想ユーザー用 PAM サービスの作成
$ sudo nano /etc/pam.d/vsftpd.virtual
auth required pam_pwdfile.so pwdfile=/etc/vsftpd/virtual_users.db
account required pam_permit.so
# すべての仮想ユーザーにマッピングされるシステムユーザーの作成
$ sudo useradd -d /home/vftp -s /usr/sbin/nologin vftp
$ sudo mkdir -p /home/vftp
# ユーザーごとの設定ディレクトリの作成
$ sudo mkdir -p /etc/vsftpd/user_conf
$ sudo mkdir -p /srv/ftp/vuser1 /srv/ftp/vuser2
# vsftpd.conf に仮想ユーザーサポートを追加
guest_enable=YES
guest_username=vftp
user_sub_token=$USER
local_root=/srv/ftp/$USER
virtual_use_local_privs=YES
pam_service_name=vsftpd.virtual
user_config_dir=/etc/vsftpd/user_conf
# 権限の設定
$ sudo chown -R vftp:vftp /srv/ftp/
$ sudo chmod 755 /srv/ftp/vuser1 /srv/ftp/vuser2
# 監視とログ
$ sudo tail -f /var/log/vsftpd.log
重要ポイント
- FTP は個別の制御チャネル(ポート 21)とデータチャネルを使用します。パッシブモードはクライアントがすべての接続を開始するため、ファイアウォールと NAT を通じて確実に動作し、アクティブモードより推奨されます。
/etc/vsftpd.confの vsftpd 設定はデフォルト拒否モデルに従います。chroot_local_userを有効にしてユーザーをホームディレクトリに制限し、userlist_enableとuserlist_deny=NOでホワイトリスト方式を使用します。- TLS 暗号化は本番 FTP に必須です —
force_local_data_sslとforce_local_logins_sslを有効にして暗号化されていない接続を拒否し、SSLv2/SSLv3 を無効にしてプロトコルダウングレード攻撃を防ぎます。 - PAM データベースによる仮想ユーザーはシステムアカウントより優れたセキュリティを提供します — シェルアクセスがなく、
/etc/shadowにパスワードエントリがなく、ユーザーごとの設定ファイルで独立して管理できます。 - パッシブポート範囲(
pasv_min_port/pasv_max_port)を設定してファイアウォールで開放します。NAT 背後のサーバーでは、pasv_addressをパブリック IP に設定し、クライアントが正しい接続アドレスを受け取るようにします。
次のステップ
次のレッスンでは、CUPS をネットワークプリントサーバーとして展開し、プリンター、プリントクラス、共有設定を管理して、ローカルおよびリモート印刷を実現する方法を学びます。