Cách thiết lập vsftpd cho Thư mục người dùng trên Debian 10
FTP, viết tắt của File Transfer Protocol, là một giao thức mạng từng được sử dụng rộng rãi để di chuyển file giữa client và server . Kể từ đó, nó đã được thay thế bằng các cách phân phối file nhanh hơn, an toàn hơn và thuận tiện hơn. Nhiều user Internet thông thường mong đợi tải trực tiếp từ trình duyệt web của họ vớihttps và  user  dòng lệnh có nhiều khả năng sử dụng các giao thức an toàn như scp hoặc SFTP .  FTP vẫn được sử dụng để hỗ trợ các ứng dụng kế thừa và quy trình làm việc với các nhu cầu rất cụ thể. Nếu bạn có lựa chọn về giao thức sẽ sử dụng, hãy xem xét khám phá các tùy chọn hiện đại hơn. Tuy nhiên, khi bạn cần FTP, vsftpd là một lựa chọn tuyệt vời. Được tối ưu hóa về bảo mật, hiệu suất và độ ổn định, vsftpd cung cấp khả năng bảo vệ mạnh mẽ chống lại nhiều vấn đề bảo mật được tìm thấy trong các server FTP khác và là mặc định cho nhiều bản phân phối Linux.
Trong hướng dẫn này, bạn sẽ cấu hình vsftpd để cho phép user tải file lên folder chính của họ bằng FTP, với thông tin đăng nhập được bảo mật bằng SSL / TLS.
Yêu cầu
Để làm theo hướng dẫn này, bạn cần :
-   Server  Debian 10 và  user  không phải root có  quyền  
sudo. Bạn có thể tìm hiểu thêm về cách tạo user có các quyền này trong hướng dẫn Cài đặt Server Ban đầu với Debian 10 của ta . 
Bước 1 - Cài đặt vsftpd
 Hãy bắt đầu bằng cách cập nhật danh sách gói của  ta  và cài đặt daemon vsftpd :
- sudo apt update 
 - sudo apt install vsftpd 
 
Khi quá trình cài đặt hoàn tất, hãy sao chép file cấu hình để bạn có thể bắt đầu với cấu hình trống và lưu bản root làm bản backup :
- sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig 
 
Với một bản backup cấu hình tại chỗ, ta đã sẵn sàng cấu hình firewall .
Bước 2 - Mở firewall
Hãy kiểm tra trạng thái firewall để xem nó đã được bật chưa. Nếu có, ta sẽ đảm bảo lưu lượng FTP được phép để các luật firewall không chặn các thử nghiệm của ta . Hướng dẫn này giả định bạn đã cài đặt UFW, thực hiện theo Bước 4 trong hướng dẫn cài đặt server ban đầu .
Kiểm tra trạng thái firewall :
- sudo ufw status 
 
Trong trường hợp này, chỉ SSH được phép thông qua:
OutputStatus: active  To                         Action      From --                         ------      ---- OpenSSH                    ALLOW       Anywhere OpenSSH (v6)               ALLOW       Anywhere (v6) Bạn có thể có các luật khác hoặc không có luật firewall nào cả. Vì chỉ lưu lượng SSH được cho phép trong trường hợp này, ta cần thêm các luật cho lưu lượng FTP.
 Hãy mở cổng 20 và 21 cho FTP, cổng 990 khi  ta  bật TLS và cổng 40000-50000 cho phạm vi cổng thụ động mà  ta  định đặt trong file  cấu hình:
- sudo ufw allow 20/tcp 
 - sudo ufw allow 21/tcp 
 - sudo ufw allow 990/tcp 
 - sudo ufw allow 40000:50000/tcp 
 
Kiểm tra trạng thái firewall :
- sudo ufw status 
 
Luật firewall của bạn bây giờ sẽ giống như sau:
OutputStatus: active  To                         Action      From --                         ------      ---- OpenSSH                    ALLOW       Anywhere 990/tcp                    ALLOW       Anywhere 20/tcp                     ALLOW       Anywhere 21/tcp                     ALLOW       Anywhere 40000:50000/tcp            ALLOW       Anywhere OpenSSH (v6)               ALLOW       Anywhere (v6) 20/tcp (v6)                ALLOW       Anywhere (v6) 21/tcp (v6)                ALLOW       Anywhere (v6) 990/tcp (v6)               ALLOW       Anywhere (v6) 40000:50000/tcp (v6)       ALLOW       Anywhere (v6) Với vsftpd được cài đặt và các cổng cần thiết đã mở, hãy chuyển sang tạo  user  FTP chuyên dụng.
Bước 3 - Chuẩn bị Danh mục User
Ta sẽ tạo một user FTP chuyên dụng, nhưng bạn có thể đã có một user cần truy cập FTP. Ta sẽ lưu ý để duy trì quyền truy cập của user hiện có vào dữ liệu của họ trong các hướng dẫn sau đây. Mặc dù vậy, ta khuyên bạn nên bắt đầu với user mới cho đến khi bạn đã cấu hình và kiểm tra cài đặt của bạn .
 Đầu tiên, hãy thêm một  user  thử nghiệm có tên là sammy :
