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.service3. 验证与测试
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. 安全加固建议
5. 常见问题处理
5.1 "Permission denied" 错误
原因:
ChrootDirectory权限未正确设置(必须
root:root且权限≤755)数据目录权限未正确设置(需
sftp用户拥有)
解决:
chown root:sftpgp /soft/sftp
chmod 755 /soft/sftp
chown sftp:sftpgp /soft/sftp/data5.2 "No such file" 错误
原因:
ChrootDirectory路径不存在或拼写错误
解决:
mkdir -p /soft/sftp/data6. 附录
6.1 配置文件示例
# /etc/ssh/sshd_config
...
Subsystem sftp internal-sftp
Match Group sftpgp
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory /soft/sftp
ForceCommand internal-sftp6.2 文件结构
/soft/sftp/ # Chroot根目录 (root:root, 755)
├── data/ # 用户操作目录 (sftp:sftpgp, 755)
评论区