核心目标创建一个只能传文件、无法登录系统、被锁在自家“牢笼”里的专用账户。 本文摘要本文是一份 Linux SFTP Chroot 禁锢配实操指南从零开始带你完成 OpenSSH 安装、用户创建、sshd_config关键配置内置 SFTP 子系统 Match 限制块、权限隔离及防火墙放行等全流程。文中特别指出了StrictModes位置错误、家目录归属 root 等常见踩坑点并附报错速查表助你快速搭建一个只能传文件、无法登录系统的安全 SFTP 环境。第一步安装 OpenSSH 服务# 安装服务系统一般自带此步保证不缺组件sudoyuminstall-yopenssh-server# 启动并设置开机自启sudosystemctlenablesshdsudosystemctl start sshd第二步创建用户组和用户# 1. 创建一个匹配组用于在配置中识别哪些用户需要被禁锢sudogroupaddsftpgroup# 2. 创建用户指定家目录、加入组、禁止 Shell 登录# -m 创建家目录-G 加入附属组-s 禁止登录sudouseradd-m-Gsftpgroup-s/usr/sbin/nologin sftpuser# 3. 设置密码sudopasswdsftpuser 解释-s /usr/sbin/nologin禁止了 Shell但 SFTP 服务不受影响sftpgroup将作为Match规则的“门票”。第三步配置 SSH 服务/etc/ssh/sshd_config—— 关键核心使用vim编辑配置文件sudovim/etc/ssh/sshd_config请按以下顺序修改顺序错了会报错3.1 替换全局 SFTP 子系统解决报错根源找到原本的Subsystem sftp /usr/libexec/openssh/sftp-server将其整行替换为Subsystem sftp internal-sftp 不要注释掉直接替换。这样所有用户默认使用内置 SFTP完美兼容后续的Chroot禁锢环境避免subsystem request failed报错。3.2 在文件中间Match块之前添加全局安全参数建议放在Subsystem下方例如Banner /etc/sshbanner # 登录提示文件需自己创建没有可忽略此行 LogLevel INFO # 日志级别 MaxAuthTries 3 # 防暴力破解 PubkeyAuthentication yes # 允许密钥登录 PermitEmptyPasswords no # 禁止空密码 StrictModes yes # 【注意】必须放在 Match 之前3.3 在文件最末尾添加 Match 限制块Match Group sftpgroup ChrootDirectory %h ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no 解释StrictModes等全局设置必须放在Match外面否则sshd -t会报错not allowed within a Match block。第四步验证配置并重载服务必须执行# 1. 严格检查语法无任何输出代表完全正确sudosshd-t# 2. 若上一步无报错平滑重载使配置生效不中断现有连接sudosystemctl reload sshd第五步设置目录权限最容易踩坑请盯紧根据ChrootDirectory的内核安全要求以及我们推荐的权限隔离方案执行以下命令# 1. 【铁律】将用户家目录的根交给 root否则 chroot 失败sudochownroot:root /home/sftpusersudochmod755/home/sftpuser# 2. 创建实际用于读写的子目录并完全交给 sftpuser 自己sudomkdir/home/sftpuser/uploadsudochownsftpuser:sftpuser /home/sftpuser/uploadsudochmod750/home/sftpuser/upload# 750 比 755 更严谨只允许自己和同组用户 为什么这么改根目录必须归 rootLinux 内核强制要求chroot的目录必须由root拥有否则连接会瞬间断开。子目录归 sftpuser因为根目录只读用户无法写文件所以必须有一个子目录交给用户。采用sftpuser:sftpuser而非sftpuser:sftpgroup意味着只有该用户拥有完整权限其他任何普通用户都无法染指隔离性更好。第六步防火墙放行如果开启sudofirewall-cmd--permanent--add-servicesshsudofirewall-cmd--reload第七步功能测试与验证测试连接sftpsftpuser127.0.0.1输入密码后看到sftp提示符即为成功。验证禁锢效果在sftp提示符下执行sftp pwd # 显示 / 实际路径已被映射到 /home/sftpuser sftp ls -l # 只能看到 upload看不到系统的 /etc /var 等 sftp cd upload # 进入自己的工作目录 sftp put /etc/hosts . # 尝试上传文件应成功 sftp ls # 能看到上传的文件 sftp get hosts # 下载文件 sftp rm hosts # 删除文件注意 SFTP 不支持 rm -rf 高级加固建议可选禁用密码强制密钥登录最安全在sshd_config中加入PasswordAuthentication no。提前将客户端公钥写入/home/sftpuser/.ssh/authorized_keys记得把.ssh目录归sftpuser所有。安装 Fail2ban防爆破sudoyuminstall-yepel-release fail2bansudosystemctlenablefail2ban--now 常见报错与对号入座终极速查表报错现象原因解决办法subsystem request failed未使用内置 SFTP 或完全注释了 Subsystem改为Subsystem sftp internal-sftpsshd -t报not allowed within MatchStrictModes等误放入 Match 块移到Match行之前连接后立刻断开日志显示Permission denied家目录/home/sftpuser不属于 root执行sudo chown root:root /home/sftpuser登录后ls看不到任何目录忘记创建子目录创建upload并赋予sftpuser权限访问result目录报Permission denied该目录属于 root普通用户无权查看忽略它只用自己拥有的upload目录SFTP 无法递归删除文件夹rm命令不支持-r参数进入目录手动删文件或使用支持递归的客户端如 lftp