温馨提示×

CentOS怎么限制SFTP目录

小樊
37
2026-08-03 23:25:45
栏目: 智能运维

CentOS 上限制 SFTP 用户只能访问指定目录(不能 SSH 登录、不能访问其他目录),最常用、最安全的方法是使用 OpenSSH 自带的 internal-sftp + ChrootDirectory。下面给你一套标准做法,适用于 CentOS 7 / 8 / Stream。


一、实现目标

  • ✅ 用户只能通过 SFTP 登录
  • ✅ 只能访问 指定目录
  • ❌ 不能 SSH 登录
  • ❌ 不能访问系统其他目录

二、前提条件

确认 OpenSSH 已安装:

rpm -qa | grep openssh

一般系统都自带,版本建议 OpenSSH 5.0+(CentOS 7+ 都没问题)。


三、创建 SFTP 用户和目录

1️⃣ 创建用户(不允许 SSH)

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

/sbin/nologin 防止 SSH 登录


2️⃣ 创建 SFTP 根目录

⚠️ ChrootDirectory 必须由 root 拥有,且不能有其他用户写权限

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

3️⃣ 创建可写目录

mkdir /sftp/sftpuser/upload
chown sftpuser:sftpuser /sftp/sftpuser/upload
chmod 755 /sftp/sftpuser/upload

✅ 用户只能往 upload 写文件


四、配置 SSH(关键步骤)

编辑 SSH 配置:

vim /etc/ssh/sshd_config

1️⃣ 确认或添加以下配置

Subsystem sftp internal-sftp

不要用 Subsystem sftp /usr/libexec/openssh/sftp-server


2️⃣ 添加 SFTP 限制规则(放在文件末尾)

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

你也可以按 用户组 限制(推荐多用户场景):

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

五、重启 SSH 服务

systemctl restart sshd

六、登录测试

使用 SFTP 登录

sftp sftpuser@服务器IP

测试权限

pwd
ls
cd /

✅ 应该看到:

Remote working directory: /

且无法访问 /etc/root 等系统目录


七、常见问题排查

❌ 登录失败(Connection closed)

检查:

/var/log/secure

常见原因:

  • ChrootDirectory 不是 root 拥有
  • ChrootDirectory 权限不是 755
  • 用户家目录权限错误

✅ 正确示例:

ls -ld /sftp/sftpuser
# drwxr-xr-x root root

八、权限结构总结(非常重要)

/sftp/sftpuser        (root:root 755)  ← Chroot
/sftp/sftpuser/upload (sftpuser:sftpuser)

九、适用场景

  • 文件上传 / 下载
  • 第三方系统对接
  • 替代 FTP(更安全)

如果你需要:

  • 多用户 + 多目录
  • 只读 / 只写
  • CentOS + SELinux 配置
  • 配合 Nginx / FTP 替代方案

可以直接告诉我你的具体需求,我可以给你定制方案。

0