Cách cài đặt và cấu hình máy chủ FTP (vsftpd) với SSL/TLS trên Ubuntu 20.04

theanh

Administrator
Nhân viên
FTP hay Giao thức truyền tệp là một giao thức rất cũ và nổi tiếng để truyền tệp giữa máy khách và máy chủ. Đây cũng là một giao thức không an toàn chỉ khi sử dụng mà không có TLS. Trong hướng dẫn này, chúng ta sẽ cấu hình vsftpd cho TLS, cho phép chúng ta sử dụng FTP một cách an toàn. FTP thường được thay thế bằng các giao thức an toàn hơn như SFTP hoặc SCP hiện nay.

Tuy nhiên, nếu bạn cần sử dụng FTP với máy chủ của mình, vsftpd (Very Secure FTP Daemon) là một lựa chọn hoàn hảo.

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách cài đặt và cấu hình Máy chủ FTP bằng vsftpd trên máy chủ chạy Ubuntu 20.04. Chúng ta cũng sẽ tìm hiểu cách bảo mật kết nối bằng giao thức SSL/TLS.

Điều kiện tiên quyết​

  • Máy chủ Ubuntu 20.04 với người dùng không phải root có quyền sudo.

Bước 1 - Cài đặt vsftpd​

Bước đầu tiên là cài đặt vsftpd.
Mã:
$ sudo apt update$ sudo apt install vsftpd
Tiếp theo, chúng ta cần sao lưu tệp cấu hình gốc để có thể bắt đầu với cấu hình mới.
Mã:
$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig

Bước 2 - Cấu hình Tường lửa​

Trong bước này, chúng ta sẽ cấu hình tường lửa UFW thành cho phép truy cập vào các cổng FTP.

Trước tiên, chúng ta hãy kiểm tra trạng thái của tường lửa.
Mã:
$ sudo ufw statusTrạng thái: hoạt độngĐến Hành động Từ-- ------ ----OpenSSH CHO PHÉP Mọi nơiOpenSSH (v6) CHO PHÉP Mọi nơi (v6)
Như chúng ta có thể thấy, cho đến nay chỉ cho phép các cổng SSH. Chúng ta hãy mở các cổng 20 (cổng lệnh FTP), 21 (cổng dữ liệu FTP), 990 khi chúng ta sử dụng TLS và các cổng 35000-40000 cho phạm vi các cổng thụ động mà chúng ta có thể cần trong tương lai.
Mã:
$ sudo ufw allow 20:21/tcp$ sudo ufw allow 990/tcp$ sudo ufw allow 35000:40000/tcp$ sudo ufw statusTrạng thái: hoạt độngĐến Hành động Từ-- ------ ----OpenSSH ALLOW Anywhere990/tcp ALLOW Anywhere20:21/tcp ALLOW Anywhere35000:40000/tcp ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)20:21/tcp (v6) ALLOW Anywhere (v6)990/tcp (v6) ALLOW Anywhere (v6)35000:40000/tcp (v6) ALLOW Anywhere (v6)

Bước 3 - Cấu hình vsftpd​

Bây giờ chúng ta sẽ xem qua một số thiết lập quan trọng để vsftpd hoạt động.

Bắt đầu bằng cách mở tệp cấu hình.
Mã:
$ sudo nano /etc/vsftpd.conf

1. Truy cập FTP​

Trong hướng dẫn này, chúng tôi sẽ chỉ cho phép người dùng cục bộ truy cập FTP và vô hiệu hóa mọi quyền truy cập ẩn danh. Để thực hiện việc này, hãy đảm bảo các dòng sau tồn tại và như sau.
Mã:
anonymous_enable=NOlocal_enable=YES

2. Bật Tải tệp lên​

Mục đích quan trọng nhất của FTP ở đây là có thể ghi vào máy chủ. Bỏ chú thích dòng sau để bật tải tệp lên bằng cách xóa # ở phía trước.
Mã:
write_enable=YES

3. Chroot Jail​

FTP hoạt động tốt nhất khi người dùng bị giới hạn trong một thư mục nhất định. vsftpd đạt được điều đó bằng cách sử dụng chroot jails. Khi chroot được bật cho người dùng cục bộ, theo mặc định, họ bị giới hạn trong thư mục gốc của mình. Để thực hiện điều này, hãy bỏ chú thích dòng sau.
Mã:
chroot_local_user=YES
Để ngăn chặn mọi lỗ hổng bảo mật, chroot khi được bật sẽ không hoạt động miễn là thư mục mà người dùng bị hạn chế có thể ghi.

Để khắc phục hạn chế này, chúng tôi có hai phương pháp cho phép tải tệp lên khi chroot được bật.

  1. Phương pháp 1 - Phương pháp này hoạt động bằng cách sử dụng một thư mục khác để tải lên FTP. Đối với hướng dẫn này, chúng tôi sẽ tạo một thư mục ftp bên trong trang chủ của người dùng để làm chroot và một thư mục có thể ghi thứ hai upload để tải tệp lên. Để thực hiện điều này, hãy thêm các dòng sau vào cuối tệp.
    Mã:
    user_sub_token=$USERlocal_root=/home/$USER/ftp

  2. Phương pháp 2 - Phương pháp thứ hai là chỉ cần cấp quyền truy cập có thể ghi vào toàn bộ thư mục gốc. Thêm dòng sau để thực hiện điều này.
    Mã:
    allow_writeable_chroot=YES

4. FTP thụ động​

vsftpd có thể sử dụng bất kỳ cổng nào cho các kết nối FTP thụ động. Chúng ta có thể chỉ định phạm vi cho số cổng tối thiểu và tối đa mà vsftpd có thể sử dụng. Đây là các cổng mà chúng ta đã định cấu hình trong tường lửa UFW trước đó.

Thêm các dòng sau để cho phép kết nối FTP thụ động.
Mã:
pasv_min_port=35000pasv_max_port=40000

5. Hạn chế người dùng​

Để chỉ cho phép một số người dùng nhất định đăng nhập vào máy chủ FTP, hãy thêm các dòng sau vào cuối.
Mã:
userlist_enable=YESuserlist_file=/etc/vsftpd.userlistuserlist_deny=NO
Với tùy chọn này được bật, chúng ta cần chỉ định những người dùng nào được phép sử dụng FTP và thêm tên người dùng của họ vào tệp /etc/vsftpd.userlist.

Khởi động lại vsftpd để bật cấu hình.
Mã:
$ sudo systemctl restart vsftpd

Bước 4 - Cấu hình thư mục người dùng​

Với mục đích của hướng dẫn này, chúng ta sẽ tạo một tài khoản người dùng mới cho các giao dịch FTP. Nếu bạn đã có tài khoản người dùng cho mục đích này, bạn có thể bỏ qua bước 1. Ngoài ra, nếu bạn đã đặt allow_writeable_chroot=YES trong tệp cấu hình trước đó, bạn có thể bỏ qua bước 3.

Bước 1 - Thêm người dùng mới.​

Mã:
$ sudo adduser testuser
Đặt mật khẩu mạnh và bỏ qua tất cả các lời nhắc khác.

Bước 2 - Thêm người dùng vào danh sách người dùng FTP được phép.​

Mã:
$ echo "testuser" | sudo tee -a /etc/vsftpd.userlist

Bước 3 - Tạo thư mục FTP và tệp​

Bước này dành cho trường hợp bạn muốn có một thư mục khác làm thư mục gốc FTP và một thư mục khác để tải tệp lên để vượt qua giới hạn chroot jail.

Tạo thư mục FTP.
Mã:
$ sudo mkdir /home/testuser/ftp
Đặt quyền sở hữu.
Mã:
$ sudo chown nobody:nogroup /home/testuser/ftp
Xóa quyền ghi.
Mã:
$ sudo chmod a-w /home/testuser/ftp
Xác minh quyền trước khi tiếp tục.
Mã:
$ sudo ls -al /home/testuser/ftptổng cộng 8dr-xr-xr-x 2 nobody nogroup 4096 7 tháng 6 13:08 .drwxr-xr-x 3 testuser testuser 4096 7 tháng 6 13:08 ..
Bây giờ chúng ta hãy tạo thư mục có thể ghi thực tế cho các tệp.
Mã:
$ sudo mkdir /home/testuser/ftp/upload$ sudo chown testuser:testuser /home/testuser/ftp/upload
Kiểm tra các quyền.
Mã:
$ sudo ls -al /home/testuser/ftptổng cộng 12dr-xr-xr-x 3 nobody nogroup 4096 7 tháng 6 13:10 .drwxr-xr-x 3 testuser testuser 4096 7 tháng 6 13:08 ..drwxr-xr-x 2 testuser testuser 4096 7 tháng 6 13:10 upload
Cuối cùng, hãy thêm tệp test.txt để sử dụng cho mục đích thử nghiệm.
Mã:
$ echo "vsftpd test file" | sudo tee /home/testuser/ftp/upload/test.txt

