Cách bật sftp không cần truy cập shell trên ubuntu 20.04

Enable SFTP Without Shell

SFTP viết tắt của SSH File Transfer Protocol, là một cách an toàn để truyền tệp giữa các máy thông qua một kết nối SSH mã hóa. Mặc dù có tên gọi gần giống, nhưng đây là giao thức khác với FTP (File Transfer Protocol); SFTP được hỗ trợ rộng rãi bởi các ứng dụng FTP hiện đại.

SFTP có sẵn theo mặc định, không cần cấu hình bổ sung trên tất cả các máy chủ đã kích hoạt quyền truy cập SSH. Mặc dù SFTP an toàn và khá dễ sử dụng, một nhược điểm của nó là trong cấu hình tiêu chuẩn, máy chủ SSH cấp quyền truy cập truyền tệp và truy cập shell terminal cho tất cả người dùng có tài khoản trên hệ thống. Trong nhiều trường hợp, việc kiểm soát chi tiết quyền của người dùng sẽ an toàn hơn. Ví dụ, bạn có thể muốn cho phép một số người dùng chỉ được thực hiện truyền tệp, nhưng ngăn họ truy cập vào shell terminal của máy chủ qua SSH.

Trong hướng dẫn này, bạn sẽ cấu hình daemon SSH để giới hạn quyền truy cập SFTP chỉ trong một thư mục, không cho phép truy cập SSH trên cơ sở từng người dùng.

Yêu cầu

Để theo dõi hướng dẫn này, bạn cần có quyền truy cập vào một máy chủ Ubuntu 20.04. Máy chủ này cần có một tài khoản không phải root với quyền sudo, và có bật firewall. Để được trợ giúp trong việc thiết lập, hãy theo dõi Hướng dẫn Thiết lập Máy chủ Ban đầu cho Ubuntu 20.04.

Bước 1 – Tạo người dùng mới

Trước tiên, hãy tạo một người dùng mới mà chỉ được cấp quyền truyền tệp cho máy chủ. Ở đây, chúng ta sử dụng tên người dùng sammyfiles, nhưng bạn có thể sử dụng bất kỳ tên nào bạn muốn:

sudo adduser sammyfiles

Bạn sẽ được yêu cầu tạo mật khẩu cho tài khoản, sau đó nhập một số thông tin về người dùng. Các thông tin về người dùng là tùy chọn, vì vậy bạn có thể nhấn ENTER để bỏ qua các trường đó.

Bây giờ, bạn đã tạo xong một người dùng mới, người sẽ được cấp quyền truy cập vào thư mục bị hạn chế. Ở bước tiếp theo, bạn sẽ tạo thư mục truyền tệp và thiết lập các quyền cần thiết.

Bước 2 – Tạo thư mục truyền tệp

Để hạn chế quyền truy cập SFTP chỉ trong một thư mục, trước tiên bạn phải đảm bảo thư mục đó đáp ứng các yêu cầu về quyền truy cập của máy chủ SSH – các yêu cầu này khá nghiêm ngặt.

Cụ thể, thư mục đó và tất cả các thư mục cha của nó trong cây hệ thống tập tin phải thuộc quyền sở hữu của root và không được ghi đè bởi bất kỳ ai khác. Do đó, không thể cấp quyền truy cập hạn chế cho thư mục home của người dùng vì thư mục home thuộc quyền sở hữu của người dùng, không phải root.

Lưu ý: Một số phiên bản của OpenSSH không có yêu cầu nghiêm ngặt như vậy đối với cấu trúc và quyền sở hữu của thư mục, nhưng hầu hết các bản phân phối Linux hiện đại (bao gồm Ubuntu 20.04) đều yêu cầu.

Có một số cách để khắc phục vấn đề quyền sở hữu này. Trong hướng dẫn này, bạn sẽ tạo và sử dụng thư mục /var/sftp/uploads làm thư mục tải lên. Thư mục /var/sftp sẽ thuộc quyền root và không cho phép ghi bởi người dùng khác; thư mục con /var/sftp/uploads sẽ thuộc quyền của sammyfiles, cho phép người dùng này tải lên các tệp vào đó.

Trước tiên, tạo các thư mục:

sudo mkdir -p /var/sftp/uploads

Đặt chủ sở hữu của /var/sftp về root:

sudo chown root:root /var/sftp

Cấp quyền ghi cho root trên thư mục này, và chỉ cho phép người dùng khác quyền đọc và thực thi:

sudo chmod 755 /var/sftp

Thay đổi quyền sở hữu của thư mục uploads về cho người dùng bạn vừa tạo. Lệnh sau đây sử dụng ví dụ người dùng và nhóm sammyfiles; hãy thay đổi nếu bạn sử dụng tên khác:

sudo chown sammyfiles:sammyfiles /var/sftp/uploads

Bây giờ, khi cấu trúc thư mục đã được thiết lập, bạn có thể cấu hình máy chủ SSH.

Bước 3 – Giới hạn quyền truy cập trong một thư mục

Trong bước này, bạn sẽ sửa đổi cấu hình máy chủ SSH để không cho phép truy cập shell cho sammyfiles nhưng vẫn cho phép truyền tệp.

Mở file cấu hình máy chủ SSH bằng nano hoặc trình soạn thảo yêu thích của bạn:

