18/09/2018, 16:43

Làm thế nào để thiết lập vsftpd cho một thư mục của người dùng trên Ubuntu 16.04

Giới thiệu 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 các tệp giữa máy khách và máy chủ. Từ đó nó đã được thay thế bằng các cách phân phối tệp nhanh hơn, an toàn hơn và thuận tiện hơn. Nhiều người dùng Internet thông thường mong muốn ...

Giới thiệu

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 các tệp giữa máy khách và máy chủ. Từ đó nó đã được thay thế bằng các cách phân phối tệp nhanh hơn, an toàn hơn và thuận tiện hơn. Nhiều người dùng Internet thông thường mong muốn tải xuống trực tiếp từ trình duyệt web của họ httpsvà người dùng dòng lệnh có nhiều khả năng sử dụng các giao thức an toàn hơn như scp hoặc là sFTP.

FTP vẫn được sử dụng để hỗ trợ các ứng dụng cũ và luồng công việc với các nhu cầu rất cụ thể. Nếu bạn có lựa chọn giao thức để 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. Tối ưu hóa cho bảo mật, hiệu năng và tính ổ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 máy chủ 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, chúng tôi sẽ hướng dẫn bạn cách cấu hình vsftpd để cho phép người dùng tải tệp lên thư mục 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.

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

Để làm theo hướng dẫn này, bạn sẽ cần:

  • Máy chủ Ubuntu 16.04 với người dùng không phải root với sudo đặc quyền: Bạn có thể tìm hiểu thêm về cách thiết lập người dùng với các đặc quyền này trong Thiết lập máy chủ ban đầu với Ubuntu 16.04 hướng dẫn.

Một khi bạn có một máy chủ Ubuntu tại chỗ, bạn đã sẵn sàng để bắt đầu.

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

Chúng tôi sẽ bắt đầu bằng cách cập nhật danh sách gói của chúng tôi và cài đặt trình nền vsftpd:

sudo apt-get update

sudo apt-get install vsftpd

Khi quá trình cài đặt hoàn tất, chúng tôi sẽ sao chép tệp cấu hình để chúng tôi có thể bắt đầu với cấu hình trống, lưu bản gốc làm bản sao lưu.

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig

Với bản sao lưu của cấu hình tại chỗ, chúng tôi đã sẵn sàng để cấu hình tường lửa.

Bước 2 - Mở Firewall

Chúng tôi sẽ kiểm tra trạng thái tường lửa để xem liệu nó có được bật hay không. Nếu vậy, chúng tôi sẽ đảm bảo rằng lưu lượng truy cập FTP được cho phép, do đó bạn sẽ không chạy vào các quy tắc tường lửa chặn bạn khi đến lúc cần kiểm tra.

sudo ufw status

Trong trường hợp này, chỉ cho phép SSH thông qua:

OutputStatus: active

To Action  From
-- ------  ----
OpenSSH ALLOW   Anywhere
OpenSSH (v6)   ALLOW   Anywhere (v6)

Bạn có thể có các quy tắc khác tại chỗ hoặc không có quy tắc tường lửa nào cả. Chỉ vì ssh lưu lượng truy cập được cho phép trong trường hợp này, chúng tôi sẽ cần phải thêm quy tắc cho lưu lượng truy cập FTP.

Chúng ta sẽ cần mở cổng 20 và 21 cho FTP, cổng 990 cho sau này khi chúng ta kích hoạt TLS và các cổng 40000-50000 cho phạm vi các cổng thụ động mà chúng ta định đặt trong tệp 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 quy tắc tường lửa của chúng ta trông 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ài đặt và các cổng cần thiết mở, chúng tôi đã sẵn sàng để tiến hành bước tiếp theo.

Bước 3 - Chuẩn bị thư mục người dùng

Đối với hướng dẫn này, chúng ta sẽ tạo một người dùng, nhưng bạn có thể đã có một người dùng cần truy cập FTP. Chúng tôi sẽ cẩn thận để bảo vệ quyền truy cập của người dùng hiện tại vào dữ liệu của họ theo hướng dẫn tiếp theo. Mặc dù vậy, chúng tôi khuyên bạn nên bắt đầu với người dùng mới cho đến khi bạn đã định cấu hình và kiểm tra thiết lập của mình.

