SFTP用户的创建与使用

本文最后更新于:September 17, 2026 pm

Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统。主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版。

Linux不仅系统性能稳定,而且是开源软件。其核心防火墙组件性能高效、配置简单,保证了系统的安全。在很多企业网络中,为了追求速度和安全,Linux不仅仅是被网络运维人员当作服务器使用,甚至当作网络防火墙。Linux具有开放源码、没有版权、技术社区用户多等特点,开放源码使得用户可以自由裁剪,灵活性高,功能强大,成本低。尤其系统中内嵌网络协议栈,经过适当的配置就可实现路由器的功能。

目录

  • SSH文件传输协议secret file transfer protocol, Secure FTP或SFTP,是一种数据流连线档案存取、传输和管理功能的网络传输协议。
  • 该文章环境为ubuntu系统。因需要为客户提供可以访问公司内部的数据文件,所有需要给用户提供SFTP用户,并且保证用户无法正常ssh登录,以及只拥有读取文件的权限。

创建用户组和用户

1
2
3
4
5
6
7
# 创建sftp用户组
groupadd sftp_users

# 创建用户 sftp_ro_user;-s /sbin/nologin 表示禁止ssh shell
useradd -g sftp_users -s /sbin/nologin sftp_ro_user
# 设置用户密码
passwd sftp_ro_user

创建用户根目录

  • 每一个 ChrootDirectory 依然要遵守 OpenSSH 硬性规则:目录属主 root:root,权限 755
  • 另外需要注意的是,指定的chroot根目录的路径,每一阶目录都必须是root,比如 /datadisk/sftp_user_files/sftp_user,那么/datadisk/datadisk/sftp_user_files/datadisk/sftp_user_files/sftp_user这三个目录都必须是归属于root的,不然在进行用户登录时,服务端是会直接断掉的!!!但是在这三个目录下,可以拥有非root归属的其他目录,比如在/datadisk/sftp_user_files下可以有另外一些a、b、c等其他正常目录,而且归属可以不属于root。也正是因为这一点,在创建SFTP用户对应的目录时,可能会遇到一些问题,这个需要自行选择。
  • 创建这个目录的目的是:客户登录SFTP后,服务器把 /datadisk/sftp_user_files映射成客户的 /目录,客户看到的目录就是 /没有任何系统目录,无法跳出
1
2
3
4
5
6
7
8
# chroot根目录
mkdir -p /datadisk/sftp_user_files

# 根目录必须归属root
chown root:root /datadisk/sftp_user_files

# 权限为755
chmod 755 /datadisk/sftp_user_files

修改sshd_config配置文件

1
vim /etc/ssh/sshd_config
1
2
3
4
5
6
7
8
9
10
11
# 文件最后,添加如下内容
Subsystem sftp internal-sftp # 如果原配置文件中已有类似语句,则进行替换

# 只限制和管理sftp_users组下的用户,不在改组下的用户不受影响
Match Group sftp_users
ChrootDirectory /datadisk/sftp_user_files
# -R 就是只读!禁止put/rm/mkdir/rename,OpenSSH ≥8.0支持
ForceCommand internal-sftp -R
AllowTcpForwarding no
X11Forwarding no
PermitTunnel no
  • PermitWrite no 强制只读,就算权限误配置,也无法写入

校验并重启sshd

1
2
3
4
5
# 检查sshd配置,有错不要重启!
sshd -t
systemctl restart sshd

# 有些人可能是ssh,两者都是一样的,只是别名而已

多匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 多个 Match + 多个独立 chroot

Subsystem sftp internal-sftp

# ========== 第一组:sftp_ro1 用户组,chroot到 /sftp_jail1 ==========
Match Group sftp_ro1
ChrootDirectory /sftp_jail1
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
PermitTunnel no
PermitWrite no

# ========== 第二组:sftp_ro2 用户组,chroot到 /sftp_jail2 ==========
Match Group sftp_ro2
ChrootDirectory /sftp_jail2
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
PermitTunnel no
PermitWrite no

# ========== 还可以按单个用户匹配(Match User 用户名) ==========
Match User sftp_cust03
ChrootDirectory /sftp_jail3
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
PermitTunnel no
PermitWrite no

逻辑说明

  1. 用户属于 sftp_ro1 → 应用第一块规则,chroot /sftp_jail1sftp_ro1 用户只能看到 /sftp_jail1 内的内容。
  2. 用户属于 sftp_ro2 → 应用第二块规则,chroot /sftp_jail2, sftp_ro2 用户只能看到 /sftp_jail2 内的内容。
  3. 用户是 sftp_cust03 → 应用第三块规则
  4. 内部管理员账号,不在以上组、不是匹配用户 → 所有 Match 全部不命中,SSH/SCP 完全不受限制
  5. Match 必须写在文件后面位置,写在 Subsystem 后面;不要放在全局配置前面

另外:

如果一个用户同时满足两个 Match 条件两个 Match 块的参数会叠加生效!
例:用户同时在 sftp_ro1 和 sftp_ro2 组,两个 Match 都会应用,会出现参数冲突(两个 ChrootDirectory),直接导致 ssh 启动失败。
✅ 规避:一个用户只能属于一个 sftp 客户组,不要跨组。

登录

1
2
3
4
# -P 指定端口
sftp -P 22122 sftp_ro_user@IP
# 登录成功后,在sftp内执行
ls # 对应和/datadisk/sftp_user_files目录保持一致,其他之外的目录无法看到

本文作者: 墨水记忆
本文链接: https://tothefor.com/DragonOne/24a3e5c2.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!