Linux内核之外的运维宇宙
Linux运维实战笔记:从系统架构到自动化运维

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)
posted on 2025-07-22 11:18  一叶舟-小刀哥  阅读(46)  评论(0)    收藏  举报