Thứ sáu, 06/07/2018 | 00:00 GMT+7

Cách thiết lập vsftpd cho Thư mục người dùng trên Ubuntu 18.04

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 download trực tiếp từ trình duyệt web của họ với https 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 :

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 để ta có thể bắt đầu với cấu hình trống, 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 .

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:

Output
Status: 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 2021 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
  • sudo ufw status

Các luật firewall của ta bây giờ sẽ giống như sau:

Output
Status: 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:

  • 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
Output
total 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
Output
total 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
/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 bỏ ghi chú cài đặt write_enable :

/etc/vsftpd.conf
. . . 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 :

/etc/vsftpd.conf
. . . 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 :

/etc/vsftpd.conf
. . . 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:

/etc/vsftpd.conf
. . . 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 rõ ràng vào danh sách, thay vì theo mặc định:

/etc/vsftpd.conf
. . . 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
Output
sammy

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 đã có, hãy 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 cửa sổ 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 của bạn:

  • ftp -p 203.0.113.0
Output
Connected 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
Output
Connected to 203.0.113.0. 220 (vsFTPd 3.0.3) Name (203.0.113.0:default): 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
Output
Connected 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
Output
227 Entering Passive Mode (203,0,113,0,169,12). 150 Opening BINARY mode data connection for test.txt (16 bytes). 226 Transfer complete. 16 bytes received in 0.0101 seconds (1588 bytes/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
Output
227 Entering Passive Mode (203,0,113,0,164,71). 150 Ok to send data. 226 Transfer complete. 16 bytes sent in 0.000894 seconds (17897 bytes/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-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:

Output
Generating 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:

/etc/vsftpd.conf
. . . # 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:

/etc/vsftpd.conf
. . . 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 :

/etc/vsftpd.conf
. . . 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:

/etc/vsftpd.conf
. . . 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:

/etc/vsftpd.conf
. . . 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:

/etc/vsftpd.conf
. . . require_ssl_reuse=NO ssl_ciphers=HIGH . . . 

Phần file đã hoàn thành sẽ trông như thế này:

/etc/vsftpd.conf
# 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ư :

Output
ftp -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. 421 Service not available, remote server has closed connection 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ó:

Quản lý trang web Screent Shot

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:

Nút trang web mới
Trong Trang web của tôi, một biểu tượng mới có dòng chữ 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 tên hoặc địa chỉ IP. 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 :

Tab Cài đặt Chung

Nhấp vào Kết nối ở cuối giao diện. Bạn cần nhập password của user :

Đối thoại password

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:

Đối thoại Chứng chỉ Trang web

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 :

 Download  test.txt

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 :

Đổi tên và tải lên

Đế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 / ftponly
#!/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:

/ etc / shell
. . . /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ư :

Output
This 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.


Tags:

Các tin liên quan

Cách cài đặt Git trên Ubuntu 18.04
2018-07-06
Cách cài đặt và cấu hình Postfix trên Ubuntu 18.04
2018-07-06
Cách cài đặt WordPress với LAMP trên Ubuntu 18.04
2018-07-06
Cách thiết lập ứng dụng Node.js để sản xuất trên Ubuntu 18.04
2018-07-05
Cách thêm không gian swap trên Ubuntu 18.04
2018-07-05
Cách thiết lập NFS Mount trên Ubuntu 18.04
2018-07-05
Cách cài đặt và cấu hình Nextcloud trên Ubuntu 18.04
2018-07-05
Cách cài đặt và cấu hình ownCloud trên Ubuntu 18.04
2018-07-05
Cách thiết lập firewall với UFW trên Ubuntu 18.04
2018-07-05
Triển khai các ứng dụng React với Webhooks và Slack trên Ubuntu 16.04
2018-06-20