Bước 5 - Kiểm tra quyền truy cập FTP​

Máy chủ FTP của chúng tôi hiện đang hoạt động đầy đủ. Chúng ta có thể thực hiện một bài kiểm tra nhỏ trước khi tiếp tục.

Hãy thử đăng nhập với tư cách là người dùng ẩn danh.
Mã:
$ ftp -p 136.244.105.99Đã kết nối tới 136.244.105.99.220 (vsFTPd 3.0.3)Tên (136.244.105.99:default): anonymous530 Quyền bị từ chối.ftp: Đăng nhập không thành công.ftp>
Đóng kết nối.
Mã:
ftp> tạm biệt
Nó hoạt động như mong đợi, tức là không cho phép người dùng ẩn danh.

Hãy thử kết nối với tư cách là bất kỳ người dùng sudo nào khác. Nó cũng không nên kết nối.
Mã:
$ ftp -p 136.244.105.99Đã kết nối tới 136.244.105.99.220 (vsFTPd 3.0.3)Tên (136.244.105.99:default): sudo_user530 Quyền bị từ chối.ftp: Đăng nhập không thành công.ftp>
Đóng kết nối.
Mã:
ftp> bye
Cuối cùng chúng ta hãy thử kết nối với tư cách là testuser mà chúng ta đã tạo cho FTP.
Mã:
$ ftp -p 136.244.105.99Đã kết nối đến 136.244.105.99.220 (vsFTPd 3.0.3)Tên (136.244.105.99:default): testuser331 Vui lòng chỉ định mật khẩu.Mật khẩu: your_user's_password230 Đăng nhập thành công.Kiểu hệ thống từ xa là UNIX.Sử dụng chế độ nhị phân để truyền tệp.ftp>
Chúng ta hãy chuyển đến thư mục upload và sử dụng lệnh get để truyền tệp thử nghiệm đến máy cục bộ của chúng ta.
Mã:
ftp> cd upload250 Thư mục đã thay đổi thành công.ftp> get test.txt227 Đang vào Chế độ thụ động (136,244,105,99,165,42).150 Đang mở kết nối dữ liệu chế độ BINARY cho test.txt (17 byte).226 Hoàn tất chuyển giao.16 byte đã nhận trong 0,0101 giây (164,3719 kB/giây)ftp>
Tiếp theo, chúng ta hãy tải tệp lên với tên mới bằng lệnh put để kiểm tra quyền ghi.
Mã:
ftp> put test.txt upload.txt227 Đang vào Chế độ thụ động (136,244,105,99,163,102).150 Ok để gửi dữ liệu.226 Hoàn tất chuyển dữ liệu.17 byte được gửi trong 0,000894 giây (518,7988 kB/giây)
Đóng kết nối.
Mã:
ftp> tạm biệt

Bước 6 - Bảo mật truyền dữ liệu bằng SSL/TLS​

Để mã hóa truyền dữ liệu FTP, chúng ta cần có Chứng chỉ SSL và cấu hình vsftpd để sử dụng chứng chỉ này.

Nếu bạn đã có tên miền hoặc tên miền phụ trỏ đến máy chủ FTP của mình, bạn có thể tạo Chứng chỉ SSL Let's Encrypt miễn phí và sử dụng chứng chỉ đó.

Đối với mục đích của hướng dẫn này, chúng ta sẽ sử dụng chứng chỉ SSL tự ký. Để tạo một chứng chỉ, hãy sử dụng lệnh openssl.

Lệnh sau sẽ tạo khóa riêng 2048-bit và chứng chỉ có hiệu lực trong 1 năm. Cả chứng chỉ và khóa sẽ được lưu vào cùng một tệp.
Mã:
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
Bạn có thể bỏ qua các lời nhắc sau đó hoặc điền các giá trị theo ý thích của mình.

