Có khá nhiều FTP server có thể chạy trên RPi, khác nhau về sự gọn nhẹ, hiệu quả, bảo mật và tính năng phong phú. Có thể kế đến các FTP server thường dùng như ftpd, tftpd, proftpd, pure-ftpd, vsftpd, wu-ftpd…
vsftpd gọn nhẹ, hiệu quả, cấu hình đơn giản… đủ dùng cho nhu cầu truyền/nhận file trên RPi.
Cài đặt
apt-get install vsftp
vsftpd cài đặt xong là chạy ngay. Chúng ta dừng vsftpd để cấu hình
/etc/init.d/vsftpd stop
Cấu hình vsftpd bằng cách thay đổi các tham số trong /etc/vsftpd.conf
Cấu hình chung
Cho phép vsftpd chạy standalone
listen=YES
Dùng địa chỉ IPv4
listen_ipv6=NO
Truy cập vô danh
Mặc định là không được phép truy cập vô danh. Cho phép truy cập vô danh bằng cách đặt
anonymous_enable=YES
Kiểm soát user truy cập FPT server
Mặc định, user Linux có thư mục home, có mật khẩu đều có thể truy cập FTP server. Chúng ta có thể cho phép local user được ghi vào FTP server
write_enable=YES
Có thể chỉ định một danh sách user được phép truy cập FTP server, bằng cách đặt
userlist_enable=YES userlist_file=/etc/vsftpd.userlist userlist_deny=NO
Sau đó tạo file /etc/vsftpd.userlist với mỗi dòng là một tên user được cho phép truy cập FTP server
Hoặc dùng firewall iptables để chặn các user không phải cùng mạng với FTP server (giả sử là 192.168.x.y)
sudo iptables -A INPUT ! --src 192.168.0.0/24 -p tcp --dport 21 -j DROP
Cô lập user
Đặt
chroot_local_user=YES
để chỉ định thư mục FTP gốc của user là thư mục home của họ. Tuy nhiên user có thể dùng ssh, getty… để truy cập đến toàn bộ hệ thống, vì vậy cần vô hiệu hóa shell của user.
usermod -s /bin/false echo /bin/false >> /etc/shells
hay dùng tham số
check_shell=NO
Ngoài ra, cũng có thể đặt thư mục FTP gốc chung cho nhiều user
chroot_list_enable=YES
local_root=/FTP/ROOT/FOLDER
Sau đó tạo file /etc/vsftpd.chroot_list với mỗi dòng là một tên user được dùng thư mục trên như là gốc
SSL
Để tăng cường bảo mật, sử dụng ftps thay cho ftp. Chứng chỉ SSL có thể tự cấp bằng câu lệnh
sudo openssl req -x509 -days 365 -newkey rsa:2048 -nodes -keyout /etc/ssl/private/vsftpd.key -out /etc/ssl/vsftpd.crt
hay dùng chứng chỉ do Let’s Encrypt cấp.
Thêm vào /etc/vsftpd.conf để cấu hình SSL
# enable TLS/SSL ssl_enable=YES # force client to use TLS when logging in allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES ssl_tlsv1=YES ssl_sslv2=NO ssl_sslv3=NO require_ssl_reuse=NO ssl_ciphers=HIGH # specify SSL certificate/private key (Debian/Ubuntu) # For CentOS/Fedora/RHEL, replace it with /etc/vsftpd/vsftpd.pem rsa_cert_file=/etc/ssl/vsftpd.crt rsa_private_key_file=/etc/ssl/private/vsftpd.key #Let's Encrypt certificate #rsa_cert_file=/etc/letsencrypt/live/your-domain/cert.pem #rsa_private_key_file=/etc/letsencrypt/live/your-domain/privkey.pem # define port range for passive mode connections pasv_max_port=10110 pasv_min_port=10100
Nếu chúng ta đặt
force_local_data_ssl=NO force_local_logins_ssl=NO
thì có thể kết nối với FTP server bằng ftp hay ftps tùy khả năng của FTP client.
Các chứng chỉ SSL như trên là tự cấp. Nếu dùng chứng chỉ của Let’s Encrypt thì khai báo
rsa_cert_file=/etc/letsencrypt/live/your_domain/cert.pem rsa_private_key_file=/etc/letsencrypt/live/your_domain/privkey.pem
Khởi động lại vsftpd bằng câu lệnh
/etc/init.d/vsftpd restart
Đến đây, ftps vẫn có thể chưa chịu chạy nếu RPi có firewall. Dùng các câu lệnh sau đây để mở port nếu firewall là iptables
iptables -I INPUT -p tcp --dport 20 -j ACCEPT iptables -I INPUT -p tcp --dport 21 -j ACCEPT iptables -I INPUT -p tcp --dport 10100:10110 -j ACCEPT # ufw ufw allow 20/tcp ufw allow 21/tcp sudo ufw allow from any to any proto tcp port 10100:10110
Test ftps
- FileZilla là một trình FTP client hỗ trợ SSL/TLS, chúng ta dùng để test vsftpd
Thiết lập kết nối tời RPi như trong hình
Bấm Connect sẽ kết nối với RPi.
- curl
curl -1 -k -v --disable-epsv --ftp-skip-pasv-ip --ftp-ssl -T /tmp/test-file ftp://usr:pwd@ftp-ip
Chú thích
- Đôi khi phải thêm user vào nhóm ftp,để có thể truy cập vào thư mục của ftp
usermod -a -G ftp userId
- Ghi sai đường dẫn của các file certificate có thể khiến vsftpd hoat động không chính xác.
- Vì lý do bảo mật, ftp server không cho phép thư mục FTP root của user có thuộc tính write (by others). Thư mục này có thể là home của user hay thư mục FTP root dùng chung. Nếu không có thuộc tính ghi (by others) thì FTP user không thể thực hiện bất cứ câu lệnh nào ghi lên FTP root, như upload file, tạo thư mục… qua giao thức ftp
- Thêm option này vào /etc/vsftpd.conf để có thể ghi lên FTP root (có tác dụng với giao thức ftp)
allow_writeable_chroot=YES