温馨提示×

centos sftp怎样限制目录

小樊
41
2026-10-05 22:30:26
栏目: 智能运维

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

下面按实战步骤说明(CentOS 7 / 8 / Stream 通用)。


一、核心思路

  • 用户 不能 Shell 登录(/sbin/nologin)
  • SFTP 使用 internal-sftp
  • 通过 ChrootDirectory 限制根目录
  • Chroot 目录必须由 root 拥有,且其他用户不可写

二、创建用户和目录

1. 创建 SFTP 用户

useradd -m -s /sbin/nologin sftpuser
passwd sftpuser

2. 创建目录结构(关键)

mkdir -p /data/sftp/sftpuser
chown root:root /data/sftp/sftpuser
chmod 755 /data/sftp/sftpuser

✅ Chroot 目录 必须 root 拥有

3. 给用户一个可写目录

mkdir /data/sftp/sftpuser/upload
chown sftpuser:sftpuser /data/sftp/sftpuser/upload

三、配置 SSH(重点)

编辑:

vi /etc/ssh/sshd_config

1. 注释或确认这行

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

2. 添加(或替换)

Subsystem sftp internal-sftp

3. 在文件最后添加

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

四、重启 SSH

systemctl restart sshd

五、测试 SFTP

sftp sftpuser@服务器IP

登录后:

sftp> pwd
Remote working directory: /
sftp> cd /upload

✅ 用户看不到系统其他目录


六、多用户 / 多目录(推荐做法)

方法 1:按组限制

Match Group sftp
    ChrootDirectory /data/sftp/%u
    ForceCommand internal-sftp
groupadd sftp
useradd -g sftp -s /sbin/nologin user1

目录:

mkdir -p /data/sftp/user1/upload
chown root:root /data/sftp/user1
chown user1:sftp /data/sftp/user1/upload

七、常见问题

❌ 登录失败:bad ownership or modes for chroot

原因:

  • Chroot 目录不是 root 拥有
  • 权限大于 755

✅ 解决:

chown root:root /data/sftp/sftpuser
chmod 755 /data/sftp/sftpuser

❌ 能登录但不能写

原因:

  • 用户在 Chroot 根目录无写权限

✅ 解决:

  • 只能在子目录(如 upload)写

八、总结(最简配置)

Subsystem sftp internal-sftp

Match User sftpuser
    ChrootDirectory /data/sftp/sftpuser
    ForceCommand internal-sftp

如果你需要:

  • 只读 SFTP
  • 限制 IP
  • 配合 SELinux
  • 用密钥登录

可以继续问我。

0 踩