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ớ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, 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 :
- Server Ubuntu 16.04 với user không phải root có quyền
sudo
: Bạn có thể tìm hiểu thêm về cách cài đặt user có các quyền này trong hướng dẫn Cài đặt server ban đầu với Ubuntu 16.04 của ta .
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:
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.
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ư:
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ở, 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
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, 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
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, 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
. . . # 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ó:
. . . 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 . . .
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.
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:
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:
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
Outputsammy
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
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, 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
OutputConnected 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
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>
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
Output227 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
Output227 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
và -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:
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_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ư:
# 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 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
:
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 đó, 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:
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
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ó:
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 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 ":
Nhấp vào “Kết nối” ở cuối giao diện. Bạn cần nhập password của user :
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.
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 .
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.
Đế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:
. . . /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ư :
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
Cách cài đặt và bảo mật phpMyAdmin trên Ubuntu 16.042018-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