- sudo adduser sammy 
 
Gán password  khi  được yêu cầu . Vui lòng nhấn ENTER qua các  dấu nhắc  khác.
 FTP thường an toàn hơn khi  user  bị giới hạn trong một folder  cụ thể. vsftpd hoàn thành việc này với chroot jails. Khi chroot được bật cho  user  local , họ bị hạn chế trong folder  chính của họ theo mặc định. Tuy nhiên, vì cách vsftpd bảo mật folder , nó không được ghi bởi  user . Điều này tốt cho  user  mới, người chỉ nên kết nối qua FTP, nhưng  user  hiện tại có thể cần ghi vào folder  chính của họ nếu họ cũng có quyền truy cập shell.
 Trong ví dụ này, thay vì xóa  quyền  ghi khỏi folder  chính, hãy tạo một folder  ftp để dùng làm chroot và một folder  files thể ghi để chứa các file  thực.
 Tạo folder  ftp :
- sudo mkdir /home/sammy/ftp 
 
Đặt quyền sở hữu của nó:
- sudo chown nobody:nogroup /home/sammy/ftp 
 
Xóa quyền ghi:
- sudo chmod a-w /home/sammy/ftp 
 
Xác minh các quyền:
- sudo ls -la /home/sammy/ftp 
 
Outputtotal 8 4 dr-xr-xr-x  2 nobody nogroup 4096 Aug 24 21:29 . 4 drwxr-xr-x  3 sammy  sammy   4096 Aug 24 21:29 .. Tiếp theo, hãy tạo folder để tải file lên và gán quyền sở hữu cho user :
- sudo mkdir /home/sammy/ftp/files 
 - sudo chown sammy:sammy /home/sammy/ftp/files 
 
Kiểm tra quyền trên folder  ftp sẽ trả về như sau:
- sudo ls -la /home/sammy/ftp 
 
Outputtotal 12 dr-xr-xr-x 3 nobody nogroup 4096 Aug 26 14:01 . drwxr-xr-x 3 sammy  sammy   4096 Aug 26 13:59 .. drwxr-xr-x 2 sammy  sammy   4096 Aug 26 14:01 files Cuối cùng, hãy thêm file  test.txt để sử dụng khi  ta  kiểm tra:
- echo "vsftpd test file" | sudo tee /home/sammy/ftp/files/test.txt 
 
Bây giờ  ta  đã bảo mật folder  ftp và cho phép  user  truy cập vào thư files , hãy sửa đổi cấu hình của  ta .
Bước 4 - Cấu hình quyền truy cập FTP
  Ta  đang có kế hoạch cho phép một  user  có account  shell local  kết nối với FTP. Hai cài đặt chính cho điều này đã được đặt trong vsftpd.conf . Bắt đầu bằng cách mở file  cấu hình để  xác minh  cài đặt trong cấu hình của bạn  trùng với  những cài đặt bên dưới:
- sudo nano /etc/vsftpd.conf 
 
