Hướng dẫn kích hoạt SFTP mà không cần truy cập shell trên CentOS 7

4 năm trước

 

Giới thiệu

SFTP là viết tắt của SSH File Transfer Protocol. Đúng như cái tên của nó, đây là một cách an toàn để chuyển các file tới server sử dụng kết nối SSH đã được mã hoá. Dù tên nó như vậy nhưng nó là giao thức hoàn toàn khác với FTP ( File Transfer Protoco) dù nó được hỗ trợ rộng rãi bởi các client FTP hiện đại.

SFTP có sẵn theo mặc định mà không cần các cấu hình bổ sung trên tất cả những server có quyền truy cập SSH được bật.Nó an toàn và dễ sử dụng nhưng cũng đi kèm với một vài bất tiện: trong cấu hình tiêu chuẩn, server SFTP cấp quyền truy cập truyền file và quyền truy cập vào vỏ thiết bị cuối tới tất cả người dùng chỉ với một tài khoản trong hệ thống.

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

 

Điều kiện cần

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

  • Một server CentOS7 bao gồm một người dùng sudo chưa root. Xem thêm Hướng dẫn thiết lập ban đầu cho server chạy Centos 7.
  • Trình chỉnh sửa văn bản nano tuỳ chọn được cài đặt yum install nano . CentOS sẽ đi kèm với trình chỉnh sửa văn bản vi theo mặc định, nhưng nano có thể hiệu quả hơn.
 

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

Đầu tiên hãy tạo một người dùng mới được cấp phép quyền chuyển file tới server. Ở đây chúng ta sẽ dùng tên người dùng là , nhưng bạn có thể dùng bất cứ tên nào mà bạn thích.

$ sudo adduser sammyfiles

Tiếp theo nhập password cho người dùng mới:

$ sudo passwd sammyfiles

Nhập một mật khẩu có bảo mật tốt và nhập lại để xác minh nó.

Bạn đã tạo một người dùng mới đã được cho phép truy cập tệp bị hạn chế. Trong bước tiếp theo chúng ta sẽ tạo tệp để chuyển file và thiết lập quyền cho phép cần thiết.

 

Bước 2 — Tạo thư mục để chuyển file

Để hạn chế truy cập SFTP tới một thư mục, đầu tiên chúng ta cần đảm bảo rằng thư mục đó tuân theo những yêu cầu cho phép rất đặc biệt của server SSH.

Đặc biệt,bản thân thư mục và tất cả thư mục trên đó trên cây hệ thống file phải được sở hữu bởi root và không thể viết bởi ai khác. Do đó, dễ dàng cho phép truy cập hạn chế tới thư mục chính của người dùng bởi vì các thư mục chính được sở hữu bởi người dùng chứ không phải root.

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

Có rất nhiều các để làm việc xung quanh vấn đề sở hữu nào. Trong bài hướng dẫn này, chúng ta sẽ tạo và sử dụng /var/sftp/uploads làm thư mục tải lên./var/sftp sẽ được sở hữu bởi root và không thể viết lại bởi người dùng khác;  thư mục con /var/sftp/uploads sẽ được sở hữu bởi sammyfiles, cho nên người dùng có thể upload file lên

Đầu tiên tạo thư mục.

$ sudo mkdir -p /var/sftp/uploads

Chuyển người sở hữu/var/sftp thành root.

$ sudo chown root:root /var/sftp

Give root write permissions to the same directory, and give other users only read and execute rights.

Cho root quyền viết cho cùng thư mục và cho người dùng khác chỉ đọc và thực hiện quyền

$ sudo chmod 755 /var/sftp

Chuyển quyền sở hữu trên uploads thư mục cho cho sammyfiles.

$ sudo chown sammyfiles:sammyfiles /var/sftp/uploads

Bây giờ cấu trúc thư mục đã sẵn sàng hoạt động, chúng ta có thể tạo cấu hình cho bản thân server SSH.

 

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

Trong bước này, chúng ta sẽ sửa đổi đổi cấu hình server SSH để không cho phép quyền truy cập thiết bị cuối cho sammyfiles nhưng cho phép truy cập chuyển file.

Mở file cấu hình server với vi hoặc trình chỉnh sửa văn bản yêu thích của bạn.

$ sudo vi /etc/ssh/sshd_config

