Cách kích hoạt SFTP mà không có Shell Access trên Ubuntu 16.04

6 năm trước

 

Giới thiệu

SFTP là viết tắt của SSH File Transfer Protocol. Như tên gọi, nó là một cách an toàn để chuyển các tập tin đến một máy chủ bằng cách sử dụng kết nối SSH được mã hóa. Mặc dù tên là SFTP, nó là một giao thức hoàn toàn khác so với FTP (File Transfer Protocol),mặc dù nó được hỗ trợ rộng rãi bởi các máy khách FTP hiện đại.

SFTP có sẵn theo mặc định mà không có cấu hình bổ sung trên tất cả các máy chủ đã bật quyền truy cập SSH. Nó an toàn và dễ sử dụng, nhưng có nhược điểm: 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 trình bao đầu cuối cho tất cả người dùng có tài khoản trên hệ thống.

Trong một số trường hợp, bạn có thể chỉ muốn một số người dùng nhất định được phép chuyển tệp và không có quyền truy cập SSH. Trong hướng dẫn này, chúng tôi sẽ thiết lập SSH daemon để hạn chế quyền truy cập SFTP vào một thư mục không có quyền truy cập SSH được cho phép trên mỗi người dùng.

 

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

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

 

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

Đầu tiên, tạo một người dùng mới, người sẽ chỉ được cấp quyền truy cập truyền tệp vào máy chủ. Ở đây đ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 thích.

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 hợp đó.

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, chúng ta sẽ tạo thư mục cho việ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 để chuyển tệp

Để hạn chế quyền truy cập SFTP vào một thư mục, trước tiên chúng ta phải đảm bảo thư mục tuân thủ các yêu cầu quyền của máy chủ SSH, điều này rất cụ thể.

Cụ thể, thư mục chính nó và tất cả các thư mục trên nó trong cây hệ thống tập tin phải được sở hữu bởi  root và không sửa được bởi bất cứ ai khác. Do đó, nó không thể chỉ đơn giản là cung cấp cho giới hạn truy cập vào thư mục home của người dùng bởi vì các thư mục home được sở hữu bởi người sử 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 nghiêm ngặt đố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 Ubuntu 16.04) đều có.

Có một số cách để giải quyết vấn đề quyền sở hữu này. Trong hướng dẫn này, chúng tôi 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ể được sử dụng bởi những người dùng khác; thư mục con /var/sftp/uploads sẽ được sở hữu bởi 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

 

Cho phép ghi quyền root vào cùng thư mục và chỉ cho phép người dùng khác đọc và thực thi quyền.

sudo chmod 755 /var/sftp

 

Thay đổi quyền sở hữu trên thư mục uploads thành tệp sammyfiles.

sudo chown sammyfiles:sammyfiles /var/sftp/uploads

 

Bây giờ cấu trúc thư mục đã có sẵn, chúng ta có thể cấu hình máy chủ SSH.

 

Bước 3 - Hạn chế quyền truy cập vào một thư mục

Trong bước này, chúng tôi sẽ sửa đổi cấu hình máy chủ SSH để vô hiệu hóa quyền truy cập đầu cuối cho 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

 

 Xuống cuối tệp và nối thêm đoạn mã cấu hình sau:

/etc/ssh/sshd_config
. . .
Match User sammyfilesForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no

Sau đó lưu và đóng tệp.

Dưới đây là những gì mỗi chỉ thị đó thực hiện:

  •  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.
  •  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 trình bao.
  •  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 không được phép truy cập vào bất kỳ thứ gì ngoài thư mục /var/sftp
  • AllowAgentForwarding noAllowTcpForwarding no. và X11Forwarding no vô hiệu hóa chuyển tiếp cổng, đường hầm và chuyển tiếp X11 cho người dùng này.

Tập hợp các lệnh này, bắt đầu với Match User, 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 ý: Có thể bỏ qua dòng PasswordAuthentication yes và thay vào đó thiết lập quyền truy cập khóa SSH để tăng cường bảo mật. Thực hiện theo Copying your Public SSH Key của hướng dẫn SSH Essentials: Working with SSH Servers, Clients, and Keys. Đảm bảo thực hiện việc này trước khi vô hiệu hóa quyền truy cập trình bao cho người dùng.

Trong bước tiếp theo, chúng tôi sẽ kiểm tra cấu hình với SSH tại địa phương bằng cách truy cập mật khẩu, nhưng nếu thiết lập khóa SSH, cần truy cập vào máy tính bằng cặp khóa của người dùng.

 

Để á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 đã cấu hình máy chủ SSH để hạn chế quyền truy cập vào truyền tệp chỉ cho các tệp 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ự kiến.

 

Bước 4 - Xác minh cấu hình

Hãy đảm bảo rằng người dùng sammyfiles mới chỉ có thể truyền tệp.

Việc đăng nhập vào máy chủ dưới dạng sammyfiles khi sử dụng truy cập shell bình thường sẽ không thể thực hiện được nữa. Hãy thử:

ssh sammyfiles@localhost

 

Bạn sẽ thấy thông báo sau trước khi được trả về lời nhắc ban đầu của mình:

Error messageThis service allows sftp connections only. 
Connection to localhost closed.
 

Điều này có nghĩa là sammyfiles không còn có thể truy cập vào trình bao máy chủ bằng SSH nữa.

Tiếp theo, hãy xác minh xem người dùng có thể truy cập thành công SFTP để chuyển tệp không.

sftp sammyfiles@localhost

 

Thay vì thông báo lỗi, lệnh này sẽ hiển thị thông báo đăng nhập thành công với dấu nhắc tương tác.

SFTP promptConnected to localhost. 
sftp>

Bạn có thể liệt kê các nội dung thư mục bằng cách sử dụng ls trong dấu nhắc:

sftp> ls

 

Thao tác này sẽ hiển thị thư mục uploads đã được tạo ở bước trước và đưa bạn trở lại dấu nhắc sftp>.

SFTP file list 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 bất kỳ thư mục nào ở trên thư mục đó, bạn có thể thử thay đổi thư mục thành thư mục ở trên nó.

sftp> cd ..

 

Lệnh này sẽ không đưa ra lỗi, nhưng việc liệt kê nội dung thư mục như trước sẽ không có thay đổi, chứng minh rằng người dùng không thể chuyển sang thư mục mẹ.

Bây giờ bạn đã xác minh cấu hình bị hạn chế hoạt động như dự định. Người dùng Sammyfiles mới được tạo có thể truy cập vào máy chủ chỉ bằng giao thức SFTP để truyền tệp và không có khả năng truy cập vào toàn bộ trình bao.

 

Kết luận

Bạn đã hạn chế người dùng truy cập chỉ 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 đầy đủ. 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 cho phép các lược đồ 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 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 các chỉ thị có thể có trong OpenSSH Cookbook. Nếu 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 SSH khắc phục sự cố này.

Tìm hiểu nhiều điều thú vị hơn tại Vicloud!