. . . # Allow anonymous FTP? (Disabled by default). anonymous_enable=NO # # Uncomment this to allow local users to log in. local_enable=YES . . . Tiếp theo, hãy cho phép  user  tải file  lên bằng cách  đảm bảo  cài đặt write_enable được bỏ ghi chú và đặt thành YES :
. . . write_enable=YES . . .  Ta  cũng sẽ bỏ ghi chú chroot để ngăn  user  được kết nối FTP truy cập  các file   hoặc lệnh nào bên ngoài cây folder :
. . . chroot_local_user=YES . . . Cũng hãy thêm user_sub_token để chèn tên  user  vào đường dẫn local_root directory của  ta  để cấu hình của  ta  sẽ hoạt động cho  user  này và bất kỳ  user  bổ sung nào trong tương lai. Thêm các cài đặt này vào bất kỳ đâu trong file :
. . . user_sub_token=$USER local_root=/home/$USER/ftp Cũng hãy giới hạn phạm vi cổng được dùng cho FTP thụ động đảm bảo có đủ kết nối:
. . . pasv_min_port=40000 pasv_max_port=50000 Lưu ý: Trong Bước 2,  ta  đã mở các cổng mà  ta  đặt ở đây cho phạm vi cổng thụ động. Nếu bạn thay đổi các giá trị, hãy đảm bảo cập nhật cài đặt firewall  của bạn.
Để cho phép truy cập FTP theo từng trường hợp, hãy đặt cấu hình để user chỉ có quyền truy cập khi họ được thêm vào danh sách một cách rõ ràng, thay vì theo mặc định:
. . . userlist_enable=YES userlist_file=/etc/vsftpd.userlist userlist_deny=NO userlist_deny chuyển đổi logic: Khi nó được đặt thành YES ,  user  trong danh sách bị từ chối truy cập FTP. Khi nó được đặt thành NO , chỉ những  user  trong danh sách mới được phép truy cập.
Khi bạn thực hiện xong các thay đổi, hãy lưu file và thoát khỏi editor .
 Cuối cùng, hãy thêm  user  của  ta  vào /etc/vsftpd.userlist . Sử dụng cờ -a để thêm vào file :
- echo "sammy" | sudo tee -a /etc/vsftpd.userlist 
 
Kiểm tra xem nó đã được thêm vào như bạn mong đợi chưa:
- cat /etc/vsftpd.userlist 
 
Outputsammy Khởi động lại daemon để tải các thay đổi cấu hình:
- sudo systemctl restart vsftpd 
 
Với cấu hình tại chỗ, ta có thể chuyển sang kiểm tra quyền truy cập FTP.
Bước 5 - Kiểm tra quyền truy cập FTP
Ta đã cấu hình server để chỉ cho phép sammy user kết nối qua FTP. Hãy đảm bảo điều này hoạt động như mong đợi.
  User  ẩn danh sẽ không kết nối được :  Ta  đã vô hiệu hóa quyền truy cập ẩn danh. Hãy kiểm tra điều đó bằng cách thử kết nối ẩn danh. Nếu cấu hình của  ta  được  cài đặt  đúng cách,  user  ẩn danh sẽ bị từ chối cấp quyền. Mở một terminal  khác và chạy lệnh sau. Đảm bảo thay thế 203.0.113.0 bằng địa chỉ IP công cộng của  server  và sử dụng anonymous làm tên  user  của bạn:
- ftp -p 203.0.113.0 
 
OutputConnected to 203.0.113.0. 220 (vsFTPd 3.0.3) Name (203.0.113.0:default): anonymous 530 Permission denied. ftp: Login failed. ftp> Đóng kết nối:
- bye 
 
 User  không phải sammy sẽ không kết nối được : Tiếp theo, hãy thử kết nối  với quyền   user  sudo của  ta . Họ cũng nên bị từ chối quyền truy cập và điều đó sẽ xảy ra trước khi họ được phép nhập password   của bạn :
- ftp -p 203.0.113.0 
 
OutputConnected to 203.0.113.0. 220 (vsFTPd 3.0.3) Name (203.0.113.0:default): your_sudo_user 530 Permission denied. ftp: Login failed. ftp> Đóng kết nối:
- bye 
 
User sammy sẽ có thể kết nối, đọc và ghi file : Hãy đảm bảo user được chỉ định của ta có thể kết nối:
- ftp -p 203.0.113.0 
 
OutputConnected to 203.0.113.0. 220 (vsFTPd 3.0.3) Name (203.0.113.0:default): sammy 331 Please specify the password. Password: your_user's_password 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> Hãy thay đổi vào thư files và sử dụng lệnh get để chuyển file  thử nghiệm mà  ta  đã tạo trước đó sang máy local  của  ta :
- cd files 
 - get test.txt 
 
Output229 Entering Extended Passive Mode (|||47398|) 150 Opening BINARY mode data connection for test.txt (17 bytes). 100% |**********************************|    17      146.91 KiB/s    00:00 ETA 226 Transfer complete. 17 bytes received in 00:00 (0.17 KiB/s) ftp> Tiếp theo, hãy tải file lên với tên mới để kiểm tra quyền ghi:
- put test.txt upload.txt 
 
Output229 Entering Extended Passive Mode (|||46598|) 150 Ok to send data. 100% |**********************************|    17        8.93 KiB/s    00:00 ETA 226 Transfer complete. 17 bytes sent in 00:00 (0.08 KiB/s) Đóng kết nối:
- bye 
 
