SFTP服务需启用internal-sftp子系统、创建禁Shell用户组、配置chroot路径、应用Match规则限制,并视情况调整SELinux策略。

如果您需要在Linux系统上启用安全的文件传输功能,但当前无法通过SFTP协议连接服务器,则很可能是OpenSSH的SFTP子系统未启用或用户权限配置不当。以下是实现SFTP服务可用的多种配置方法:
一、启用内置SFTP子系统并重启服务
OpenSSH默认包含internal-sftp模块,但需显式启用才能替代旧版外部sftp-server进程。此方法适用于所有主流发行版,且无需额外安装组件。
1、使用文本编辑器打开SSH主配置文件:
sudo nano /etc/ssh/sshd_config
2、查找Subsystem sftp行,将其修改为:
Subsystem sftp internal-sftp
3、若该行被注释(以#开头),则删除#符号;若整行不存在,则在文件任意空白处添加上述内容。
4、保存文件并退出编辑器。
5、重启SSH服务以加载新配置:
sudo systemctl restart sshd
二、创建隔离用户组与禁Shell用户
为避免SFTP用户获得交互式Shell权限,必须将其Shell设为不可登录类型,并归入专用组。chroot机制依赖此设置才能生效。
1、创建SFTP专用用户组:
sudo groupadd sftpusers
2、新建用户并指定无效Shell及所属组:
sudo useradd -m -g sftpusers -s /sbin/nologin sftpuser
3、为该用户设置密码:
sudo passwd sftpuser
4、验证用户属性:
getent passwd sftpuser | grep -E '(/sbin/nologin|/bin/false)'
三、配置Chroot环境限制访问路径
Chroot将用户会话根目录锁定至指定路径,防止其浏览系统其他区域。该路径的属主必须为root且不可被组或其他用户写入,否则SSH拒绝启动SFTP会话。
1、创建用户主目录结构:
sudo mkdir -p /sftp/sftpuser
2、将目录所有权设为root:
sudo chown root:root /sftp/sftpuser
3、设置严格权限:
sudo chmod 755 /sftp/sftpuser
4、在该目录下创建可写子目录供上传使用:
sudo mkdir /sftp/sftpuser/upload
5、将子目录所有权移交SFTP用户:
sudo chown sftpuser:sftpusers /sftp/sftpuser/upload
6、赋予用户对该子目录的完全控制权:
sudo chmod 775 /sftp/sftpuser/upload
四、应用Match规则绑定用户与限制策略
SSH配置中的Match块用于对特定用户或用户组应用独立策略。此处强制所有sftpusers组成员进入chroot环境并仅运行SFTP子系统。
1、在/etc/ssh/sshd_config文件末尾追加以下配置段:
Match Group sftpusers
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
2、确认ChrootDirectory路径中%u变量将被自动替换为用户名,确保该路径已按第三步完成初始化。
3、检查配置语法是否正确:
sudo sshd -t
4、若输出无错误提示,执行重启命令:
sudo systemctl restart sshd
五、禁用SELinux干扰(仅限启用SELinux的系统)
SELinux可能阻止chroot环境正常工作,因其默认策略不允许非标准路径作为chroot jail。临时禁用或调整策略是快速验证问题根源的有效手段。
1、查看当前SELinux状态:
sestatus
2、若输出中“current mode”为enforcing,则执行临时切换:
sudo setenforce 0
3、永久禁用需编辑/etc/selinux/config文件,将SELINUX=enforcing改为SELINUX=disabled
4、重启系统使更改生效,或继续使用setenforce 0进行测试。

















