温馨提示×

怎样限制centos sftp目录

小樊
42
2026-09-06 03:10:34
栏目: 智能运维

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

下面给你一套标准可落地的配置步骤(CentOS 7 / 8 / Stream 通用)。


一、原理说明(先看这个)

  • 使用 Subsystem sftp internal-sftp
  • 通过 Match User/Group 限制
  • 使用 ChrootDirectory 锁定根目录
  • 用户 禁止 shell 登录
  • 目录权限有严格要求(否则登录失败)

二、创建 SFTP 用户和组

# 创建用户组
groupadd sftpusers

# 创建用户(不允许 SSH 登录)
useradd -g sftpusers -s /sbin/nologin sftpuser

# 设置密码
passwd sftpuser

三、准备目录结构(非常关键)

假设限制目录为:

/data/sftp/sftpuser

1️⃣ 创建目录

mkdir -p /data/sftp/sftpuser

2️⃣ 设置权限(必须这样)

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

⚠️ ChrootDirectory 必须属主是 root,且其他用户不可写

3️⃣ 创建可写子目录

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

用户只能在 upload 里写文件。


四、修改 SSH 配置

编辑:

vi /etc/ssh/sshd_config

1️⃣ 修改 sftp 子系统

找到这行(注释或删除):

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

改成:

Subsystem sftp internal-sftp

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

Match Group sftpusers
    ChrootDirectory /data/sftp/%u
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no

%u 表示用户名,自动映射到 /data/sftp/sftpuser


五、重启 SSH 服务

systemctl restart sshd

六、测试 SFTP 登录

sftp sftpuser@服务器IP

✅ 成功
❌ 如果失败,看 /var/log/secure


七、常见错误排查

❌ 登录直接断开

fatal: bad ownership or modes for chroot directory

✅ 解决:

  • ChrootDirectory 必须 root 拥有
  • 权限 ≤ 755

❌ 能登录但不能写

  • ChrootDirectory 下不能直接写
  • 必须建子目录并 chown 给用户

八、进阶(可选)

限制多个用户

  • Match User user1,user2
  • 或用 Match Group

只能 SFTP,不能端口转发

AllowTcpForwarding no

日志审计

LogLevel VERBOSE

如果你愿意,我可以:

  • 给你 一键脚本
  • 按你的 CentOS 版本
  • 或做 多用户 + 配额 + 只读/只写

直接说你的需求即可。

0