Bây giờ ta đã kiểm tra cấu hình của bạn , hãy thực hiện các bước để bảo mật hơn nữa server của ta .
Bước 6 - Đảm bảo giao dịch
 Vì FTP không mã hóa bất kỳ dữ liệu nào khi chuyển tiếp, bao gồm thông tin đăng nhập của  user , nên  ta  sẽ kích hoạt TLS / SSL để cung cấp mã hóa đó. Bước đầu tiên là tạo certificate  SSL để sử dụng với vsftpd .
 Hãy sử dụng openssl để tạo certificate  mới và sử dụng cờ -days để làm cho nó có giá trị trong một năm. Trong cùng một lệnh,  ta  sẽ thêm một khóa RSA 2048-bit riêng. Bằng cách đặt cả -keyout và -out thành cùng một giá trị, private key  và certificate  sẽ được đặt trong cùng một file :
- sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem 
 
Bạn sẽ  được yêu cầu  cung cấp thông tin địa chỉ cho certificate   của bạn . Thay thế thông tin  của bạn  cho các giá trị được đánh dấu bên dưới. Đối với trường Common Name , hãy nhớ thêm your_server_ip :
OutputGenerating a 2048 bit RSA private key ............................................................................+++ ...........+++ writing new private key to '/etc/ssl/private/vsftpd.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:NY Locality Name (eg, city) []:New York City Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []: your_server_ip Email Address []: Để biết thêm thông tin chi tiết về cờ certificate , hãy xem OpenSSL Essentials: Làm việc với Chứng chỉ SSL, Khóa riêng tư và CSR
 Khi bạn đã tạo certificate , hãy mở lại file  cấu hình vsftpd :
- sudo nano /etc/vsftpd.conf 
 
Ở cuối file , bạn sẽ thấy hai dòng bắt đầu bằng rsa_ .  Comment  chúng để chúng trông như thế này:
. . . # rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem # rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key . . . Bên dưới chúng, thêm các dòng sau trỏ đến certificate và private key mà ta vừa tạo:
. . . rsa_cert_file=/etc/ssl/private/vsftpd.pem rsa_private_key_file=/etc/ssl/private/vsftpd.pem . . . Sau đó,  ta  sẽ buộc sử dụng SSL, điều này sẽ ngăn các client  không thể xử lý TLS kết nối. Điều này là cần thiết  đảm bảo  rằng tất cả lưu lượng truy cập được mã hóa, nhưng nó có thể buộc  user  FTP của bạn thay đổi  ứng dụng client . Thay đổi ssl_enable thành YES :
. . . ssl_enable=YES . . . Sau đó, thêm các dòng sau để từ chối rõ ràng các kết nối ẩn danh qua SSL và yêu cầu SSL cho cả quá trình truyền dữ liệu và đăng nhập:
. . . allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES . . . Sau đó, hãy cấu hình server để sử dụng TLS, công cụ kế thừa ưu tiên cho SSL, bằng cách thêm các dòng sau:
. . . ssl_tlsv1=YES ssl_sslv2=NO ssl_sslv3=NO . . . Cuối cùng, ta sẽ thêm hai tùy chọn nữa. Đầu tiên, ta sẽ không yêu cầu sử dụng lại SSL vì nó có thể phá vỡ nhiều client FTP. Ta sẽ yêu cầu các bộ mật mã mã hóa "cao", hiện nghĩa là độ dài khóa bằng hoặc lớn hơn 128 bit:
. . . require_ssl_reuse=NO ssl_ciphers=HIGH . . . Phần file đã hoàn thành sẽ trông như thế này:
# This option specifies the location of the RSA certificate to use for SSL # encrypted connections. #rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem #rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key rsa_cert_file=/etc/ssl/private/vsftpd.pem rsa_private_key_file=/etc/ssl/private/vsftpd.pem ssl_enable=YES 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 Khi bạn hoàn tất, hãy lưu file .
Khởi động lại server để các thay đổi có hiệu lực:
- sudo systemctl restart vsftpd 
 
