在 CentOS 上限制 SFTP 用户只能访问指定目录(不能 SSH 登录、不能越权),最常用、最安全的做法是使用 OpenSSH 自带的 internal-sftp + Chroot。
下面按步骤说明(CentOS 7 / 8 / Stream 通用)。
# 创建 sftp 组
groupadd sftp
# 创建用户(不允许登录 shell)
useradd -g sftp -s /sbin/nologin sftpuser
# 设置密码
passwd sftpuser
⚠️ 重点:Chroot 目录及其父目录必须属主为 root,且其他用户不可写
# 根目录(chroot)
mkdir -p /data/sftp/sftpuser
# 用户实际可写目录
mkdir -p /data/sftp/sftpuser/upload
# 权限设置(非常关键)
chown root:root /data/sftp/sftpuser
chmod 755 /data/sftp/sftpuser
chown sftpuser:sftp /data/sftp/sftpuser/upload
chmod 755 /data/sftp/sftpuser/upload
编辑配置文件:
vi /etc/ssh/sshd_config
# Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
PermitTunnel no
%u会自动替换为用户名(sftpuser)
systemctl restart sshd
sftp sftpuser@服务器IP
✅ 成功表现:
/uploadcd /原因:
root:root✅ 解决:
chown root:root /data/sftp/sftpuser
chmod 755 /data/sftp/sftpuser
ChrootDirectory /data/sftp
并确保 /data/sftp 属主为 root。
auditd 审计操作如果你愿意,我可以:
直接告诉我你的 CentOS 版本和使用场景即可。