Kéo xuống dưới file và nối đoạn cấu hình dưới đây:

/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 file lại.

Đây là những gì mà mỗi chỉ thị đó làm:

  • Match User chỉ cho server SSH để áp dụng những command dưới đây chỉ cho những người dùng cụ thể, cụ thể là sammyfiles. 
  • ForceCommand internal-sftp buộc server SSH hoạt động trên máy chủ SFTP khi đăng nhập, không cho phép truy cập vỏ.
  • PasswordAuthentication yes  cho phép xác thực mật khẩu cho người dùng này.
  • ChrootDirectory /var/sftp/ chắc chắn rằng người dùng sẽ không được cho phép truy cập vào bất cứ thứ gì vượt quá thư mục /var/sftp.
  • AllowAgentForwarding noAllowTcpForwarding no. and X11Forwarding no vô hiệu quá chuyển tiếp cổng, tunneling và chuyển tiếp X11 cho người dùng này.

Tập lệnh này bắt đầu với Match User cũng có thể được copy và lặp lại với người dùng khác.Đảm bảo sửa đổi tên người dùng ở dòng Match User

Lưu ý:Bạn có thể bỏ dòng PasswordAuthentication yes và cài đặt quyền truy cập chính để nâng cao bảo mật.  Bảo đảm rằng bạn phải vô hiệu hoá quyền truy cập shell với người dùng trước đó.Trong bước tiếp theo, chúng ta sẽ test cấu hình bằng SSH cục bộ với truy cập password, nhưng nếu bạn đã cài đặt bàn phím SSH thì bạn sẽ cần truy cập tới máy tính với keypair của người dùng.

Để lưu những thay đổi cấu hình, khởi động lại dịch vụ.

$ sudo systemctl restart sshd

Bây giờ bạn đã tạo cấu hình cho server SSH để hạn chế truy vậy với di chuyển file chỉ cho sammyfiles. Bước cuối cùng sẽ là test cấu hình để bảo đảm rằng nó sẽ hoạt động như mong muốn.

 

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

Chắc chắn rằng người dùng mới sammyfiles của chúng ta chỉ có thể chuyển các file.

Đăng nhập vào server với tư cách là sammyfiles , sử dụng quyền truy cập shell bình thường là không thể. Hãy thử cái này:

$ ssh sammyfiles@localhost

Bạn sẽ thấy tin nhắn sau trước khi trở lại lời nhắc ban đầu của bạn:

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

Điều này có nghĩa là sammyfiles không thể truy cập vào shell server sử dụng SSH.

Tiếp theo, xác thực xem liệu rằng người dùng có thể truy cập thành công vào SFTP để chuyển file.

$ sftp sammyfiles@localhost

Thay vì tin nhắn báo lỗi,command còn hiển thị tin nhắn thông báo đăng nhập thành công với lời nhắc nhở tương tác.

SFTP promptConnected to localhost. 
sftp>
 

 

Bạn có list lại nội dung thư mục bằng cách sử dụng ls trong lời nhắc:

sftp> ls

Nó sẽ cho thấy thư mục uploads được tạo trong bước trước đó và đưa bạn trở về lời nhắn sftp>

SFTP file list outputuploads
 

Để xác minh rằng người dùng đang thật sự bị hạn chế tới thư mục này và không thể truy cập vào bất cứ thư mục trên nó,bạn có thể thử thay đổi thư mục bên trên nó.

stfp> cd ..

Command này sẽ không cho lỗi mà list lại nội dung thư mục như trước sẽ không thay đổi, chứng minh rằng người dùng không thể thay đổi thư mục mẹ.

Bây giờ bạn đã ác minh rằng cấu hình hạn chế hoạt động như mong muốn. Người dùng sammyfiles vừa mới tạo có thể truy cập vào server chỉ sử dụng giao thức SFTP cho mục đích chuyển file và không có khả năng truy cập toàn bộ vỏ.

Kết luận

 Bạn đã hạn chế người dùng tới SFTP- chỉ sử dụng một thư mục trên server mà không truy cập toàn bộ vỏ. Khi bài hướng dẫn này chỉ sử dụng cho một thư mục và một người dùng cho ngắn gọn, bạn có thể mở dụng ví dụ này thành đa người dùng và đa thư mục.