Cài đặt và cấu hình FTP Server với vsFTPD

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.

Cài đặt và cấu hình FTP Server

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
Telnet

Telnet

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.

netstat

netstat-tulpn

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.

PAM vsFTPD

PAM File – vsFTPD

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 shell nologin 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.

13 Comments

  1. Thang Tran April 12, 2018 Reply
  2. hòa lê August 8, 2017 Reply
    • Mr Thủy August 10, 2017 Reply
  3. loctran June 29, 2017 Reply
  4. mthang May 26, 2017 Reply
  5. long May 21, 2017 Reply
    • Mr Thủy May 21, 2017 Reply
  6. ann lee April 6, 2017 Reply
    • Mr Thủy April 6, 2017 Reply
      • ann lee April 6, 2017 Reply
        • Mr Thủy April 6, 2017 Reply
          • ann lee April 6, 2017
          • Mr Thủy April 6, 2017

Leave a Reply