Kiến thức Hữu ích 😍

Bật SFTP trên CentOS 7 Không Cần Quyền Truy Cập Shell


Bạn đang quản lý một máy chủ CentOS 7 và cần cho phép người dùng tải lên hoặc tải xuống tệp? SFTP là giải pháp tuyệt vời, nhưng việc cấp quyền truy cập không đúng cách có thể mở ra những lỗ hổng bảo mật nghiêm trọng. Nếu người dùng SFTP có cả quyền truy cập Shell, họ có thể thực thi lệnh, xem các tệp hệ thống và gây ra rủi ro không lường trước được. Hướng dẫn này sẽ chỉ cho bạn cách bật SFTP trên CentOS 7 một cách an toàn, cho phép người dùng chỉ truyền tệp mà không cấp bất kỳ quyền truy cập dòng lệnh nào, đảm bảo hệ thống của bạn luôn được bảo vệ tối đa.

Giới thiệu về SFTP và vai trò của Shell trong truy cập máy chủ

SFTP (SSH File Transfer Protocol) là một giao thức truyền tệp an toàn hoạt động trên nền tảng của SSH (Secure Shell). Lợi ích chính của SFTP là nó mã hóa cả dữ liệu và lệnh trong quá trình truyền, giúp bảo vệ thông tin nhạy cảm khỏi bị đánh cắp. Điều này làm cho SFTP trở thành lựa chọn ưu việt so với FTP truyền thống, vốn không có mã hóa.

Trong khi đó, Shell là giao diện dòng lệnh cho phép người dùng tương tác trực tiếp với hệ điều hành của máy chủ. Khi bạn kết nối với máy chủ qua SSH, bạn thường được cấp một phiên Shell để thực thi các lệnh như ls, cd, hoặc rm. Đây là một công cụ mạnh mẽ dành cho quản trị viên hệ thống. Tham khảo thêm về Lệnh cd trong Linux để hiểu rõ hơn về các thao tác dòng lệnh.

Vậy tại sao cần bật SFTP mà không cho phép truy cập Shell? Vấn đề nằm ở chỗ, theo mặc định, một người dùng có quyền truy cập SFTP cũng thường có quyền truy cập Shell. Điều này tạo ra một rủi ro bảo mật lớn nếu người dùng đó không phải là quản trị viên. Việc tách bạch hai quyền này giúp bạn giới hạn người dùng chỉ trong phạm vi nhiệm vụ của họ: truyền tệp một cách an toàn.

Lý do cần bật SFTP mà không cho phép truy cập Shell

Việc cấu hình SFTP mà không đi kèm quyền truy cập Shell là một bước đi chiến lược và cần thiết để bảo vệ máy chủ của bạn. Cách tiếp cận này mang lại nhiều lợi ích thiết thực, đặc biệt là trong môi trường cộng tác hoặc chia sẻ tài nguyên.

Tăng cường bảo mật cho hệ thống

Đây là lý do quan trọng nhất. Khi một người dùng chỉ có quyền SFTP, họ không thể thực thi bất kỳ lệnh nào trên máy chủ của bạn. Điều này ngăn chặn họ xem các tệp cấu hình nhạy cảm, thay đổi quyền hệ thống, hoặc cài đặt các phần mềm độc hại. Nếu tài khoản của người dùng này bị xâm phạm, kẻ tấn công cũng chỉ bị giới hạn trong việc quản lý tệp, không thể kiểm soát toàn bộ hệ thống. Để hiểu về cơ chế nhân hệ điều hành giúp quản lý và bảo vệ tập tin này, bạn có thể xem thêm bài viết Kernel là gì

Hình minh họa

Giới hạn quyền truy cập người dùng khi truyền file

Trong nhiều trường hợp, bạn chỉ muốn cấp cho đối tác, khách hàng hoặc một thành viên trong nhóm quyền tải lên hoặc tải xuống các tệp trong một thư mục cụ thể. Việc cấp quyền Shell cho họ là không cần thiết và thừa thãi. Bằng cách giới hạn họ chỉ với SFTP, bạn đảm bảo họ chỉ có thể thực hiện các thao tác trong phạm vi công việc được giao, không thể đi lang thang trong hệ thống tệp của máy chủ.

