SFTP là viết tắt của SSH File Transfer Protocol (Giao thức truyền tệp SSH) và là một cách an toàn để truyền tệp giữa các máy bằng kết nối SSH được mã hóa. Mặc dù có tên giống nhau, đây là một giao thức khác với FTP (File Transfer Protocol - Giao thức truyền tệp), nhưng SFTP được hỗ trợ rộng rãi bởi các máy khách FTP hiện đại.
SFTP khả dụng theo mặc định mà không cần cấu hình bổ sung trên tất cả các máy chủ có bật quyền truy cập SSH. Mặc dù nó an toàn và khá dễ sử dụng, nhưng một nhược điểm của SFTP là ở 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 đầu cuối 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, sẽ an toàn hơn khi áp dụng kiểm soát chi tiết đối với quyền của người dùng. Ví dụ: bạn có thể muốn cho phép một số người dùng nhất định chỉ thực hiện truyền tệp, nhưng ngăn không cho họ có được quyền truy cập đầu cuối vào máy chủ qua SSH.
Trong hướng dẫn này, bạn sẽ thiết lập SSH daemon để giới hạn quyền truy cập SFTP vào một thư mục không được phép truy cập SSH trên cơ sở mỗi người dùng.
Để làm theo hướng dẫn này, bạn sẽ cần quyền truy cập vào máy chủ Ubuntu 20.04. Máy chủ này phải có non-root user với quyền sudo, cũng như bật tường lửa. Để được trợ giúp thiết lập điều này, hãy làm theo Hướng dẫn thiết lập máy chủ ban đầu cho Ubuntu 20.04 của chúng tôi.
Trước tiên, hãy tạo một người dùng mới, người này sẽ chỉ được cấp quyền truy cập truyền tệp vào máy chủ. Ở đây, chúng tôi đang sử dụng tên người dùng sammyfiles, nhưng bạn có thể sử dụng bất kỳ tên người dùng nào bạn muốn:
- sudo adduser sammyfiles
Bạn sẽ được nhắc tạo mật khẩu cho tài khoản, theo sau là một số thông tin về người dùng. Thông tin người dùng là tùy chọn, vì vậy bạn có thể nhấn ENTER để bỏ trống các trường đó.
Bây giờ bạn đã tạo một người dùng mới sẽ được cấp quyền truy cập vào thư mục bị hạn chế. Trong 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.
Để hạn chế quyền truy cập SFTP vào một thư mục, trước tiên bạn phải đảm bảo rằng thư mục đó tuân thủ các yêu cầu về quyền của máy chủ SSH, vốn rất cụ thể.
Cụ thể, bản thân thư mục và tất cả các thư mục trước nó trong cây hệ thống tệp phải được sở hữu bởi 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ế vào thư mục chính của người dùng vì các thư mục chính thuộc sở hữu của người dùng, không phải root.
Lưu ý: Một số phiên bản OpenSSH không có các yêu cầu khắt khe như vậy đối với cấu trúc thư mục và quyền sở hữu, nhưng hầu hết các bản phân phối Linux hiện đại (bao gồm cả Ubuntu 20.04) đều có.
Có một số cách để giải quyết vấn đề về quyền sở hữu này. Trong hướng dẫn này, bạn sẽ tạo và sử dụng /var/sftp/uploads làm thư mục tải lên đích. /var/sftp sẽ được sở hữu bởi root và sẽ không thể ghi được bởi những người dùng khác; thư mục con /var/sftp/uploads sẽ thuộc sở hữu của sammyfiles, do đó người dùng sẽ có thể tải tệp lên đó.
Đầu tiên, tạo các thư mục:
- sudo mkdir -p /var/sftp/uploads
Đặt chủ sở hữu của /var/sftp thành root:
- sudo chown root:root /var/sftp
Cấp quyền ghi root cho cùng một thư mục và chỉ cấp cho 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 trên thư mục tải lên thành người dùng bạn vừa tạo. Lệnh dưới đây lại sử dụng ví dụ về người dùng và nhóm sammyfiles, vì vậy hãy chắc chắn thay đổi điều này nếu bạn đã đặt tên khác cho người dùng mà bạn đã tạo:
- sudo chown sammyfiles:sammyfiles /var/sftp/uploads
Bây giờ cấu trúc thư mục đã sẵn sàng, bạn có thể tự cấu hình máy chủ SSH.
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 thiết bị đầu cuối đối với sammyfiles nhưng cho phép truy cập truyền tệp.
Mở tệp cấu hình máy chủ SSH bằng nano hoặc trình soạn thảo văn bản yêu thích của bạn:
- sudo nano /etc/ssh/sshd_config
Cuộn xuống cuối tệp và thêm đoạn mã cấu hình sau:
Match User sammyfiles
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
Đây là những gì mỗi chỉ thị làm:
Match User yêu cầu máy chủ SSH chỉ áp dụng các lệnh sau cho người dùng được chỉ định. Ở đây, chúng tôi chỉ định sammyfiles. Một lần nữa, hãy đảm bảo cập nhật tên người dùng này bằng tên người dùng của riêng bạn, nếu khác.ForceCommand internal-sftp buộc máy chủ SSH chạy máy chủ SFTP khi đăng nhập, không cho phép truy cập shell.PasswordAuthentication yes cho phép xác thực mật khẩu cho người dùng này.ChrootDirectory /var/sftp/ đảm bảo rằng người dùng sẽ không được phép truy cập vào bất cứ thứ gì ngoài thư mục /var/sftp.AllowAgentForwarding no, AllowTcpForwarding no và X11Forwarding no lần lượt tắt tính năng chuyển tiếp cổng, tạo đường hầm và chuyển tiếp X11. Mục đích của việc thêm các chỉ thị này là để hạn chế hơn nữa quyền truy cập của người dùng này vào máy chủ.Tập lệnh này, bắt đầu với Match User, cũng có thể được sao chép và lặp lại cho những người dùng khác nhau. Đảm bảo sửa đổi tên người dùng trong dòng Match User cho phù hợp.
Lưu ý: Bạn có thể bỏ qua dòng PasswordAuthentication yes và thiết lập quyền truy cập khóa SSH để tăng cường bảo mật. Làm theo phần Copying your Public SSH Key trong hướng dẫn SSH Essentials: Working with SSH Servers, Clients, and Keys để thực hiện. Đảm bảo thực hiện việc này trước khi bạn vô hiệu hóa quyền truy cập shell cho người dùng.
Trong bước tiếp theo, chúng ta sẽ kiểm tra cấu hình bằng cách SSH cục bộ bằng quyền truy cập mật khẩu, nhưng nếu thiết lập SSH key, bạn sẽ cần quyền truy cập vào máy tính bằng cặp khóa của người dùng.
Sau khi thêm những dòng này, hãy lưu và đóng tệp. Nếu bạn đang sử dụng nano, bạn có thể thực hiện việc này bằng cách nhấn CTRL + X, rồi nhấn Y, rồi nhấn ENTER.
Để áp dụng các thay đổi cấu hình, hãy khởi động lại dịch vụ:
- sudo systemctl restart sshd
Bây giờ bạn đã thiết lập cấu hình máy chủ SSH để hạn chế quyền truy cập vào việc truyền tệp chỉ dành cho sammyfiles. Bước cuối cùng là kiểm tra cấu hình để đảm bảo cấu hình hoạt động như dự định.
Hãy đảm bảo rằng người dùng sammyfiles mới của chúng ta chỉ có thể truyền tệp. Như đã đề cập trước đây, SFTP được sử dụng để truyền tệp giữa các máy. Bạn có thể xác minh điều này hoạt động bằng cách kiểm tra quá trình chuyển giữa máy cục bộ và máy chủ của bạn.
Trước tiên, hãy thử đăng nhập vào máy chủ của bạn với tư cách là người dùng bạn đã tạo ở Bước 1. Do các cài đặt bạn đã thêm vào tệp cấu hình SSH nên điều này sẽ không thể thực hiện được:
- ssh sammyfiles@your_server_ip
Bạn sẽ nhận được thông báo sau trước khi quay lại lời nhắc ban đầu:
OutputThis service allows sftp connections only.
Connection to your_server_ip closed.
Điều này có nghĩa là sammyfiles không còn có thể truy cập server shell bằng SSH.
Tiếp theo, hãy xác minh xem người dùng có thể truy cập thành công SFTP để truyền tệp hay không:
- sftp sammyfiles@your_server_ip
Thay vì thông báo lỗi, lệnh này sẽ tạo thông báo đăng nhập thành công với lời nhắc tương tác:
OutputConnected to your_server_ip
sftp>
Bạn có thể liệt kê nội dung thư mục bằng ls trong lời nhắc:
- ls
Thao tác này sẽ hiển thị thư mục tải lên đã được tạo ở bước trước và đưa bạn trở lại dấu nhắc sftp>:
Outputuploads
Để xác minh rằng người dùng thực sự bị hạn chế đối với thư mục này và không thể truy cập vào bất kỳ thư mục nào trước đó, bạn có thể thử thay đổi thư mục về thư mục trước đó:
- 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ư trước mà không thay đổi, chứng tỏ rằng người dùng không thể chuyển sang thư mục mẹ.
Bây giờ bạn đã xác minh rằng cấu hình hạn chế hoạt động như dự kiến. Người dùng sammyfiles mới được tạo 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 full shell.
Bạn đã hạn chế 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 full shell. Trong khi hướng dẫn này chỉ sử dụng một thư mục và một người dùng để cho 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 thậm chí còn cho phép các sơ đồ cấu hình phức tạp hơn, bao gồm giới hạn quyền truy cập vào các nhóm hoặc nhiều người dùng cùng một lúc, hoặc thậm chí giới hạn quyền truy cập vào một số địa chỉ IP nhất định. 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 về các lệnh có thể có trong OpenSSH Cookbook. Nếu bạn gặp phải bất kỳ sự cố nào với SSH, bạn có thể gỡ lỗi và khắc phục chúng bằng loạt bài khắc phục sự cố SSH này.