需求:創建用戶 jack,僅允許通過 SFTP 上傳/下載文件至自己的家目錄,**禁止 SSH 登錄**、**禁止目錄遍歷**(chroot 監獄)。適用於 RHEL/CentOS 6.x/7.x/8.x。
/ 實際是其家目錄(如 /home/jack),無法訪問上層目錄ForceCommand 強制執行# 創建 sftp 用戶組
groupadd sftp_users
# 創建用戶 jack,禁止 shell 登錄,指定附加組
useradd -G sftp_users -s /sbin/nologin -d /home/jack jack
passwd jack # 設置密碼
# 若用戶已存在
usermod -G sftp_users -s /sbin/nologin jack
/etc/ssh/sshd_config# 註釋掉原有 sftp 子系統行
# Subsystem sftp /usr/libexec/openssh/sftp-server
# 使用內建 sftp
Subsystem sftp internal-sftp
# 在文件末尾添加 Match 塊(必須放在最後)
Match Group sftp_users
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory %h
ForceCommand internal-sftp
關鍵指令說明:
Match Group sftp_users:僅對該組用戶生效ChrootDirectory %h:%h 展開為用戶家目錄(/home/jack)ForceCommand internal-sftp:強制執行 SFTP,忽略 ~/.ssh/rc 等命令# 家目錄必須屬於 root,權限 755
chown root:root /home/jack
chmod 755 /home/jack
# 創建上傳目錄,授權給用戶
mkdir /home/jack/upload
chown jack:sftp_users /home/jack/upload
chmod 750 /home/jack/upload
/home/jack)必須屬於 root:root,權限最大 755,否則 sshd 會拒絕登錄(日誌提示 bad ownership or modes for chroot directory)。子目錄可授權給用戶。
systemctl restart sshd
# 或 service sshd restart
# 1. SSH 登錄應被拒絕
ssh jack@server
# This service allows sftp connections only.
# Connection closed.
# 2. SFTP 登錄成功,自動進入 chroot 目錄
sftp jack@server
# Connected to server.
# sftp> pwd
# Remote working directory: /
# sftp> ls
# upload
# sftp> put localfile.txt upload/
# Uploading localfile.txt to /upload/localfile.txt
| 現象 | 原因 | 解決 |
|---|---|---|
| SFTP 登錄後斷開 | Chroot 目錄權限/所有者不符 | 確保家目錄 root:root 755 |
| 無法上傳文件 | 上傳目錄權限不足 | chown jack:sftp_users upload/ |
| 可看到上層目錄 | Match 塊未生效或位置錯誤 | Match 必須在 sshd_config 末尾 |
| SELinux 拒絕 | SELinux 阻止寫入 | setsebool -P ssh_chroot_rw_homedir on 或調整標簽 |