Ngăn ngừa truy cập không mong muốn và rủi ro an ninh

Mỗi tài khoản có quyền truy cập Shell là một cánh cửa tiềm năng cho các cuộc tấn công. Kẻ xấu có thể khai thác các lỗ hổng phần mềm hoặc sử dụng các kỹ thuật leo thang đặc quyền để giành quyền kiểm soát máy chủ. Bằng cách loại bỏ quyền truy cập Shell cho những người dùng không cần thiết, bạn đã giảm đáng kể bề mặt tấn công và làm cho hệ thống của mình trở nên vững chắc hơn trước các mối đe dọa tiềm tàng.

Các bước tạo user mới chỉ dùng SFTP trên CentOS 7

Để thiết lập một môi trường SFTP an toàn, chúng ta sẽ tạo một người dùng mới và cấu hình hệ thống để giới hạn họ chỉ trong các hoạt động truyền tệp. Quá trình này bao gồm ba bước chính: tạo người dùng, cấu hình dịch vụ SSH và gom nhóm người dùng.

Tạo user mới không có quyền shell truy cập

Đầu tiên, chúng ta cần tạo một nhóm riêng cho những người dùng chỉ có quyền SFTP. Điều này giúp việc quản lý trở nên dễ dàng hơn. Mở terminal và chạy lệnh sau để tạo nhóm sftpusers:
sudo groupadd sftpusers

Tiếp theo, tạo một người dùng mới (ví dụ: user_sftp) và thêm họ vào nhóm này. Quan trọng là chúng ta chỉ định shell của họ là /sbin/nologin để ngăn chặn việc đăng nhập qua Shell.
sudo useradd -g sftpusers -d /home/user_sftp -s /sbin/nologin user_sftp

Cuối cùng, đặt mật khẩu cho người dùng mới:
sudo passwd user_sftp
Bạn sẽ được yêu cầu nhập và xác nhận mật khẩu mới.

Hình minh họa

Cấu hình OpenSSH để chỉ cho phép SFTP (Sử dụng ForceCommand internal-sftp)

Bây giờ, chúng ta cần chỉnh sửa tệp cấu hình của OpenSSH để áp dụng các quy tắc cho nhóm sftpusers. Mở tệp /etc/ssh/sshd_config bằng trình soạn thảo văn bản bạn quen dùng (như nano hoặc vi):
sudo nano /etc/ssh/sshd_config

