Thứ ba, 20/02/2018 | 00:00 GMT+7

Cách thiết lập vsftpd cho Thư mục người dùng trên Ubuntu 16.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, ta sẽ chỉ cho bạn cách 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 :

Khi bạn đã có một server Ubuntu tại chỗ, bạn đã sẵn sàng để bắt đầu.

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

Ta sẽ bắt đầu bằng cách cập nhật danh sách gói của bạn và cài đặt daemon vsftpd:

  • sudo apt-get update
  • sudo apt-get install vsftpd

Khi quá trình cài đặt hoàn tất, ta sẽ sao chép file cấu hình để 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

Ta sẽ kiểm tra trạng thái firewall để xem nó có được bật hay không. Nếu vậy, ta sẽ đảm bảo lưu lượng FTP được phép để bạn không gặp phải các luật firewall chặn bạn khi đến thời điểm kiểm tra.

  • 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.

Ta cần mở cổng 20 và 21 cho FTP, cổng 990 cho sau này 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

Bây giờ các luật firewall của ta trông giống như:

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ở, ta đã sẵn sàng để tiến hành bước tiếp theo.

Bước 3 - Chuẩn bị Danh mục User

Đối với hướng dẫn này, ta sẽ tạo một user , nhưng bạn có thể đã có một user cần quyề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, ta sẽ thêm một user thử nghiệm:

  • sudo adduser sammy

Gán password khi được yêu cầu và 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 là 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 phải 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, ta sẽ tạo một folder ftp để phục vụ như chroot và một folder files thể ghi để chứa các file thực.

Tạo folder ftp , đặt quyền sở hữu và đảm bảo xóa quyền ghi bằng các lệnh sau:

  • sudo mkdir /home/sammy/ftp
  • sudo chown nobody:nogroup /home/sammy/ftp
  • sudo chmod a-w /home/sammy/ftp

Hãy 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, ta sẽ tạo folder nơi các file có thể được tải lên và chỉ định 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 thư files 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, ta sẽ thêm file test.txt để sử dụng khi ta kiểm tra sau này:

  • 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 , ta sẽ chuyển sự chú ý đến cấu hình.

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, ta cần thay đổi một số giá trị trong file . Để cho phép user tải file lên, ta sẽ bỏ ghi chú cài đặt write_enable để ta có:

/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 . . . 

Ta sẽ 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à mọi user trong tương lai có thể được thêm vào.

/etc/vsftpd.conf
user_sub_token=$USER local_root=/home/$USER/ftp 

Ta sẽ 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 ý: Ta đã mở trước 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.

Vì ta chỉ dự định cho phép truy cập FTP theo từng trường hợp, nên ta sẽ cài đặt cấu hình để quyền truy cập chỉ được cấp cho user 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 “CÓ”, user trong danh sách bị từ chối truy cập FTP. Khi nó được đặt thành “KHÔNG”, chỉ những user trong danh sách mới được phép truy cập. Khi bạn thực hiện xong thay đổi, hãy lưu và thoát khỏi file .

Cuối cùng, ta sẽ tạo và thêm user của bạn vào file . Ta sẽ sử dụng cờ -a để thêm vào file :

  • echo "sammy" | sudo tee -a /etc/vsftpd.userlist

Kiểm tra kỹ 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

Bây giờ ta đã sẵn sàng để thử nghiệm.

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 chắc chắn rằng đó là trường hợp.

User ẩn danh không thể kết nối : Ta đã vô hiệu hóa quyền truy cập ẩn danh. Ở đây ta sẽ kiểm tra điều đó bằng cách cố gắng kết nối ẩn danh. Nếu ta đã làm đúng cách, user ẩn danh sẽ bị từ chối cấp phép:

  • 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, ta sẽ thử kết nối với quyền là 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

sammy sẽ có thể kết nối, cũng như đọc và ghi file : Tại đây, ta đả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>

Ta sẽ thay đổi thành thư files , sau đó 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>

Ta sẽ quay lại ngay và cố gắng 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 , ta sẽ thực hiện các bước để bảo mật hơn nữa server của bạn .

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 cả thông tin đăng nhập của user , nên ta sẽ bật TTL / SSL để cung cấp mã hóa đó. Bước đầu tiên là tạo certificate SSL để sử dụng với vsftpd.

Ta sẽ sử dụng openssl để tạo certificate mới và sử dụng cờ -days để làm cho certificate có hiệu lực 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. Sau đó, bằng cách đặt cả -keyout-out về cùng một giá trị, private key và certificate sẽ nằm trong cùng một file .

Ta sẽ thực hiện việc này bằng lệnh sau:

  • 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 câu hỏi dưới đây:

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_IP_address 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 nên có hai dòng bắt đầu bằng rsa_ . Comment chúng để chúng trông giống như:

/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 tất cả truy cập được mã hóa nhưng có thể buộc user FTP của bạn phải 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 đó, ta sẽ cấu hình server để sử dụng TLS, người kế nhiệm ư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 

Khi bạn hoàn tất, hãy lưu file .

Bây giờ, ta cần 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ư :

  • 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, ta sẽ 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 bằng FileZilla vì nó hỗ trợ nhiều nền tảng. 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 bên dưới từ Tệp, 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ó 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.

Bạn phải đ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”, hãy 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 vào user FTP bạn đã tạo trong 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ấp vào “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.

Đố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 trái để xác nhận bạn có thể download file .

 Download  test.txt
Khi bạn đã thực hiện xong, 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 file lên.

Đổ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

Ta sẽ thêm một thông báo cho user biết lý do họ không thể đăng nhập. Dán vào phần sau:

#!/bin/sh echo "This account is limited to FTP access only." 

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, hãy 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ới quyền sammy:

  • ssh sammy@203.0.113.0

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 và bảo mật phpMyAdmin trên Ubuntu 16.04
2018-02-20
Cách thiết lập đường ống tích hợp liên tục với GitLab CI trên Ubuntu 16.04
2018-01-26
Cách cài đặt Swift và Vapor trên Ubuntu 16.04
2018-01-25
Cách cài đặt và cấu hình GitLab trên Ubuntu 16.04
2018-01-24
Cách cài đặt và bảo mật Grafana trên Ubuntu 16.04
2017-12-27
Cách cài đặt Prometheus trên Ubuntu 16.04
2017-12-14
Cách theo dõi cảnh báo Nagios với Alerta trên Ubuntu 16.04
2017-12-13
Cách cài đặt Elasticsearch, Logstash và Kibana (ELK Stack) trên Ubuntu 14.04
2017-12-01
Cách cài đặt và sử dụng TensorFlow trên Ubuntu 16.04
2017-12-01
Cách cài đặt Elasticsearch, Logstash và Kibana (ELK Stack) trên Ubuntu 14.04
2017-12-01