Trước tiên, chúng tôi sẽ thêm người dùng thử nghiệm:

sudo adduser sammy

Gán mật khẩu khi được nhắc và cảm thấy tự do để nhấn "ENTER" qua các lời nhắc khác.

FTP nói chung là an toàn hơn khi người dùng bị giới hạn trong một thư mục cụ thể.vsftpd hoàn thành điều này với chroot nhà tù. Khi nào chroot được kích hoạt cho người dùng cục bộ, chúng được giới hạn trong thư mục chính của họ theo mặc định. Tuy nhiên, vì cách này vsftpd bảo mật thư mục, người dùng không thể ghi được. Điều này là tốt cho một người dùng mới chỉ nên kết nối thông qua FTP, nhưng người dùng hiện tại có thể cần phải ghi vào thư mục chính của họ nếu họ cũng có quyền truy cập.

Trong ví dụ này, thay vì xóa các đặc quyền ghi từ thư mục chính, chúng ta sẽ tạo một ftp thư mục để phục vụ như chroot và có thể ghi files để giữ các tệp thực.

Tạo ftp thư mục, đặt quyền sở hữu của nó 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 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, chúng tôi sẽ tạo thư mục nơi tệp có thể được tải lên và gán quyền sở hữu cho người dùng:

sudo mkdir /home/sammy/ftp/files

sudo chown sammy:sammy /home/sammy/ftp/files

Quyền kiểm tra trên files thư mục phải trả về những điều 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, chúng tôi sẽ thêm test.txt tệp để sử dụng khi chúng tôi kiểm tra sau:

echo "vsftpd test file" | sudo tee /home/sammy/ftp/files/test.txt

Bây giờ chúng tôi đã bảo đảm ftp và cho phép người dùng truy cập vào files thư mục, chúng tôi sẽ chuyển sự chú ý đến cấu hình.

Bước 4 - Cấu hình truy cập FTP

Chúng tôi đang lên kế hoạch cho phép một người dùng có tài khoản shell cục bộ kết nối với FTP. Hai cài đặt chính cho điều này đã được đặt vsftpd.conf. Bắt đầu bằng cách mở tệp cấu hình để xác minh rằng các cài đặt trong cấu hình của bạn khớp với các cài đặt dưới đây:

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, chúng ta sẽ cần phải thay đổi một số giá trị trong tệp. Để cho phép người dùng tải tệp lên, chúng tôi sẽ bỏ ghi chú write_enable thiết lập để chúng tôi có:

/etc/vsftpd.conf

. . .
write_enable=YES
. . .

Chúng tôi cũng sẽ bỏ ghi chú chroot để ngăn người dùng được kết nối FTP truy cập bất kỳ tệp hoặc lệnh nào bên ngoài cây thư mục.

/etc/vsftpd.conf

. . .
chroot_local_user=YES
. . .

Chúng tôi sẽ thêm một user_sub_token để chèn tên người dùng vào local_root directory đường dẫn để cấu hình của chúng tôi sẽ hoạt động cho người dùng này và bất kỳ người dùng nào trong tương lai có thể được thêm vào.

/etc/vsftpd.conf

user_sub_token=$USER
local_root=/home/$USER/ftp

Chúng tôi sẽ giới hạn phạm vi của các cổng có thể được sử 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

Chú thích: Chúng tôi đã mở trước các cổng mà chúng tôi đã đặt ở đây cho phạm vi cổng thụ động. Nếu bạn thay đổi các giá trị, hãy chắc chắn cập nhật cài đặt tường lửa của bạn.

Vì chúng tôi chỉ lên kế hoạch cho phép truy cập FTP theo từng trường hợp, chúng tôi sẽ thiết lập cấu hình để quyền truy cập chỉ được cung cấp cho người dùng khi họ được thêm vào danh sách chứ không phải 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Ó", người dùng trong danh sách bị từ chối truy cập FTP. Khi được đặt thành "KHÔNG", chỉ người dùng 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 tệp.

