Bài trước mình đã cùng các bạn tìm hiểu cách hoạt động của FTP và các mode của nó khá chi tiết rồi. Trong bài này mình hướng dẫn các bạn cài đặt FTP Server và cấu hình FTP hoàn chỉnh.
Hiện tại có rất nhiều phần mềm có thể cài làm FPT Server được. Trong bài mình sử dụng vsFTPD – Very Secure FTP Daemon đây là phần mềm FTP tốt nhất hiện nay, tốc độ nhanh cấu hình đơn giản. Bạn nào không thích có thể chuyển qua dùng ProFTPD hoặc Pure-FTPD cũng tốt cả.
Mình sử dụng VPS ở Vultr, nội dung bài áp dụng cho cả Linux CentOS 7/Ubuntu 16.04 và các bản cũ hơn.
Bạn có thể dùng VPS của Linode hoặc DigitalOcean đều được cả : Danh sách nhà cung cấp VPS uy tín.
1. Cài đặt vsFTPD
Lệnh cài đặt vsFTPD
CentOS 7
yum install vsftpd
Ubuntu 16.04
apt-get install vsftpd
Khởi động vsftpd
systemctl start vsftpd
Cho phép tự chạy vsftpd khi khởi động hệ điều hành
systemctl enable vsftpd
Kiểm tra sợ bộ xem vsftpd hoạt động hay chưa, chạy lệnh.
telnet localhost 21
Kết quả như trên là thành công, không cài telnet bạn dùng lệnh netstat -tulpn
cũng được thấy đang listen trên Port 21 là ok.
2. Cấu hình vsftpd trên CentOS 7
Giờ chúng ta mở file config vsftpd ra thay đổi một số thông số cho phù hợp. Mặc định file config vsftpd nằm trong /etc/vsftpd/vsftpd.conf
. Trước khi thay đổi thông số nào bạn nhớ copy một bản backup để có vấn đề gì còn phục hồi lại.
Mở file cấu hình.
vi /etc/vsftpd/vsftpd.conf
Trước tiên chúng ta disable anonymous user đi, đây là user nặc danh mặc định nó có quyền truy cập FTP Server mà không cần mật khẩu.
anonymous_enable=NO
Tiếp theo là khai báo local_enable để cho phép hay không cho phép local user truy cập FTP Server. vsFTPD có thể được cấu hình dùng user của hệ điều hành(Local User) hoặc dùng user ảo (Virtual User) giữa hai loại tài khoản này có sự khác nhau về sự linh hoạt và vấn đề bảo mật. Trong bài này chúng ta sẽ dùng Local User, còn Virtual User xin để dịp khác.
Khi dùng Local User, VsFTPD sẽ sử dụng tài khoàn trong /etc/passwd
, bạn chọn YES cho khai báo này.
local_enable=YES
Đến write_enable nếu chọn Yes thì local user mới upload, delete file được đồng nghĩa với việc user có thể dùng các FTP Command bao gồm STOR, DELE, RNFR, RNTO, MKD, RMD, APPE and SITE. Xem ý nghĩa và command khác tại đây.
Chỉ muốn local user download file thì bạn để NO, còn mình chọn YES.
write_enable=YES
Khai báo listen, mặc định vsftpd dùng IPv6, để dùng IPv4 bạn chọn Yes
listen=YES
Không dùng IPv6
listen_ipv6=NO
Cấu hình vsftpd cơ bản như thế cũng xài được rồi, bây giờ bạn có thể tạo local user rồi dùng Firezilla login vào FTP Server là sử dụng được ngay.
3. Cấu hình vsftpd trên Ubuntu 16.04
File cấu hình vsftpd trên Ubuntu có đường dẫn.
/etc/vsftpd.conf
Tất cả các thông số trên CentOS bạn bê nguyên sang Ubuntu cho mình, nhưng ftp chưa chạy được đâu nhé.
Thực chất phần này thiên về fix lỗi vsftpd trên Ubuntu hơn là cấu hình. Có một thông số bạn cần chú ý:
pam_service_name=vsftpd
Với giá trị mặc định như trên, vsftpd sẽ gọi đến file /etc/pam.d/vsftpd
là file PAM xác thực cho dịch vụ vsftpd. Mở file ra bạn thấy như bên dưới.
Bạn nhìn chỗ khoanh đỏ, pam_shells.so là nguồn cơn của lỗi. Nếu dùng Filezilla thử login vào FTP Server bạn sẽ thấy thông báo:
Response: 331 Please specify the password. Command: PASS ****** Response: 530 Login incorrect. Error: Critical error: Could not connect to server
Nguyên nhân do pam_shells.so khi chạy sẽ sử dụng Shell (/bin/bash, /bin/sh…) của Local User, mà Ubuntu không tự tạo shell khi tạo user. Để sửa lỗi bạn phải tạo shell cho user thôi.
Lệnh:
useradd -d /home/user1 -s /bin/bash user1
Giờ thì FTP Server của bạn đã hoạt động được rồi.
4. Bảo mật FTP Server
Cấu hình thêm một chút cho an toàn, để cấu hình bảo mật cho FTP Server bạn thêm cho mình hai dòng bên dưới, đây là cách chroot FPT rất cần thiết với máy chủ có nhiều user. Mục đích là đảm bảo mỗi user được tạo ra sẽ bị giới hạn truy cập trong Home Directory của nó, không thể view hoặc access vào bất kỳ thư mục nào khác.
chroot_local_user=YES # kích hoạt tính năng chroot cho local user. allow_writeable_chroot=YES # Phải có dòng này chroot mới hoạt động chuẩn được nhé.
Tiếp theo là userlist_enable, cái này quan trọng không kém. Nếu được gán giá trị YES thì tất cả các user được liệt kê trong file /etc/vsftpd/user_list
sẽ không thể access vào FTP Server được. Tất cả các user trong user_list đều là những tài khoản quan trọng dùng để vận hành máy chủ, tốt nhất không dùng cho FTP thì hơn. Nếu giá trị là NO thì ngược lại, toàn bộ những user trong user_list sẽ truy cập được FTP Server.
Mình chọn YES.
userlist_enable=YES
Khi chroot user đồng nghĩa với việc user không truy cập được vào đâu ngoài thư mục của mình. Nhưng trong quá trình sử dụng nhiều khi bạn lại muốn tạo ra một ngoại lệ (exception) để một user nào đó có thể đi vào tất cả các thư mục ngó nghiêng linh tinh một tí thì làm thế nào ?
Để làm được điều đó, bạn thêm vào hai dòng bên dưới.
chroot_list_enable=YES # Dòng này vô hiệu hóa Chroot. chroot_list_file=/etc/vsftpd/chroot_list # Dòng này tạo ra một file chứa danh sách các local user không bị giới hạn bởi chroot.
Bạn có thể dùng vi tạo file có tên là chroot_list
với đường dẫn như trên rồi thêm mỗi user vào một dòng.
Chú ý nếu gặp lỗi 500 OOPS: vsftpd: refusing to run with writable root inside chroot() bạn kiểm tra lại giá trị allow_writeable_chroot cho mình.
Cấu hình như trên là khá ổn rồi, bạn lưu lại file config vsftp ấn :wq
để thoát trình soạn thảo vi.
5. Tạo tài khoản FTP
Cấu hình hoạt động và bảo mật FTP đã ok, để cho linh hoạt khi sử dụng FTP trên linux mình hướng dẫn thêm cách tạo user FTP.
Theo mặc định Local User được tạo ra trên linux có Home Directory là /home/user
. Tất cả dữ liệu user upload/download đều nằm trong thư mục /home/user cả.
Nhưng giờ mình không muốn dùng mặc định, muốn gom tất cả vào đường dẫn /var/ftp/user
thì làm thế nào ?
Bước 1 – Tạo Home Directory
Ví dụ mình sẽ tạo user1 có home directory là /var/ftp/user1
, chạy lệnh:
mkdir /var/ftp/user1
Bước 2 – Tạo User
CentOS 7
useradd -d /var/ftp/user1 -s /sbin/nologin user1
Ubuntu 16.04
useradd -d /var/ftp/user1 -s /usr/sbin/nologin user1
Ý nghĩa thông số:
-d
Thay đổi Home Directory sang /var/ftp/user1 , nếu không user tạo ra sẽ dùng có Home Directory mặc định là /home/user1.-s
Tạo Shell cho user1 không cho login vào server. Bạn nên dùng shellnologin
thay cho /bin/bash, /bin/sh như đã nói ở mục lục 3. Không chỉ FTP đâu mất tất cả user tạo cho dịch vụ POP3, SMTP bạn cũng nên dùng nologin để bảo mật hệ thống.
Chú ý: nếu một user2 được tạo ra trước đó sử dụng Home Directory mặc định, bạn có thể thay đổi bằng lệnh sau.
usermod -d /var/ftp/user2
Bước 3 – Thay đổi quyền sở hữu Home Directory
Thư mục tạo ra mặc định root:root quản lý, bạn phải chown lại cho thư mục.
chown user1:user1 -R /var/ftp/user1
6. Firewall và SELinux
Bạn kiểm tra lại Firewall và SELinux xem đã disable chưa, hầu hết các đơn vị cung cấp VPS đều disable theo mặc định rồi.
Tham khảo: Lỗi cơ bản trên linux.
Mình dùng VPS thì có thằng Vultr là không disable Firewall theo mặc định, không muốn disable thì bạn phải allow port cho FTP Server nhé, không lại kêu cấu hình đúng mà không chạy. Xen cách mở port trên một số firewall hay dùng.
Trên CentOS 7, mặc định dùng Firewalld
firewall-cmd --permanent --add-service=ftp firewall-cmd --reload
Trên Ubuntu 16.04, mặc định dùng UFW
ufw allow 21/tcp ufw reload
Bạn nào vẫn dùng iptables thì dùng lệnh này.
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
Xong rồi nhé, bài viết đến đây thôi. Các bạn làm theo các bước như mình hướng dẫn nếu gặp vấn đề gì thì comment phát để mọi người cùng trao đổi.
Chúc thành công.
Mình vẫn bị lỗi 530 Login incorrect. Thử fix mãi mà ko đc. Mình tạo user /usr/sbin/nologin và đã add vào file /etc/shells.
5. TẠO TÀI KHOẢN FTP => bước này mình không thấy bạn hướng dẫn tạo mật khẩu cho User; mong Bạn chỉ giúp
Giống tạo user của os thôi bạn
chroot_local_user=YES # kích hoạt tính năng chroot cho local user.
allow_writeable_chroot=YES # Phải có dòng này chroot mới hoạt động chuẩn được nhé.
chroot_list_enable=YES # Dòng này vô hiệu hóa Chroot.
chroot_list_file=/etc/vsftpd/chroot_list # Dòng này tạo ra một file chứa danh sách các local user không bị giới hạn bởi chroot.
mình có 2 user u1 , u2 : home directory : /home/{u1,u2}
đã cho user u1 nằm trong file chroot_list , restart lai vsftpd nhưng u1 vẫn ko truy cập dc folder của u2.
error : 550 Failed to change directory .
Bạn fix giúp với .
chào bạn mình làm theo hướng dẫn của bạn và tạo được ftp server hoạt động ok .nhưng mình còn thắc mắc này:
khi mình tạo và dùng virtual user thì toàn bộ local user không đăng nhập được.mình cũng tìm trên mạng 1 số code cho cả hai virtual user và local user được đăng nhập nhưng các code đó đều không hoạt động .bạn biết cách khắc phục chỉ giúp mình .mình cảm ơn
Mình đang dùng centos 7, làm thế nào để user1 có quyền upload file vào folder /usr/share/nginx/html. Mình đã cấu hình user1 có quyền read/write folder đó rồi, sử dụng SFTP của ssh thì ok, nhưng dùng filezilla connect vào thì ko view đc file trong đó và cũng ko upload đc file mới vào.
Xin bạn hướng dẫn giùm.
Bạn tạo user ftp với home directory là folder bạn muốn upload
Mình theo hướng dẫn cài đặt và kiểm tra FTP server đã hoạt động nhưng kết nối thì ko được , bạn có gợi ý nào dùm mình ko.
http://prntscr.com/et12t0
http://prntscr.com/et12mm
Bạn đã open port trên firewall chưa
mình đã tắt firewall rồi
Trên server bạn dùng command
ftp ipserver
Login bằng user bạn tạo xem được không. Hoặc xem log vsftp có thông báo gì.mình dùng lệnh ftp ipserver thì nó báo command not found
Bạn gửi thông tin server mình check cho.