Bây giờ chứng chỉ của chúng ta đã được tạo, đã đến lúc mở lại tệp cấu hình vsftpd.
Mã:
$ sudo nano /etc/vsftpd.conf
Tìm các dòng sau và bình luận chúng bằng cách đặt dấu thăng trước chúng như sau.
Mã:
# rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem# rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
Bây giờ, hãy thêm các dòng sau.
Mã:
rsa_cert_file=/etc/ssl/private/vsftpd.pemrsa_private_key_file=/etc/ssl/private/vsftpd.pem
Ngoài ra, hãy thay đổi giá trị của ssl_enable thành YES.
Mã:
ssl_enable=YES
Chúng ta hãy thêm một vài thiết lập nữa để cải thiện bảo mật SSL.
Mã:
allow_anon_ssl=NOforce_local_data_ssl=YESforce_local_logins_ssl=YESssl_tlsv1=YESssl_sslv2=NOssl_sslv3=NOrequire_ssl_reuse=NOssl_ciphers=HIGH
Hầu hết các thiết lập này đều tự giải thích. Các thiết lập này vô hiệu hóa SSL cho người dùng ẩn danh và yêu cầu SSL cho cả truyền dữ liệu và đăng nhập. Chúng tôi cũng vô hiệu hóa các giao thức SSL không an toàn và sẽ tuân thủ TLSv1.0. Và cuối cùng, chúng tôi đã vô hiệu hóa việc sử dụng lại SSL và yêu cầu bộ mã hóa mã hóa cao.

Khởi động lại máy chủ để các thiết lập có hiệu lực.
Mã:
$ sudo systemctl restart vsftpd
Bây giờ, bạn sẽ không thể sử dụng FTP qua dòng lệnh. Bạn sẽ cần kết nối bằng một máy khách hỗ trợ TLS.

Bước 7 - Kiểm tra TLS bằng FileZilla​

Trong hướng dẫn của chúng tôi, chúng tôi sẽ kiểm tra khả năng TLS bằng Filezilla.

Khi bạn mở Filezilla, hãy nhấp vào biểu tượng Site Manager ngay phía trên từ Host ở hàng trên cùng.


1tdger5.png



Một cửa sổ mới sẽ mở ra. Nhấp vào nút New Site ở góc dưới bên phải.


8FMojob.png



Bạn sẽ thấy một biểu tượng mới có tên New site. Bạn có thể đổi tên bằng nút Rename.

Điền địa chỉ IP của máy chủ vào trường Host. Vì cổng FTP của chúng tôi là 21, đây là cổng mặc định cho FTP nên bạn có thể để trống trường cổng. Đối với tùy chọn Mã hóa, hãy chọn Yêu cầu FTP rõ ràng qua TLS từ menu thả xuống.


ccegU63.png



Điền tên người dùng và mật khẩu FTP của bạn bằng những thông tin chúng tôi đã tạo ở trên. Nhấp vào nút Kết nối để tiếp tục.

Sau khi kết nối thành công, bạn sẽ thấy chứng chỉ máy chủ trông như sau.


MhJlvK7.png



Bạn có thể kiểm tra tùy chọn Luôn tin tưởng chứng chỉ này trong các phiên sau. để bạn không bị hỏi mỗi lần đăng nhập. Nhấp vào Ok để tiếp tục.


dduy93a.png



Bây giờ bạn có thể thực hiện các hoạt động FTP bình thường.

Bước 8 - Vô hiệu hóa quyền truy cập Shell​

Bước này hoàn toàn tùy chọn. Theo mặc định, khi tạo người dùng FTP, nếu không được chỉ định rõ ràng, người dùng sẽ có quyền truy cập SSH vào máy chủ.

Bạn nên vô hiệu hóa quyền truy cập shell vào người dùng FTP để cải thiện bảo mật. Để vô hiệu hóa, chúng ta cần tạo một shell mới sẽ in ra thông báo cho biết tài khoản người dùng chỉ giới hạn ở quyền truy cập FTP.

Tạo shell /bin/ftponly và thực thi nó.
Mã:
$ echo -e '#!/bin/sh\necho "Tài khoản này chỉ giới hạn ở quyền truy cập FTP."' | sudo tee -a /bin/ftponly$ sudo chmod a+x /bin/ftponly
Thêm shell mới vào danh sách các shell hợp lệ trong tệp /etc/shells.
Mã:
$ echo "/bin/ftponly" | sudo tee -a /etc/shells
Thay đổi shell người dùng thành /bin/ftponly.
Mã:
$ sudo usermod newftpuser -s /bin/ftponly
Bạn có thể sử dụng cùng lệnh để thay đổi shell của tất cả người dùng mà bạn muốn cấp quyền truy cập FTP.

Kết luận​

Bài hướng dẫn này kết thúc, trong đó chúng tôi đã cài đặt và cấu hình vsftpd để cài đặt máy chủ FTP trên máy chủ chạy Ubuntu 20.04. Chúng tôi cũng đã cấu hình kết nối FTP của mình để hoạt động bằng SSL/TLS.

Nếu bạn có bất kỳ câu hỏi nào, hãy hỏi trong phần bình luận bên dưới.
 
Back
Bên trên