Tìm dòng Subsystem sftp và đảm bảo nó được cấu hình để sử dụng internal-sftp. Nếu dòng này bị chú thích (có dấu # ở đầu), hãy bỏ chú thích.
Subsystem sftp internal-sftp

Sau đó, cuộn xuống cuối tệp và thêm đoạn cấu hình sau:
Match Group sftpusers
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no

  • Match Group sftpusers: Áp dụng các quy tắc sau cho mọi người dùng trong nhóm sftpusers.
  • ChrootDirectory %h: Giới hạn người dùng trong thư mục nhà của họ (%h là biến đại diện cho home directory).
  • ForceCommand internal-sftp: Buộc người dùng chỉ có thể thực hiện các lệnh SFTP.
  • AllowTcpForwarding noX11Forwarding no: Tắt các tính năng chuyển tiếp cổng không cần thiết để tăng cường bảo mật.

Lưu và đóng tệp. Sau đó, khởi động lại dịch vụ SSH để áp dụng thay đổi:
sudo systemctl restart sshd

Thiết lập user vào nhóm dành riêng cho SFTP

Ở bước đầu tiên, chúng ta đã tạo người dùng và gán họ vào nhóm sftpusers ngay lập tức bằng lệnh useradd -g. Nếu bạn có một người dùng đã tồn tại và muốn thêm họ vào nhóm này, bạn có thể sử dụng lệnh usermod:
sudo usermod -aG sftpusers ten_user_da_co

Việc sử dụng một nhóm chuyên dụng như sftpusers giúp bạn dễ dàng quản lý và áp dụng các chính sách bảo mật đồng bộ cho tất cả các tài khoản chỉ dùng để truyền tệp.

Cách thiết lập thư mục truyền file cố định cho user SFTP

Một trong những yêu cầu bảo mật quan trọng nhất khi cấu hình SFTP là “nhốt” người dùng vào một thư mục cụ thể, được gọi là chroot jail. Điều này ngăn họ truy cập vào các phần khác của hệ thống tệp. Tuy nhiên, việc thiết lập quyền cho thư mục chroot đòi hỏi sự chính xác tuyệt đối.

Tạo thư mục gốc và cấp quyền chính xác cho user

Thư mục chroot (thư mục gốc mà người dùng bị giới hạn) phải thuộc sở hữu của người dùng root. Đây là một yêu cầu bắt buộc của OpenSSH và là nơi nhiều người gặp lỗi.

Đầu tiên, chúng ta sẽ tạo một thư mục để người dùng có thể tải tệp lên. Giả sử thư mục nhà của user_sftp/home/user_sftp. Chúng ta sẽ tạo một thư mục con bên trong đó, ví dụ là uploads.
sudo mkdir -p /home/user_sftp/uploads

Bây giờ, chúng ta cần thiết lập quyền sở hữu và quyền truy cập một cách chính xác.
Thư mục gốc (/home/user_sftp) phải thuộc sở hữu của root:
sudo chown root:root /home/user_sftp

Thư mục con (uploads) phải thuộc sở hữu của người dùng SFTP để họ có quyền ghi tệp vào đó:
sudo chown user_sftp:sftpusers /home/user_sftp/uploads

Hình minh họa

Thiết lập chroot để giới hạn user trong thư mục cố định

Trong tệp cấu hình /etc/ssh/sshd_config, chúng ta đã sử dụng chỉ thị ChrootDirectory %h. Biến %h sẽ tự động trỏ đến thư mục nhà của người dùng đang đăng nhập (trong ví dụ này là /home/user_sftp).

Khi user_sftp kết nối, họ sẽ bị “nhốt” trong /home/user_sftp. Họ sẽ không thể thấy bất kỳ tệp hoặc thư mục nào bên ngoài thư mục này. Bên trong đó, họ sẽ thấy thư mục uploads và có thể đọc/ghi tệp vào đây. Cấu trúc này đảm bảo sự tách biệt an toàn.

Điều chỉnh quyền ownership và phân quyền (chmod/chown)

Quyền truy cập của thư mục cũng rất quan trọng. Thư mục chroot gốc không được phép có quyền ghi cho bất kỳ ai ngoài root. Đặt quyền cho thư mục gốc:
sudo chmod 755 /home/user_sftp
Quyền 755 có nghĩa là root có toàn quyền (đọc, ghi, thực thi), trong khi những người khác chỉ có quyền đọc và thực thi.

Đặt quyền cho thư mục con để người dùng có thể tải tệp lên:
sudo chmod 755 /home/user_sftp/uploads
Quyền 755 trên thư mục uploads cho phép user_sftp tạo và xóa tệp trong đó. Nếu bạn muốn các quy tắc chặt chẽ hơn, bạn có thể điều chỉnh cho phù hợp.

Thiết lập giới hạn quyền truy cập để đảm bảo an toàn

Sau khi đã cấu hình người dùng và thư mục, bạn nên xem xét các lớp bảo vệ bổ sung để làm cho hệ thống của mình vững chắc hơn nữa. Điều này bao gồm việc tinh chỉnh tường lửa và các cơ chế bảo mật tích hợp của CentOS.

Cấu hình SELinux hoặc firewalld khi cần thiết

Firewalld: Đảm bảo rằng tường lửa của bạn cho phép các kết nối SSH. Theo mặc định, CentOS 7 thường đã mở cổng 22. Bạn có thể kiểm tra bằng lệnh:
sudo firewall-cmd --list-all
Nếu dịch vụ ssh không có trong danh sách, hãy thêm nó:
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload

SELinux: SELinux (Security-Enhanced Linux) cung cấp một lớp kiểm soát truy cập bắt buộc. Nếu SELinux đang ở chế độ enforcing, bạn có thể cần cho phép SSH truy cập vào thư mục nhà của người dùng. Chạy lệnh sau để bật boolean cần thiết:
sudo setsebool -P ssh_chroot_rw_homedirs on
Lệnh này đảm bảo rằng các quy tắc chroot của SSH không xung đột với chính sách của SELinux.

Hình minh họa

Giới hạn các tính năng SSH ngoài SFTP

Trong tệp cấu hình /etc/ssh/sshd_config, chúng ta đã thêm các chỉ thị AllowTcpForwarding noX11Forwarding no trong khối Match Group. Các cài đặt này rất quan trọng vì chúng vô hiệu hóa các tính năng nâng cao của SSH như chuyển tiếp cổng TCP và X11, vốn không cần thiết cho người dùng chỉ truyền tệp và có thể bị lạm dụng. Việc tắt chúng sẽ giảm bề mặt tấn công của dịch vụ SSH.

Đảm bảo không cho phép truy cập shell hoặc thực thi lệnh không an toàn

Hai cơ chế chính đảm bảo điều này là:
1. Shell /sbin/nologin: Khi tạo người dùng, chúng ta đã gán cho họ một shell không hợp lệ. Nếu họ cố gắng đăng nhập qua SSH, hệ thống sẽ ngay lập tức từ chối và hiển thị một thông báo như “This account is currently not available.”
2. ForceCommand internal-sftp: Chỉ thị này trong sshd_config là lớp bảo vệ thứ hai. Nó buộc mọi kết nối từ người dùng trong nhóm sftpusers phải sử dụng máy chủ SFTP nội bộ, bỏ qua bất kỳ yêu cầu thực thi lệnh nào khác.

Sự kết hợp của hai kỹ thuật này tạo ra một rào cản mạnh mẽ, đảm bảo người dùng chỉ có thể thực hiện các thao tác SFTP.

Kiểm tra và xác minh cấu hình SFTP không truy cập Shell

Sau khi hoàn tất cấu hình, bước quan trọng cuối cùng là kiểm tra để đảm bảo mọi thứ hoạt động như mong đợi. Đừng bao giờ bỏ qua bước này, vì nó giúp bạn phát hiện sớm các lỗi sai sót.

Cách test kết nối SFTP với user mới

Bạn có thể sử dụng một ứng dụng SFTP client như FileZilla, WinSCP (trên Windows), hoặc Cyberduck (trên macOS). Ngoài ra, bạn có thể dùng lệnh sftp ngay trên terminal. Sử dụng lệnh sftp:
sftp user_sftp@dia_chi_ip_may_chu
Sau khi nhập mật khẩu, bạn sẽ thấy dấu nhắc sftp>. Hãy thử các lệnh như ls để liệt kê các tệp (bạn sẽ thấy thư mục uploads), cd uploads để vào thư mục, và put ten_file để tải tệp lên. Nếu tất cả đều hoạt động, kết nối SFTP đã thành công.

Hình minh họa

Kiểm tra log và xác minh user không thể dùng SSH shell

Bây giờ, hãy thử kết nối bằng SSH thông thường:
ssh user_sftp@dia_chi_ip_may_chu
Kết nối sẽ bị từ chối ngay lập tức. Bạn có thể nhận được thông báo lỗi như “Connection closed” hoặc “This service allows sftp connections only.”

Để xác minh thêm, bạn có thể kiểm tra nhật ký bảo mật của hệ thống. Trên CentOS 7, tệp log thường là /var/log/secure. Mở một terminal khác và theo dõi tệp log trong khi cố gắng kết nối SSH:
sudo tail -f /var/log/secure
Bạn sẽ thấy các mục log ghi lại nỗ lực đăng nhập thất bại, xác nhận rằng cấu hình của bạn đang chặn truy cập Shell hiệu quả.

Xác minh thư mục và quyền hạn user đã thiết lập đúng

Trong phiên SFTP, hãy thử di chuyển ra khỏi thư mục nhà của bạn bằng lệnh cd /. Lệnh này sẽ thất bại vì bạn đang bị “nhốt” trong chroot jail. Tiếp theo, hãy thử tạo một tệp trong thư mục gốc của bạn (bên ngoài thư mục uploads). Thao tác này cũng sẽ thất bại do không có quyền ghi. Cuối cùng, vào thư mục uploads và thử tải lên một tệp. Lần này thao tác phải thành công.

Việc kiểm tra kỹ lưỡng các kịch bản này giúp bạn chắc chắn rằng các giới hạn về thư mục và quyền truy cập đã được áp dụng chính xác.

Lưu ý bảo mật và quản lý người dùng khi sử dụng SFTP

Thiết lập ban đầu chỉ là bước khởi đầu. Để duy trì một hệ thống an toàn và hiệu quả, bạn cần tuân thủ các nguyên tắc quản lý và bảo mật liên tục.

  • Thường xuyên cập nhật hệ thống và OpenSSH: Luôn giữ cho hệ điều hành CentOS 7 và gói OpenSSH của bạn được cập nhật lên phiên bản mới nhất. Các bản cập nhật thường chứa các bản vá cho những lỗ hổng bảo mật đã được phát hiện. Sử dụng sudo yum update để kiểm tra và cài đặt các bản cập nhật thường xuyên. Xem thêm về Linux là gì để cập nhật kiến thức hệ điều hành.
  • Giám sát hoạt động truy cập và kiểm soát user: Thường xuyên xem xét các tệp log hệ thống (như /var/log/secure) để phát hiện các hoạt động bất thường hoặc các nỗ lực đăng nhập trái phép. Nếu một người dùng không còn cần quyền truy cập, hãy vô hiệu hóa hoặc xóa tài khoản của họ ngay lập tức.
  • Không sử dụng mật khẩu yếu, ưu tiên SSH key: Mật khẩu có thể bị dò ra. Phương pháp xác thực an toàn hơn nhiều là sử dụng cặp khóa SSH (công khai và riêng tư). Cấu hình xác thực bằng khóa SSH và vô hiệu hóa đăng nhập bằng mật khẩu sẽ nâng cao đáng kể khả năng bảo mật cho máy chủ của bạn.
  • Quản lý số lượng user và phân quyền phù hợp: Chỉ tạo tài khoản SFTP cho những người thực sự cần. Áp dụng nguyên tắc đặc quyền tối thiểu: mỗi người dùng chỉ nên có quyền truy cập vào các thư mục và tệp mà họ cần để thực hiện công việc của mình, không hơn không kém. Tham khảo thêm về Hệ điều hành Ubuntu là gì để hiểu cách quản lý người dùng trên hệ điều hành Linux phổ biến.

Hình minh họa

Một số vấn đề thường gặp và cách xử lý

Ngay cả khi đã làm theo hướng dẫn cẩn thận, bạn vẫn có thể gặp phải một vài sự cố phổ biến. Dưới đây là cách khắc phục chúng.

User vẫn có thể truy cập shell sau cấu hình

Nếu người dùng vẫn có thể đăng nhập qua SSH, nguyên nhân thường là do lỗi trong tệp /etc/ssh/sshd_config.

  • Kiểm tra khối Match Group: Đảm bảo bạn đã đặt đúng tên nhóm (sftpusers) và khối cấu hình này nằm ở cuối tệp. Các chỉ thị trong Match sẽ ghi đè các cài đặt toàn cục.
  • Xác minh ForceCommand: Chắc chắn rằng dòng ForceCommand internal-sftp không bị lỗi chính tả và không có dấu # ở đầu.
  • Khởi động lại SSHd: Sau mỗi lần thay đổi, đừng quên khởi động lại dịch vụ SSH bằng sudo systemctl restart sshd.

Lỗi quyền truy cập thư mục hoặc chuỗi chroot không hoạt động

Đây là vấn đề phổ biến nhất, thường xuất hiện với thông báo lỗi “Connection closed” ngay sau khi xác thực thành công. Nguyên nhân gần như luôn luôn là do quyền sở hữu của thư mục chroot.

  • Quyền sở hữu thư mục gốc: Thư mục được chỉ định trong ChrootDirectory (ví dụ: /home/user_sftp) bắt buộc phải thuộc sở hữu của root. Kiểm tra lại bằng lệnh ls -ld /home/user_sftp. Nếu nó không thuộc root, hãy sửa bằng sudo chown root:root /home/user_sftp.
  • Quyền ghi của thư mục gốc: Thư mục chroot này không được phép có quyền ghi cho bất kỳ ai khác ngoài root. Quyền 755 là một lựa chọn an toàn. Sử dụng sudo chmod 755 /home/user_sftp để thiết lập. Người dùng SFTP chỉ nên có quyền ghi vào các thư mục con bên trong thư mục chroot này.

Hình minh họa

Các best practices khi bật SFTP trên CentOS 7

Để xây dựng một hệ thống SFTP không chỉ an toàn mà còn dễ quản lý, hãy tuân thủ các phương pháp hay nhất sau đây.

  • Luôn sao lưu cấu hình trước khi thay đổi: Trước khi chỉnh sửa các tệp quan trọng như /etc/ssh/sshd_config, hãy tạo một bản sao lưu. Một lệnh đơn giản như sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak có thể giúp bạn dễ dàng khôi phục nếu có sự cố xảy ra.
  • Sử dụng nhóm riêng biệt để quản lý user SFTP: Việc tạo một nhóm chuyên dụng như sftpusers giúp bạn áp dụng các quy tắc một cách nhất quán cho tất cả người dùng SFTP. Điều này đơn giản hóa việc quản lý và giảm thiểu sai sót so với việc cấu hình cho từng người dùng riêng lẻ.
  • Cập nhật thường xuyên các bản vá bảo mật OpenSSH: OpenSSH là một phần mềm quan trọng và là mục tiêu của nhiều cuộc tấn công. Hãy đảm bảo bạn luôn chạy phiên bản mới nhất bằng cách thường xuyên cập nhật hệ thống của mình.
  • Hạn chế user chỉ truy cập đúng thư mục cần thiết: Đừng cấp cho người dùng quyền truy cập vào toàn bộ thư mục nhà của họ nếu họ chỉ cần làm việc với một thư mục con. Bạn có thể tùy chỉnh ChrootDirectory để trỏ đến một đường dẫn cụ thể hơn, ví dụ: ChrootDirectory /sftp/%u. Điều này tuân thủ nguyên tắc đặc quyền tối thiểu và tăng cường an ninh.

Hình minh họa

Kết luận

Việc bật SFTP mà không cấp quyền truy cập Shell trên CentOS 7 là một kỹ thuật thiết yếu để bảo vệ máy chủ của bạn. Bằng cách giới hạn người dùng chỉ trong các hoạt động truyền tệp và “nhốt” họ vào các thư mục được chỉ định, bạn đã giảm thiểu đáng kể rủi ro bị tấn công, ngăn chặn các hành vi trái phép và tăng cường kiểm soát đối với hệ thống của mình. Lợi ích về bảo mật mà phương pháp này mang lại là không thể phủ nhận, đặc biệt trong các môi trường yêu cầu chia sẻ tệp với bên thứ ba.

AZWEB khuyến khích bạn áp dụng các bước đã hướng dẫn để nâng cao bảo mật cho hạ tầng của mình. Hãy bắt đầu thực hành ngay hôm nay để xây dựng một hệ thống vững chắc và an toàn hơn. Nếu bạn có bất kỳ thắc mắc hay chia sẻ nào trong quá trình thực hiện, đừng ngần ngại để lại bình luận bên dưới

Đánh giá