Mục tiêu chương
Nắm vững kỹ năng cài đặt và cấu hình FTP Server với vsftpd
Cài đặt vsftpd
Cài đặt gói vsftpd trên Fedora/RHEL và Ubuntu, khởi động service, kiểm tra trạng thái và port 21 đang lắng nghe.
vsftpd.conf
Cấu hình /etc/vsftpd/vsftpd.conf: anonymous_enable, local_enable, write_enable, chroot_local_user và các tùy chọn bảo mật.
Anonymous FTP
Cấu hình truy cập anonymous, thư mục /var/ftp, quyền upload/download và giới hạn tốc độ cho người dùng ẩn danh.
Local User FTP
Cho phép local users đăng nhập FTP, chroot vào home directory, quản lý danh sách users trong ftpusers và user_list.
Firewall cho FTP
Mở port 21 (control) và port 20 (data), cấu hình passive FTP ports, load module nf_conntrack_ftp cho connection tracking.
SELinux cho vsftpd
Cấu hình SELinux file contexts (public_content_t, public_content_rw_t) và Booleans cho phép FTP hoạt động trong chế độ enforcing.
Lý thuyết
Cài đặt và khởi động vsftpd
vsftpd (Very Secure FTP Daemon) là FTP server được khuyến nghị trên Linux. Daemon lắng nghe trên TCP port 21. Data được truyền qua TCP port 20 (active) hoặc high ports (passive).
# Fedora / RHEL
$ sudo dnf install vsftpd
Installed: vsftpd-3.0.5-6.fc42.x86_64
# Ubuntu / Debian
$ sudo apt-get install vsftpd
# Kiểm tra trạng thái ban đầu
$ sudo systemctl status vsftpd.service
vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (disabled; preset:disabled)
Active: inactive (dead)
# Start và enable vsftpd
$ sudo systemctl start vsftpd.service
$ sudo systemctl enable vsftpd.service
Created symlink .../vsftpd.service -> /usr/lib/systemd/system/vsftpd.service
# Kiểm tra port 21 đang lắng nghe
$ sudo ss -tupln | grep vsftpd
tcp6 0 :::21 :::* LISTEN 19260/vsftpd
File cấu hình vsftpd.conf
File cấu hình chính: /etc/vsftpd/vsftpd.conf (RHEL/Fedora) hoặc /etc/vsftpd.conf (Ubuntu). Các file liên quan: ftpusers và user_list (danh sách users bị cấm).
# Bật anonymous FTP (mặc định YES)
anonymous_enable=YES
# Cho phép local system users đăng nhập
local_enable=YES
# Cho phép ghi (upload)
write_enable=YES
# Chroot local users vào home dir của họ
chroot_local_user=YES
allow_writeable_chroot=YES
# Anonymous upload (cần thêm SELinux Boolean)
anon_upload_enable=NO
anon_mkdir_write_enable=NO
# Log transfers
xferlog_enable=YES
xferlog_file=/var/log/xferlog
# Passive FTP port range
pasv_min_port=40000
pasv_max_port=50000
# Banner message
ftpd_banner=Welcome to HTG FTP Service.
# User list control
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
userlist_deny=YES
Anonymous FTP
Anonymous users kết nối với username anonymous hoặc ftp, không cần mật khẩu. Thư mục gốc của anonymous user là /var/ftp. Files ở đây phải có SELinux context public_content_t.
# Cài FTP client để test
$ sudo dnf install ftp
# Tạo file test
$ echo "Hello FTP Server" > /tmp/hello.txt
# Kết nối FTP với local user
$ ftp localhost
Trying ::1...
Connected to localhost (::1).
220 (vsFTPd 3.0.5)
Name (localhost:chris): chris
331 Please specify the password.
Password: ****
230 Login successful.
ftp> cd /tmp
250 Directory successfully changed.
ftp> get hello.txt
229 Entering Extended Passive Mode (|||59605|)
150 Opening BINARY mode data connection for hello.txt (17 bytes).
226 Transfer complete.
ftp> exit
221 Goodbye.
Firewall và SELinux cho vsftpd
Để FTP server truy cập từ mạng ngoài, cần mở firewall và cấu hình SELinux. Module nf_conntrack_ftp cần thiết cho passive FTP connection tracking.
# Mở firewall cho FTP
$ sudo firewall-cmd --permanent --add-service=ftp
success
$ sudo firewall-cmd --permanent --add-port=40000-50000/tcp
success
$ sudo firewall-cmd --reload
# Kiểm tra SELinux mode
$ getenforce
Enforcing
# Set SELinux context cho thư mục FTP
$ sudo semanage fcontext -a -t public_content_t "/var/ftp/pub(/.*)?"
$ sudo restorecon -Rv /var/ftp/pub
Relabeled /var/ftp/pub from var_t to public_content_t
# SELinux Booleans cho vsftpd
# Cho phép local users đăng nhập FTP
$ sudo setsebool -P ftp_home_dir on
# Cho phép anonymous write
$ sudo setsebool -P ftpd_anon_write on
# Cho phép FTP dùng NFS share
$ sudo setsebool -P allow_ftpd_use_nfs on
Lab Thực Hành
Kịch bản: Cài đặt vsftpd, cấu hình anonymous FTP read-only và local user FTP với chroot
Cài đặt và khởi động vsftpd
$ sudo dnf install -y vsftpd ftp
Installed: vsftpd-3.0.5-6.fc42.x86_64
$ sudo systemctl enable --now vsftpd
$ sudo ss -tupln | grep vsftpd
tcp6 0 :::21 :::* LISTEN 19260/vsftpd
Cấu hình anonymous FTP read-only
$ sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
$ sudo nano /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_upload_enable=NO
local_enable=YES
write_enable=YES
xferlog_enable=YES
$ sudo systemctl restart vsftpd
Tạo nội dung cho anonymous FTP
$ sudo mkdir -p /var/ftp/pub
$ echo "Public file for download" | sudo tee /var/ftp/pub/readme.txt
# Set SELinux context cho nội dung public
$ sudo semanage fcontext -a -t public_content_t "/var/ftp/pub(/.*)?"
$ sudo restorecon -Rv /var/ftp/pub
Relabeled /var/ftp/pub/readme.txt
$ ls -Z /var/ftp/pub/
system_u:object_r:public_content_t:s0 readme.txt
Mở firewall cho FTP
$ sudo firewall-cmd --permanent --add-service=ftp
success
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-services | grep ftp
ftp ssh cockpit
Test kết nối FTP anonymous
$ ftp localhost
220 Welcome to HTG FTP Service.
Name (localhost:user): anonymous
331 Please specify the password.
Password: [Enter hoặc email bất kỳ]
230 Login successful.
ftp> cd pub
250 Directory successfully changed.
ftp> ls
-rw-r--r-- 1 root root 25 Jan 15 10:30 readme.txt
ftp> get readme.txt
226 Transfer complete. 25 bytes received.
ftp> quit
Cấu hình chroot cho local users
chroot_local_user=YES
allow_writeable_chroot=YES
$ sudo systemctl restart vsftpd
# Xem log transfer
$ sudo tail -f /var/log/xferlog
Wed Jan 15 10:35:00 2025 1 ::1 25 /readme.txt b _ i a anonymous ftp 0 * c
Câu hỏi ôn tập
vsftpd lắng nghe trên port nào? Sự khác nhau giữa active và passive FTP?
vsftpd lắng nghe trên TCP port 21 (control connection). Active FTP: server kết nối ngược lại client qua port 20. Passive FTP: server mở high port và client kết nối vào, thân thiện với firewall hơn. Cần module nf_conntrack_ftp cho passive FTP.
File cấu hình vsftpd.conf nằm ở đâu? Các file liên quan khác có tác dụng gì?
- /etc/vsftpd/vsftpd.conf: file cấu hình chính
- /etc/vsftpd/ftpusers: users không được phép đăng nhập FTP (root, bin, daemon,...)
- /etc/vsftpd/user_list: danh sách users bị cấm/được phép (tuỳ userlist_deny)
- /etc/pam.d/vsftpd: cấu hình xác thực PAM
Directive nào trong vsftpd.conf cho phép local users đăng nhập? Và cho phép upload?
local_enable=YES — cho phép local system users đăng nhập FTP. write_enable=YES — cho phép lệnh ghi (STOR, DELE, RNFR, RNTO, MKD, RMD). Cả hai cần YES để local user có thể upload files.
chroot_local_user=YES có tác dụng gì và tại sao quan trọng về bảo mật?
Khi chroot_local_user=YES, local users bị "nhốt" (chroot) vào home directory của họ, không thể duyệt lên các thư mục khác trên hệ thống (/etc, /var, v.v.). Điều này ngăn users vô tình hoặc cố ý xem file nhạy cảm của hệ thống.
SELinux file context nào cần thiết cho nội dung FTP? Lệnh nào set context?
- public_content_t: cho files được phép download qua FTP
- public_content_rw_t: cho thư mục cho phép anonymous upload
Lệnh: semanage fcontext -a -t public_content_t "/var/ftp/pub(/.*)?" rồi restorecon -Rv /var/ftp/pub
Log file FTP transfers nằm ở đâu? Xem log realtime bằng lệnh gì?
Log file transfer: /var/log/xferlog (định dạng xferlog chuẩn). Xem realtime: sudo tail -f /var/log/xferlog. Cần xferlog_enable=YES trong vsftpd.conf để ghi log.
Tại sao browsers hiện đại không dùng được để test FTP server? Giải pháp thay thế?
Firefox và Chrome đã ngừng hỗ trợ giao thức FTP vì lý do bảo mật. Giải pháp: dùng command-line client ftp, hoặc curl ftp://localhost/pub/, hoặc wget ftp://localhost/pub/readme.txt. Cũng có thể dùng GUI client như FileZilla.
Lệnh nào kiểm tra vsftpd đang chạy và port đang lắng nghe?
sudo systemctl status vsftpd — xem trạng thái service. sudo ss -tupln | grep vsftpd — xem port 21 đang lắng nghe. Output mẫu: tcp6 0 :::21 :::* LISTEN 19260/vsftpd