温馨提示×

centos如何限制sftp用户目录

小樊
43
2026-10-05 22:49:26
栏目: 智能运维

在 CentOS 上限制 SFTP 用户只能访问指定目录(不能 SSH 登录、不能越界),最常用、最安全的做法是使用 OpenSSH 自带的 internal-sftp + Chroot。

下面以 CentOS 7 / 8 / Stream 为例,一步步说明。


一、创建 SFTP 用户和目录

# 创建用户(不允许登录 shell)
useradd -m -s /sbin/nologin sftpuser

# 设置密码
passwd sftpuser

二、创建目录结构(非常关键)

Chroot 目录必须满足:

  • 属主必须是 root
  • 权限不能超过 755
mkdir -p /data/sftp/sftpuser
chown root:root /data/sftp/sftpuser
chmod 755 /data/sftp/sftpuser

# 用户实际可写目录
mkdir /data/sftp/sftpuser/upload
chown sftpuser:sftpuser /data/sftp/sftpuser/upload

✅ 用户登录后看到的根目录是 /
✅ 实际对应系统路径:/data/sftp/sftpuser
✅ 只能往 upload 写文件


三、配置 SSH(核心)

编辑配置文件:

vi /etc/ssh/sshd_config

1️⃣ 注释或确认这一行

# Subsystem sftp /usr/libexec/openssh/sftp-server

2️⃣ 添加 internal-sftp

Subsystem sftp internal-sftp

3️⃣ 添加 SFTP 用户限制

Match User sftpuser
    ChrootDirectory /data/sftp/sftpuser
    ForceCommand internal-sftp
    X11Forwarding no
    AllowTcpForwarding no
    PasswordAuthentication yes

如果是多个用户,可以用:

Match Group sftp

四、重启 SSH 服务

systemctl restart sshd

⚠️ 千万别断开当前 SSH 会话,建议新开窗口测试


五、测试 SFTP

sftp sftpuser@服务器IP

登录后:

pwd
# 显示: /
ls
# 只能看到 upload

六、常见问题排查

❌ 登录失败 / 闪退

查看日志:

tail -f /var/log/secure

常见原因:

  • Chroot 目录不是 root 属主
  • 权限大于 755
  • SELinux 拦截

SELinux 处理(如启用)

setsebool -P ssh_chroot_rw_homedirs on

七、可选:限制到组(推荐生产用)

groupadd sftp
usermod -aG sftp sftpuser

sshd_config:

Match Group sftp
    ChrootDirectory /data/sftp/%u
    ForceCommand internal-sftp

总结

✅ 使用 internal-sftp
✅ Chroot 目录属主必须是 root
✅ 用户目录只能在其子目录下写
✅ 禁止 SSH shell 登录

如果你需要:

  • 只读 SFTP
  • 多用户隔离
  • 结合防火墙 / SELinux
  • SFTP 审计日志

我可以继续帮你配置。

0 踩