1. 概述
本文档旨在指导如何在Linux系统上搭建一个安全的SFTP服务,通过配置SSH服务实现用户只能通过SFTP协议访问指定目录,且无法获得shell访问权限。该方案基于OpenSSH服务,适用于需要文件传输但无需远程登录的场景。
2. 实施步骤
2.1 系统要求
- Linux发行版(CentOS/RHEL/Ubuntu等)
- OpenSSH服务已安装(默认已安装)
- 系统管理员权限(root或sudo权限)
2.2 用户与目录配置
2.2.1 创建SFTP用户组
groupadd sftpgp
说明:创建专用用户组sftpgp
,用于统一管理SFTP用户。
2.2.2 创建SFTP用户
useradd -g sftpgp -M -s /sbin/nologin sftp
passwd sftp
参数说明:
-g sftpgp
:指定用户主组为sftpgp
-M
:不创建用户主目录-s /sbin/nologin
:禁止用户获取shell访问权限passwd sftp
:为用户设置密码
2.2.3 创建SFTP根目录
mkdir -p /soft/sftp
usermod -d /soft/sftp sftp
chown root:sftpgp /soft/sftp
chmod 755 /soft/sftp
权限说明:
- 根目录必须由
root
拥有,确保安全性 - 用户组
sftpgp
具有读取和执行权限
2.2.4 创建用户数据目录
mkdir -p /soft/sftp/data
chown -R sftp:sftpgp /soft/sftp/data
chmod 755 /soft/sftp/data
权限说明:
- 数据目录需由SFTP用户拥有,允许文件上传操作
2.3 SSH服务配置
2.3.1 修改sshd_config
编辑SSH配置文件 /etc/ssh/sshd_config
,添加以下内容:
Subsystem sftp /usr/libexec/openssh/sftp-server //此行注释掉
Subsystem sftp internal-sftp
Match Group sftpgp
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory /soft/sftp
ForceCommand internal-sftp
配置说明:
ChrootDirectory
:将用户限制在指定目录(必须为root拥有)ForceCommand
:强制用户仅能使用SFTP协议Match Group
:配置仅对sftpgp
组生效(需放在配置文件末尾)
2.3.2 重启SSH服务
systemctl restart sshd.service
3. 验证与测试
3.1 连接测试
使用SFTP客户端连接:
sftp sftp@127.0.0.1
[root@u1asftpap01 ~]# sftp sftp@127.0.0.1
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:iWOY+z8CAimjfowSnC6xdjIExkJHEB8hPzgwhvkOeOY.
ECDSA key fingerprint is MD5:6f:bf:db:a4:d7:29:05:a0:10:5c:2c:3d:5d:0a:aa:50.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '127.0.0.1' (ECDSA) to the list of known hosts.
sftp@127.0.0.1's password:
Connected to 127.0.0.1.
sftp> ls
data
sftp> cd data/
sftp> ls
172.22.132.177_2025-07-07_9_57_53.log
预期结果:
- 成功连接后,用户仅能看到
/soft/sftp/data
目录 - 无法切换到其他目录
- 无法执行shell命令
3.2 权限验证
- 用户应能上传/下载
/soft/sftp/data
目录下的文件 - 尝试访问根目录
/soft/sftp
外的路径应被拒绝
4. 安全加固建议
项目 | 推荐配置 |
---|---|
SSH端口 | 更改默认22端口(Port <自定义端口> ) |
用户隔离 | 为每个用户创建独立ChrootDirectory |
日志监控 | 启用LogLevel VERBOSE 记录SFTP操作日志 |
防火墙 | 限制仅允许特定IP访问SSH端口 |
密钥认证 | 禁用密码登录,启用SSH密钥认证 |
5. 常见问题处理
5.1 "Permission denied" 错误
原因:
- ChrootDirectory权限未正确设置(必须
root:root
且权限≤755) - 数据目录权限未正确设置(需
sftp用户拥有
)
解决:
chown root:sftpgp /soft/sftp
chmod 755 /soft/sftp
chown sftp:sftpgp /soft/sftp/data
5.2 "No such file" 错误
原因:
- ChrootDirectory路径不存在或拼写错误
解决:
mkdir -p /soft/sftp/data
6. 附录
6.1 配置文件示例
# /etc/ssh/sshd_config
...
Subsystem sftp internal-sftp
Match Group sftpgp
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory /soft/sftp
ForceCommand internal-sftp
6.2 文件结构
/soft/sftp/ # Chroot根目录 (root:root, 755)
├── data/ # 用户操作目录 (sftp:sftpgp, 755)