sudo nano /etc/ssh/sshd_config

Cuộn xuống cuối file và thêm đoạn cấu hình sau:

Match User sammyfiles
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no

Giải thích các chỉ thị:

  • Match User: Chỉ thị này cho máy chủ SSH áp dụng các lệnh sau chỉ cho người dùng được chỉ định. Ở đây, chúng ta chỉ định sammyfiles. Nếu bạn sử dụng tên người dùng khác, hãy thay đổi cho phù hợp.

  • ForceCommand internal-sftp: Buộc máy chủ SSH chạy SFTP server khi đăng nhập, từ đó ngăn không cho truy cập shell.

  • PasswordAuthentication yes: Cho phép xác thực bằng mật khẩu cho người dùng này.

  • ChrootDirectory /var/sftp: Đảm bảo rằng người dùng không được truy cập vào bất cứ thứ gì bên ngoài thư mục /var/sftp.

  • AllowAgentForwarding no, AllowTcpForwarding no, X11Forwarding no: Vô hiệu hóa chuyển tiếp cổng, tunneling và chuyển tiếp X11 nhằm hạn chế thêm quyền truy cập của người dùng này vào máy chủ.

Bạn có thể sao chép đoạn cấu hình bắt đầu bằng Match User này cho các người dùng khác nếu cần, nhớ chỉnh sửa tên người dùng tương ứng.

Lưu ý: Bạn có thể bỏ qua dòng PasswordAuthentication yes và thiết lập SSH key để tăng cường bảo mật. Hãy tham khảo phần “Sao chép Khóa SSH Công khai” trong hướng dẫn SSH Essentials trước khi vô hiệu hóa truy cập shell cho người dùng.

Sau khi thêm các dòng này, lưu và đóng file. Nếu bạn dùng nano, nhấn CTRL + X, sau đó Y và nhấn ENTER.

Để áp dụng thay đổi, khởi động lại dịch vụ SSH:

sudo systemctl restart sshd

Bây giờ, bạn đã cấu hình máy chủ SSH để chỉ cho phép sammyfiles truy cập truyền tệp. Bước cuối cùng là kiểm tra cấu hình để đảm bảo nó hoạt động đúng như mong đợi.

Bước 4 – Kiểm tra cấu hình

Hãy đảm bảo rằng người dùng sammyfiles chỉ có thể truyền tệp. Như đã đề cập, SFTP được dùng để truyền tệp giữa các máy. Bạn có thể kiểm tra bằng cách thực hiện một giao dịch truyền tệp giữa máy cục bộ và máy chủ.

Trước tiên, hãy thử đăng nhập vào máy chủ với người dùng bạn đã tạo ở Bước 1. Do các thiết lập bạn đã thêm vào file cấu hình SSH, việc này sẽ không thành công:

ssh sammyfiles@your_server_ip

Bạn sẽ nhận được thông báo sau rồi quay trở lại prompt ban đầu:

Output
This service allows sftp connections only.
Connection to your_server_ip closed.

Điều này có nghĩa là sammyfiles không thể truy cập shell của máy chủ qua SSH.

Tiếp theo, kiểm tra xem người dùng có thể truy cập SFTP để truyền tệp thành công hay không:

sftp sammyfiles@your_server_ip

Thay vì thông báo lỗi, lệnh này sẽ tạo ra thông báo đăng nhập thành công với prompt tương tác:

Output
Connected to your_server_ip
sftp>

Bạn có thể liệt kê nội dung thư mục bằng lệnh ls tại prompt:

ls

Lệnh này sẽ hiển thị thư mục uploads mà bạn đã tạo ở bước trước và quay lại prompt sftp>:

uploads

Để kiểm tra rằng người dùng thực sự bị giới hạn trong thư mục này và không thể truy cập bất kỳ thư mục cha nào, bạn có thể thử chuyển sang thư mục cha:

cd ..

Lệnh này sẽ không báo lỗi nhưng sẽ liệt kê nội dung thư mục như cũ, chứng tỏ người dùng không thể chuyển sang thư mục cha.

Bây giờ, bạn đã xác minh rằng cấu hình hạn chế hoạt động đúng như mong đợi. Người dùng sammyfiles chỉ có thể truy cập máy chủ bằng giao thức SFTP để truyền tệp và không có khả năng truy cập shell đầy đủ.

Kết luận

Bạn đã giới hạn một người dùng chỉ có quyền truy cập SFTP vào một thư mục duy nhất trên máy chủ mà không có quyền truy cập shell đầy đủ. Mặc dù hướng dẫn này sử dụng một thư mục và một người dùng để ngắn gọn, bạn có thể mở rộng ví dụ này cho nhiều người dùng và nhiều thư mục.

Máy chủ SSH còn cho phép các cấu hình phức tạp hơn, bao gồm giới hạn quyền truy cập theo nhóm hoặc nhiều người dùng cùng lúc, hoặc thậm chí giới hạn truy cập từ các địa chỉ IP cụ thể. Bạn có thể tìm thấy các ví dụ về các tùy chọn cấu hình bổ sung và giải thích các chỉ thị có thể trong OpenSSH Cookbook. Nếu gặp vấn đề với SSH, bạn có thể sử dụng chuỗi hướng dẫn xử lý sự cố SSH để khắc phục.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *