Bạn có đang quản lý một máy chủ Linux Ubuntu và cần cho phép người khác tải tệp lên một cách an toàn? SFTP (SSH File Transfer Protocol) chính là giải pháp lý tưởng. Đây là phương thức truyền tệp được mã hóa, an toàn hơn nhiều so với FTP truyền thống. Tuy nhiên, một vấn đề lớn thường gặp là việc cấp quyền truy cập SFTP thường đi kèm với quyền truy cập shell (giao diện dòng lệnh). Điều này tiềm ẩn rủi ro bảo mật nghiêm trọng, vì người dùng có thể thực hiện các lệnh không mong muốn trên hệ thống của bạn. Nhiều quản trị viên hệ thống luôn lo ngại về nguy cơ này, đặc biệt khi làm việc với người dùng bên ngoài hoặc khách hàng. Rất may, có một giải pháp hiệu quả. Bài viết này sẽ hướng dẫn bạn từng bước cách bật SFTP trên Ubuntu 20.04 mà không cần cấp quyền truy cập shell, giúp bạn bảo vệ máy chủ một cách tối đa. Chúng ta sẽ cùng tìm hiểu cách tạo người dùng bị giới hạn, cấu hình dịch vụ SSH để chỉ cho phép truyền tệp, và cách kiểm tra để đảm bảo mọi thứ hoạt động đúng như mong đợi.
Giới thiệu về SFTP và quyền truy cập shell
SFTP là gì và vai trò của nó trên Ubuntu 20.04
SFTP, viết tắt của SSH File Transfer Protocol, là một giao thức mạng cho phép truyền và quản lý tệp tin một cách an toàn. Không giống như FTP (File Transfer Protocol) truyền thống gửi dữ liệu dưới dạng văn bản thuần, SFTP hoạt động trên nền tảng của giao thức SSH (Secure Shell). Điều này có nghĩa là toàn bộ quá trình xác thực và dữ liệu truyền đi, bao gồm tên người dùng, mật khẩu và nội dung tệp, đều được mã hóa mạnh mẽ.

Trên hệ điều hành Ubuntu 20.04, SFTP đóng một vai trò cực kỳ quan trọng. Nó cung cấp một phương pháp đáng tin cậy để các nhà phát triển web cập nhật tệp trang web, để các quản trị viên hệ thống sao lưu dữ liệu từ xa, hoặc đơn giản là cho phép người dùng chia sẻ tệp mà không làm lộ thông tin nhạy cảm. Ưu điểm vượt trội của SFTP so với FTP là tính bảo mật. Vì nó được tích hợp sẵn trong SSH, bạn không cần phải cài đặt hay cấu hình thêm một dịch vụ riêng biệt nào khác. Chỉ cần máy chủ của bạn có SSH đang chạy, bạn đã có thể sử dụng SFTP.
Quyền truy cập shell và những rủi ro khi cấp cho người dùng SFTP
Quyền truy cập shell, hay còn gọi là quyền truy cập dòng lệnh, là khả năng người dùng có thể đăng nhập vào máy chủ và thực thi các lệnh trực tiếp trên hệ điều hành. Đây là một công cụ cực kỳ mạnh mẽ dành cho các quản trị viên hệ thống để quản lý, cấu hình và bảo trì máy chủ. Bạn có thể dùng nó để cài đặt phần mềm, quản lý dịch vụ, xem tệp tin hệ thống, và nhiều hơn nữa.

Tuy nhiên, việc trao quyền năng này cho một người dùng chỉ có nhu cầu truyền tệp qua SFTP lại là một rủi ro bảo mật rất lớn. Hãy tưởng tượng bạn chỉ muốn cho ai đó gửi tài liệu vào một thư mục, nhưng lại đưa cho họ cả chìa khóa để vào mọi phòng trong ngôi nhà của bạn. Khi một người dùng SFTP có quyền truy cập shell, họ có thể:
- Cố gắng xem các tệp tin nhạy cảm bên ngoài thư mục được phép của họ.
- Chạy các lệnh để thu thập thông tin về hệ thống, phiên bản phần mềm, và các người dùng khác.
- Sử dụng các công cụ có sẵn trên máy chủ để thực hiện các cuộc tấn công leo thang đặc quyền hoặc tấn công sang các máy chủ khác trong mạng.
- Vô tình chạy các lệnh sai gây hỏng hóc hệ thống.
Do đó, việc tách biệt quyền truyền tệp (SFTP) và quyền thực thi lệnh (shell) là một nguyên tắc bảo mật cơ bản mà mọi quản trị viên nên tuân thủ.
Lý do không nên cấp quyền truy cập shell cho người dùng SFTP
Nguy cơ bảo mật và giới hạn truy cập không cần thiết
Cấp quyền truy cập shell cho người dùng SFTP là một hành động đi ngược lại nguyên tắc bảo mật “đặc quyền tối thiểu”. Nguyên tắc này nói rằng mỗi người dùng hoặc chương trình chỉ nên có những quyền hạn cần thiết để thực hiện công việc của mình, và không hơn. Khi bạn cấp quyền shell, bạn đã trao cho người dùng một loạt khả năng mà họ không thực sự cần cho việc truyền tệp.

Điều này mở ra vô số lỗ hổng tiềm tàng. Ví dụ, một người dùng có ý đồ xấu có thể sử dụng các lệnh như find, grep, hoặc ls để rà soát toàn bộ hệ thống tệp, tìm kiếm các tệp cấu hình chứa mật khẩu hoặc khóa API. Họ có thể kiểm tra các tiến trình đang chạy bằng lệnh ps để xác định các dịch vụ dễ bị tổn thương. Ngay cả khi người dùng không có ý đồ xấu, họ cũng có thể vô tình chạy một lệnh xóa nhầm (rm -rf) ở sai thư mục và gây ra thảm họa. Bằng cách giới hạn họ chỉ với SFTP, bạn đã loại bỏ hoàn toàn lớp tấn công này. Người dùng sẽ bị “nhốt” trong môi trường truyền tệp, không thể thực thi bất kỳ lệnh nào và không thể nhìn thấy gì bên ngoài thư mục được chỉ định của họ.
Tăng cường kiểm soát tài nguyên và phân quyền
Việc chỉ cho phép SFTP mà không cấp shell mang lại lợi ích to lớn trong việc kiểm soát tài nguyên hệ thống. Khi người dùng có quyền truy cập shell, họ có thể chạy các chương trình hoặc kịch bản lệnh tiêu tốn nhiều CPU và bộ nhớ. Điều này có thể làm chậm hiệu suất của máy chủ, ảnh hưởng đến các dịch vụ quan trọng khác đang chạy, chẳng hạn như trang web hoặc cơ sở dữ liệu của bạn.
Bên cạnh đó, việc này giúp bạn phân quyền một cách rõ ràng và chặt chẽ hơn. Bạn có thể tạo ra các tài khoản người dùng với mục đích duy nhất là trao đổi tệp trong một dự án cụ thể. Họ chỉ có thể đọc, ghi, và xóa tệp trong thư mục được chỉ định cho họ. Họ không thể thay đổi cấu hình hệ thống, không thể cài đặt phần mềm, và không thể can thiệp vào hoạt động của những người dùng khác. Điều này tạo ra một môi trường làm việc an toàn, có tổ chức, và dễ quản lý. Việc giới hạn thao tác của người dùng giúp đảm bảo tính toàn vẹn của hệ thống và tránh được những sai sót không đáng có, giúp bạn yên tâm hơn khi chia sẻ quyền truy cập vào máy chủ của mình.
Hướng dẫn bật SFTP trên Ubuntu 20.04 mà không cần quyền truy cập shell
Tạo người dùng mới và thiết lập thư mục truyền tệp
Bước đầu tiên là tạo một người dùng mới dành riêng cho việc truy cập SFTP. Điều quan trọng ở đây là chúng ta sẽ gán cho người dùng này một “shell” đặc biệt để ngăn họ đăng nhập vào giao diện dòng lệnh.
Mở terminal trên máy chủ Ubuntu của bạn và chạy lệnh sau để tạo người dùng mới. Thay sftpuser bằng tên người dùng bạn muốn:
sudo adduser sftpuser
Hệ thống sẽ yêu cầu bạn đặt mật khẩu và nhập một số thông tin. Sau khi tạo xong, chúng ta cần ngăn người dùng này truy cập shell. Chạy lệnh sau:
sudo usermod --shell /usr/sbin/nologin sftpuser
Lệnh này thay đổi shell mặc định của sftpuser thành /usr/sbin/nologin. Đây là một shell đặc biệt, khi người dùng cố gắng đăng nhập qua SSH, phiên của họ sẽ bị từ chối ngay lập tức với một thông báo.
Tiếp theo, chúng ta cần tạo cấu trúc thư mục để “nhốt” (chroot) người dùng này vào. Thư mục gốc của môi trường chroot phải thuộc sở hữu của root.
sudo mkdir -p /var/sftp/uploads
sudo chown root:root /var/sftp
sudo chmod 755 /var/sftp
sudo chown sftpuser:sftpuser /var/sftp/uploads
Ở đây, /var/sftp sẽ là nhà tù chroot, và nó phải do root sở hữu. Bên trong đó, chúng ta tạo một thư mục uploads và gán quyền sở hữu cho sftpuser để họ có thể tải tệp lên đó.

Cấu hình quyền truy cập hạn chế và bảo mật trong SSH
Bây giờ, chúng ta sẽ chỉnh sửa tệp cấu hình SSH để áp dụng các quy tắc cho người dùng SFTP vừa tạo. Mở tệp cấu hình bằng trình soạn thảo văn bản:
sudo nano /etc/ssh/sshd_config
Di chuyển xuống cuối tệp và thêm vào khối cấu hình sau. Hãy chắc chắn rằng bạn thay sftpuser bằng tên người dùng thực tế của bạn.
Match User sftpuser
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
Hãy cùng phân tích các tùy chọn này:
- Match User sftpuser: Chỉ thị rằng các quy tắc sau chỉ áp dụng cho người dùng
sftpuser. - ForceCommand internal-sftp: Đây là tùy chọn quan trọng nhất. Nó buộc người dùng phải sử dụng máy chủ SFTP nội bộ của SSH ngay sau khi đăng nhập, bỏ qua việc khởi chạy shell.
- PasswordAuthentication yes: Cho phép xác thực bằng mật khẩu cho người dùng này. Nếu bạn sử dụng khóa SSH, bạn có thể đặt là
no. - ChrootDirectory /var/sftp: “Nhốt” người dùng vào thư mục
/var/sftp. Họ sẽ không thể thấy bất kỳ tệp nào bên ngoài thư mục này. - Các tùy chọn còn lại (PermitTunnel, AllowAgentForwarding,…) tắt các tính năng chuyển tiếp cổng của SSH để tăng cường bảo mật.

Sau khi thêm cấu hình, hãy lưu tệp (Ctrl + X, sau đó Y, và Enter trong nano). Cuối cùng, khởi động lại dịch vụ SSH để áp dụng các thay đổi:
sudo systemctl restart sshd
Vậy là xong! Bạn đã cấu hình thành công một người dùng SFTP bị giới hạn.
Kiểm tra và xác nhận cấu hình thành công
Kiểm tra kết nối SFTP với người dùng mới
Sau khi đã hoàn tất cấu hình, bước quan trọng tiếp theo là kiểm tra để đảm bảo mọi thứ hoạt động đúng như mong đợi. Chúng ta cần xác minh hai điều: người dùng có thể kết nối qua SFTP và người dùng không thể truy cập shell.
Đầu tiên, hãy thử kết nối bằng client SFTP dòng lệnh trên máy cục bộ của mình hoặc một ứng dụng đồ họa như FileZilla hoặc Cyberduck. Sử dụng dòng lệnh:
sftp sftpuser@your_server_ip
Thay sftpuser và your_server_ip bằng thông tin của bạn. Hệ thống sẽ yêu cầu mật khẩu bạn đã tạo cho sftpuser. Nếu kết nối thành công, bạn sẽ thấy dấu nhắc sftp>. Hãy thử liệt kê các tệp bằng lệnh ls. Bạn sẽ chỉ thấy thư mục uploads mà chúng ta đã tạo. Hãy thử di chuyển vào đó (cd uploads) và tải lên một tệp (put your_local_file).

Tiếp theo, hãy thử kết nối bằng SSH thông thường để kiểm tra xem quyền truy cập shell đã bị chặn hay chưa:
ssh sftpuser@your_server_ip
Nếu cấu hình chính xác, kết nối sẽ bị từ chối ngay lập tức. Bạn sẽ nhận được một thông báo tương tự như: “This account is currently not available.” hoặc “Connection closed.” Đây chính là dấu hiệu cho thấy ForceCommand internal-sftp và shell /usr/sbin/nologin đang hoạt động hiệu quả.
Kiểm tra nhật ký, xử lý lỗi phổ biến
Nếu bạn gặp sự cố trong quá trình kết nối, nhật ký hệ thống (system logs) là người bạn tốt nhất của bạn. Trên Ubuntu 20.04, bạn có thể xem nhật ký của dịch vụ SSH trong thời gian thực để tìm ra nguyên nhân lỗi.
Mở một cửa sổ terminal khác trên máy chủ của bạn và chạy lệnh sau để theo dõi nhật ký:
sudo journalctl -u sshd -f
Lệnh này sẽ hiển thị các thông báo mới nhất từ dịch vụ SSH. Bây giờ, hãy thử kết nối lại từ máy khách của bạn. Quan sát các dòng log mới xuất hiện trên máy chủ. Chúng thường cung cấp thông tin chi tiết về lỗi.
Một lỗi phổ biến là “fatal: bad ownership or modes for chroot directory”. Lỗi này xảy ra khi quyền sở hữu của thư mục chroot (/var/sftp trong ví dụ của chúng ta) không phải là root. Hãy đảm bảo bạn đã chạy lệnh sudo chown root:root /var/sftp một cách chính xác. Một dấu hiệu khác là kết nối bị đóng ngay lập tức mà không có lý do rõ ràng. Điều này có thể do một lỗi cú pháp trong tệp /etc/ssh/sshd_config. Hãy kiểm tra kỹ khối Match User bạn đã thêm vào.
Các vấn đề phổ biến và cách khắc phục
Người dùng không thể kết nối SFTP
Một trong những vấn đề thường gặp nhất là người dùng không thể thiết lập kết nối SFTP và nhận được thông báo lỗi như “Permission denied” hoặc “Connection closed”. Có một vài nguyên nhân chính cần kiểm tra.
Đầu tiên, hãy xem lại tệp cấu hình SSH (/etc/ssh/sshd_config). Một lỗi cú pháp nhỏ, chẳng hạn như gõ sai tên người dùng trong dòng Match User hoặc một tùy chọn không hợp lệ, có thể khiến toàn bộ khối cấu hình bị bỏ qua. Hãy kiểm tra kỹ từng dòng.
Nguyên nhân thứ hai và phổ biến nhất liên quan đến quyền sở hữu thư mục. Quy tắc của ChrootDirectory rất nghiêm ngặt: toàn bộ đường dẫn đến thư mục chroot phải thuộc sở hữu của root và không được cấp quyền ghi cho group hoặc người khác. Trong ví dụ của chúng ta, thư mục /var/sftp phải do root sở hữu. Nếu bạn vô tình gán quyền sở hữu thư mục này cho sftpuser, kết nối sẽ thất bại. Hãy chạy lại các lệnh sau để đảm bảo quyền sở hữu chính xác:
sudo chown root:root /var/sftp
sudo chown sftpuser:sftpuser /var/sftp/uploads
Cuối cùng, hãy kiểm tra tường lửa (firewall). Đảm bảo rằng cổng SSH (mặc định là 22) đang được cho phép. Bạn có thể kiểm tra trạng thái tường lửa UFW bằng lệnh sudo ufw status. Nếu SSH chưa được phép, hãy chạy sudo ufw allow ssh.

Người dùng vẫn có thể truy cập shell dù bị hạn chế
Trường hợp này ít xảy ra hơn nhưng vẫn có thể xuất hiện nếu cấu hình bị sai sót. Nếu người dùng sftpuser của bạn vẫn có thể đăng nhập và nhận được một dấu nhắc shell, điều đó có nghĩa là các chỉ thị giới hạn trong sshd_config đã không được áp dụng.
Nguyên nhân hàng đầu là khối Match User được đặt sai vị trí trong tệp /etc/ssh/sshd_config. Khối Match phải được đặt ở cuối tệp. Bất kỳ tùy chọn cấu hình toàn cục nào được đặt sau khối Match đều có thể ghi đè lên các quy tắc bên trong nó. Hãy di chuyển toàn bộ khối Match User ... xuống dòng cuối cùng của tệp và khởi động lại dịch vụ SSH.
Một lý do khác có thể là do bạn đã gán sai shell cho người dùng. Hãy kiểm tra lại shell của người dùng bằng lệnh:
grep sftpuser /etc/passwd
Kết quả trả về phải cho thấy shell là /usr/sbin/nologin hoặc /bin/false. Nếu nó hiển thị /bin/bash hoặc /bin/sh, có nghĩa là lệnh usermod trước đó đã không thành công hoặc bạn đã quên chạy nó. Hãy chạy lại lệnh sudo usermod --shell /usr/sbin/nologin sftpuser để khắc phục.
Những lưu ý và cách bảo mật tốt nhất khi sử dụng SFTP không shell
Việc thiết lập SFTP không cần shell đã là một bước tiến lớn về bảo mật, nhưng bạn vẫn có thể làm nhiều hơn nữa để củng cố hệ thống của mình. Dưới đây là những phương pháp tốt nhất bạn nên áp dụng.
Đầu tiên, hãy ưu tiên sử dụng xác thực bằng khóa SSH thay vì mật khẩu. Mật khẩu có thể bị đoán hoặc bị tấn công brute-force, trong khi khóa SSH an toàn hơn rất nhiều. Bạn có thể tạo một cặp khóa cho người dùng và yêu cầu họ sử dụng khóa riêng để kết nối, đồng thời vô hiệu hóa xác thực bằng mật khẩu trong sshd_config (PasswordAuthentication no).
Thứ hai, luôn giữ cho dịch vụ SSH và toàn bộ hệ điều hành của bạn được cập 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 mới được phát hiện. Hãy thường xuyên chạy các lệnh sudo apt update và sudo apt upgrade để đảm bảo hệ thống luôn ở trạng thái an toàn nhất.

Thứ ba, hãy sử dụng tường lửa để giới hạn quyền truy cập vào cổng SSH. Nếu bạn biết địa chỉ IP tĩnh của người dùng sẽ kết nối, hãy cấu hình tường lửa (ví dụ: UFW) để chỉ cho phép kết nối đến cổng 22 từ những IP đó. Điều này giúp ngăn chặn các cuộc tấn công quét cổng và brute-force từ khắp nơi trên internet.
Cuối cùng, tuân thủ nghiêm ngặt nguyên tắc đặc quyền tối thiểu. Đừng bao giờ cấp quyền sudo cho người dùng SFTP. Họ không cần quyền quản trị để tải tệp lên. Đảm bảo rằng quyền sở hữu và quyền truy cập trên các tệp và thư mục được thiết lập một cách chặt chẽ nhất có thể, chỉ cấp quyền ghi ở những nơi thực sự cần thiết.

Kết luận
Qua bài hướng dẫn chi tiết này, chúng ta đã cùng nhau tìm hiểu cách bật SFTP trên Ubuntu 20.04 một cách an toàn mà không cần cấp quyền truy cập shell cho người dùng. Bằng cách tạo một người dùng bị giới hạn, cấu hình ChrootDirectory và sử dụng ForceCommand internal-sftp, bạn đã xây dựng một hàng rào bảo vệ vững chắc, ngăn chặn người dùng thực hiện các hành động không mong muốn trên hệ thống của mình.
Lợi ích của phương pháp này là rất rõ ràng: nó tăng cường bảo mật bằng cách giảm thiểu bề mặt tấn công, giúp bạn kiểm soát tài nguyên tốt hơn và phân quyền người dùng một cách mạch lạc. Đây là một kỹ năng thiết yếu cho bất kỳ quản trị viên hệ thống, nhà phát triển hay bất kỳ ai đang quản lý một máy chủ Linux. Việc áp dụng các bước trong hướng dẫn này sẽ giúp bạn yên tâm hơn khi chia sẻ quyền truy cập tệp với đối tác, khách hàng hoặc các thành viên trong nhóm.
Để tiếp tục nâng cao kiến thức về bảo mật và quản trị hệ thống, AZWEB khuyến khích bạn tìm hiểu thêm các bài viết chuyên sâu về cách cấu hình khóa SSH, cài đặt Fail2Ban để chống tấn công brute-force, hoặc các kỹ thuật quản trị người dùng nâng cao trên Linux. Bảo mật là một quá trình liên tục, và việc trang bị kiến thức vững chắc chính là lá chắn tốt nhất cho hệ thống của bạn.