Skip to main content

[Thủ Thuật Linux] Cách bật SFTP Without Shell Access trên CentOS 7

SFTP là gì

SFTP là viết tắt của SSH File Transfer Protocol. Như tên gọi của nó, đây là một cách an toàn để truyền tệp tới máy chủ bằng kết nối SSH được mã hóa.

Đây là một giao thức hoàn toàn khác với FTP (Giao thức truyền tệp), mặc dù nó đượ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 mà không cần cấu hình bổ sung trên tất cả các máy chủ đã bật quyền truy cập SSH.

Ưu điểm của nó an toàn và dễ sử dụng, nhưng có một nhược điểm 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à quyền truy cập từ terminal 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 để giới hạn quyền truy cập với SFTP vào một thư mục và và giới hạn quyền truy cập SSH trên cơ sở mỗi người dùng.

Bước 1: Tạo một người dùng

Bước đầu chúng ta cần chuẩn bị một user sammyfiles và đặt pass cho nó

# tạo user
sudo adduser sammyfiles

# đặt password
sudo passwd sammyfiles

Bước 2 - Tạo thư mục để truyền tệp (File Transfers)

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

Cụ thể, bản thân thư mục gốc và tất cả các thư mục phía trên nó trong hệ thống tệp phải thuộc quyền sở hữu của root và không thể ghi đè bởi bất kỳ ai khác.

Do đó, không thể chỉ cấp quyền truy cập hạn chế vào thư mục gốc của người dùng vì thư mục chính thuộc sở hữu của người dùng chứ không phải root.

Lưu ý: Một số phiên bản của OpenSSH không có các yêu cầu nghiêm ngặt 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ả CentOS 7) thì có.

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 đích. /var/sftp sẽ thuộc quyền sở hữu của người root và sẽ không thể đọc đượ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 có thể access và truyền tải tệp lên đó.

# tạo thư mục
sudo mkdir -p /var/sftp/uploads

# set quyền root
sudo chown root:root /var/sftp

#Cấp quyền  root cho thư mục và 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 thành sammyfiles.
sudo chown sammyfiles:sammyfiles /var/sftp/uploads

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 để không cho phép truy cập terminal đối với sammyfiles nhưng cho phép truy cập chuyển tệp.

Hãy mở tệp cấu hình máy chủ SSH 

sudo vi /etc/ssh/sshd_config

#Cuộn xuống cuối tệp và thê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

Giải thích đoạn config trê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 shell
  • PasswordAuthentication có 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 kỳ thứ gì ngoài thư mục /var/sftp. 
  • AllowAgentForwarding no, AllowTcpForwarding no và X11Forwarding no vô hiệu hóa chuyển port, tunneling và chuyển tiếp X11 cho người dùng này.

Config, 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.

Sau khi lưu lại config, bạn restart service

sudo systemctl restart sshd

Bước 4 - Kiểm tra

Hãy đảm bảo rằng người dùng sammyfiles của chúng tôi chỉ có thể chuyển tệp.

Đăng nhập vào máy chủ như sammyfiles sử dụng quyền truy cập shell thông thường sẽ không thể thực hiện được nữa. Hãy thử nó:

ssh sammyfiles@localhost

# nếu bạn nhận lỗi như dưới là config - ngăn ssh bằng shell đã thành công
Error message
This service allows sftp connections only.
Connection to localhost closed.

Tiếp tục test sftp cho viêcn chuyển file

sftp sammyfiles@localhost

# bạn sẽ nhận được message như sau
SFTP prompt
Connected to localhost.
sftp>

# sau đó bạn dùng lệnh cd .. và nhận lại lện lỗi.

Nguồn tham khảo: 

  1. https://www.digitalocean.com/community/tutorials/how-to-enable-sftp-without-shell-access-on-centos-7
  2. https://wiki.archlinux.org/title/SFTP_chroot