Cuối cùng, chúng tôi sẽ tạo và thêm người dùng của chúng tôi vào tệp. Chúng tôi sẽ sử dụng -a gắn cờ vào tệp:

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ờ chúng tôi đã sẵn sàng để thử nghiệm.

Bước 5 - Kiểm tra truy cập FTP

Chúng tôi đã định cấu hình máy chủ để chỉ cho phép người dùng sammy để kết nối qua FTP. Hãy chắc chắn rằng đó là trường hợp.

Người dùng ẩn danh không thể kết nối: Chúng tôi đã vô hiệu hóa quyền truy cập ẩn danh. Ở đây chúng tôi sẽ kiểm tra điều đó bằng cách cố gắng kết nối nặc danh. Nếu chúng tôi đã thực hiện đúng cách, người dùng ẩn danh sẽ bị từ chối quyề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

Người dùng ngoài sammy không nên kết nối: Tiếp theo, chúng tôi sẽ thử kết nối với tư cách là sudo người dùng. Họ cũng nên bị từ chối truy cập và điều đó sẽ xảy ra trước khi họ được phép nhập mật khẩu của họ.

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 có thể kết nối, cũng như đọc và ghi tệp: Ở đây, chúng tôi sẽ đảm bảo rằng người dùng được chỉ định của chúng tôi _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>

Chúng tôi sẽ thay đổi thành files thư mục, sau đó sử dụng get lệnh để truyền tệp thử nghiệm mà chúng tôi đã tạo trước đó cho máy cục bộ của chúng tôi:

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>

Chúng tôi sẽ quay lại ngay và thử tải tệp lên bằng 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ờ chúng tôi đã thử nghiệm cấu hình của mình, chúng tôi sẽ thực hiện các bước để đảm bảo an toàn hơn cho máy chủ của chúng tôi.

Bước 6 - Bảo đảm giao dịch

Vì FTP thực hiện không phải mã hóa bất kỳ dữ liệu nào trong quá cảnh, bao gồm thông tin đăng nhập của người dùng, chúng tôi sẽ bật TTL / SSL để cung cấp mã hóa đó. Bước đầu tiên là tạo chứng chỉ SSL để sử dụng với vsftpd.

Chúng tôi sẽ sử dụng openssl để tạo chứng chỉ mới và sử dụng -days để làm cho nó hợp lệ trong một năm. Trong cùng một lệnh, chúng ta sẽ thêm một khóa RSA 2048 bit riêng. Sau đó, bằng cách đặt cả hai -keyout và -out cờ đến cùng một giá trị, khóa riêng và chứng chỉ sẽ được đặt trong cùng một tệp.

Chúng ta sẽ làm điều này với 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 nhắc cung cấp thông tin địa chỉ cho chứng chỉ của mình. Thay thế thông tin của riêng 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ờ chứng chỉ, hãy xem OpenSSL Essentials: Làm việc với Chứng chỉ SSL, Khóa riêng và CSR

Khi bạn đã tạo chứng chỉ, hãy mở vsftpd lại tập tin cấu hình:

sudo nano /etc/vsftpd.conf

Về phía cuối tệp, bạn nên bắt đầu bằng hai dòng rsa_. Bình luận chúng ra để 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 chứng chỉ và khóa cá nhân mà chúng 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 đó, chúng tôi sẽ buộc sử dụng SSL, điều này sẽ ngăn các máy khách không thể xử lý TLS khi kết nối. Điều này là cần thiết để đảm bảo tất cả lưu lượng truy cập được mã hóa nhưng có thể buộc người dùng FTP của bạn thay đổi khách hàng. Thay đổi ssl_enable đến YES:

/etc/vsftpd.conf

ssl_enable=YES

Sau đó, thêm các dòng sau để từ chối một cách rõ ràng các kết nối vô danh qua SSL và yêu cầu SSL cho cả 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 đó, chúng tôi sẽ cấu hình máy chủ để sử dụng TLS, người kế thừa được ư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, chúng tôi sẽ thêm hai tùy chọn khác. Đầu tiên, chúng tôi sẽ không yêu cầu sử dụng lại SSL vì nó có thể phá vỡ nhiều máy khách FTP. Chúng tôi sẽ yêu cầu bộ mã hóa mã hóa "cao", hiện có 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 và đóng tệp.