Đến đây, ta sẽ không thể kết nối với client dòng lệnh không an toàn nữa. Nếu ta đã thử, ta sẽ thấy thông tin như :
Outputftp -p 203.0.113.0 Connected to 203.0.113.0. 220 (vsFTPd 3.0.3) Name (203.0.113.0:default): sammy 530 Non-anonymous sessions must use encryption. ftp: Login failed. ftp> Tiếp theo, hãy xác minh ta có thể kết nối bằng ứng dụng client hỗ trợ TLS.
Bước 7 - Kiểm tra TLS với FileZilla
Hầu hết các client FTP hiện đại có thể được cấu hình để sử dụng mã hóa TLS. Ta sẽ trình bày cách kết nối với FileZilla vì hỗ trợ đa nền tảng của nó. Tham khảo tài liệu cho các khách hàng khác.
Khi bạn mở FileZilla lần đầu tiên, hãy tìm biểu tượng Trình quản lý trang web ngay phía trên từ Server , biểu tượng ngoài cùng bên trái ở hàng trên cùng. Nhấp vào nó:
Một cửa sổ mới sẽ mở ra. Nhấp vào nút Trang web mới ở góc dưới cùng bên phải:
 Trong Trang web của tôi, một biểu tượng mới với các từ Trang web mới sẽ xuất hiện. Bạn có thể đặt tên ngay bây giờ hoặc quay lại sau và sử dụng nút Đổi tên .
Điền vào trường Server lưu trữ với domain hoặc địa chỉ IP của bạn. Trong menu thả xuống Mã hóa , chọn Yêu cầu FTP rõ ràng qua TLS .
Đối với Loại đăng nhập , hãy chọn Yêu cầu password . Điền user FTP của bạn vào trường User :
Nhấp vào Kết nối ở cuối giao diện. Bạn cần nhập password của user :
Nhấn OK để kết nối. Đến đây bạn sẽ được kết nối với server của bạn bằng mã hóa TLS / SSL.
Sau khi thành công, bạn sẽ được cung cấp certificate server giống như sau:
 Khi bạn đã chấp nhận certificate , hãy nhấp đúp vào folder  files và kéo upload.txt sang bên trái để  xác nhận  bạn có thể  download  file : 
 Khi bạn đã hoàn tất, hãy nhấp chuột phải vào bản sao local , đổi tên nó thành upload-tls.txt và kéo nó trở lại  server  để  xác nhận  bạn có thể tải lên file : 
Đến đây bạn đã xác nhận bạn có thể chuyển các file một cách an toàn và thành công khi bật SSL / TLS.
Bước 8 - Tắt quyền truy cập Shell (Tùy chọn)
Nếu bạn không thể sử dụng TLS vì yêu cầu của khách hàng, bạn có thể đạt được một số bảo mật bằng cách vô hiệu hóa khả năng đăng nhập của user FTP theo bất kỳ cách nào khác. Một cách tương đối đơn giản để ngăn chặn nó là tạo một shell tùy chỉnh. Điều này sẽ không cung cấp bất kỳ mã hóa nào, nhưng nó sẽ hạn chế quyền truy cập của account bị xâm phạm vào các file mà FTP có thể truy cập được.
 Đầu tiên, mở một file  có tên ftponly trong folder  bin :
- sudo nano /bin/ftponly 
 
Thêm thông báo cho user biết lý do họ không thể đăng nhập:
#!/bin/sh echo "This account is limited to FTP access only." Lưu file và thoát khỏi editor .
Thay đổi quyền để làm cho file có thể thực thi:
- sudo chmod a+x /bin/ftponly 
 
Mở danh sách các shell hợp lệ:
- sudo nano /etc/shells 
 
Ở dưới cùng thêm:
. . . /bin/ftponly Cập nhật shell của user bằng lệnh sau:
- sudo usermod sammy -s /bin/ftponly 
 
Bây giờ hãy thử đăng nhập vào server của bạn với quyền là sammy :
- ssh sammy@your_server_ip 
 
Bạn sẽ thấy thông tin như :
OutputThis account is limited to FTP access only. Connection to 203.0.113.0 closed. Điều này  xác nhận   user  không còn có thể ssh vào  server  và bị giới hạn chỉ truy cập FTP.
Kết luận
 Trong hướng dẫn này,  ta  đã đề cập đến việc  cài đặt  FTP cho  user  có account  local . Nếu bạn cần sử dụng nguồn xác thực bên ngoài, bạn  có thể cần  xem xét sự hỗ trợ của vsftpd đối với  user  ảo. Điều này cung cấp một loạt các tùy chọn phong phú thông qua việc sử dụng PAM, Mô-đun Xác thực Có thể lắp ráp và là một lựa chọn tốt nếu bạn quản lý  user  trong một hệ thống khác như LDAP hoặc Kerberos.
Các tin liên quan