Bây giờ, chúng ta cần khởi động lại máy chủ để các thay đổi có hiệu lực:

sudo systemctl restart vsftpd

Tại thời điểm này, chúng tôi sẽ không thể kết nối với một ứng dụng dòng lệnh không an toàn nữa. Nếu chúng tôi đã thử, chúng tôi sẽ thấy một cái gì đó 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, chúng tôi sẽ xác minh rằng chúng tôi có thể kết nối bằng máy khách hỗ trợ TLS.

Bước 7 - Thử nghiệm TLS với FileZilla

Hầu hết các máy khách FTP hiện đại có thể được cấu hình để sử dụng mã hóa TLS. Chúng tôi sẽ chứng minh làm thế nào để kết nối bằng cách sử dụng FileZilla vì hỗ trợ nền tảng chéo 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 bên dưới Tệp từ, biểu tượng ngoài cùng bên trái ở hàng trên cùng. Nhấp vào nó:

Site Manager 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:

New Site Button
Trong "Trang web của tôi", 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.

Bạn phải điền vào trường "Máy chủ lưu trữ" với tên hoặc địa chỉ IP. Trong trình đơn thả xuống "Mã hóa", chọn "Yêu cầu FTP rõ ràng trên TLS".

Đối với "Loại đăng nhập", chọn "Yêu cầu mật khẩu". Điền vào người dùng FTP bạn đã tạo trong trường "Người dùng":

General Settings Tab
Nhấp vào "Kết nối" ở cuối giao diện. Bạn sẽ được yêu cầu nhập mật khẩu của người dùng:

Password Dialogue
Nhấp "OK" để kết nối. Bây giờ bạn sẽ được kết nối với máy chủ của bạn với mã hóa TLS / SSL.

Site Certificate Dialogue
Khi bạn đã chấp nhận chứng chỉ, hãy nhấp đúp vào files thư mục và kéo upload.txt sang bên trái để xác nhận rằng bạn có thể tải xuống tệp.

Download test.txt
Khi bạn đã thực hiện điều đó, hãy nhấp chuột phải vào bản sao cục bộ, đổi tên nó thành upload-tls.txt` và kéo nó trở lại máy chủ để xác nhận rằng bạn có thể tải tệp lên.

Rename and Upload
Bạn đã xác nhận rằng bạn có thể chuyển an toàn và thành công các tệp có bật SSL / TLS.

Bước 8 - Vô hiệu hóa Shell Access (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 của người dùng FTP để đăng nhập theo bất kỳ cách nào khác. Một cách khá đơn giản để ngăn chặn nó là tạo ra một trình bao 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 một tài khoản bị xâm nhập vào các tệp có thể truy cập được bằng FTP.

Đầu tiên, mở một tệp có tên ftponly trong thư mục bin:

sudo nano /bin/ftponly

Chúng tôi sẽ thêm một thông báo cho người dùng biết tại sao họ không thể đăng nhập. Dán vào các mục sau:

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

Thay đổi quyền để làm cho tệp 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/shells

. . .
/bin/ftponly

Cập nhật shell của người dùng bằng lệnh sau:

sudo usermod sammy -s /bin/ftponly

Bây giờ hãy thử đăng nhập dưới dạng sammy:

ssh sammy@203.0.113.0

Bạn sẽ thấy một cái gì đó như:

OutputThis account is limited to FTP access only.
Connection to 203.0.113.0 closed.

Điều này xác nhận rằng người dùng không còn có thể ssh đến máy chủ và chỉ giới hạn truy cập FTP.

Phần kết luận

Trong hướng dẫn này, chúng tôi đã đề cập đến việc thiết lập FTP cho người dùng bằng tài khoản cục bộ. Nếu bạn cần sử dụng nguồn xác thực bên ngoài, bạn có thể muốn xem xét sự hỗ trợ của người dùng ảo của vsftpd. Điều này cung cấp một tập hợp 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ể chuyển đổi và là một lựa chọn tốt nếu bạn quản lý người dùng trong một hệ thống khác như LDAP hoặc Kerberos.

0