前缀、文档修改记录
20251009 初始化编辑此文章,完稿
章节1、需求描述
Debian/Ubuntu的Linux系统内,SFTP权限分配问题,用户user1 可以访问 /data/user1 路径和 /data/share路径, 用户user2可以访问/data/user2和/data/share路径,这样,每个用户可以拥有自己独立的存储目录,也可以有共享的目录访问权限
章节2、环境描述
今日的测试环境 Debian 12的1台Linux服务器,作为文件服务器,/data目录有做完软RAID后的500GB空间,基本不怕丢失文件的哦。
典型的 SFTP 用户目录权限隔离 + 共享目录权限设计
user1 只能访问 /data/user1 和 /data/share user2 只能访问 /data/user2 和 /data/share 两个用户互相不能访问对方的私有目录 /data/share 为公共共享目录(权限:可读写)
最安全和推荐的方法是使用 sshd_config 配置 SFTP Chroot Jail,然后利用 Bind Mount 来挂载共享目录。 用 Chroot 限制 SFTP 用户的根目录; 用组(group)控制共享目录访问; 调整目录权限(chmod / chown); 修改 SSH 配置来限定 SFTP 行为。
章节3、配置过程,独享目录+共享目录(可读写)
// 创建 Chroot 根目录,创建用户实际数据目录,设置 chroot 目录权限(必须由 root 拥有且不可写)
mkdir -p /sftp/user1 mkdir -p /sftp/user2 mkdir -p /data/user1 mkdir -p /data/user2 mkdir -p /data/share chown root:root /sftp/user1 /sftp/user2 chmod 755 /sftp/user1 /sftp/user2
配置 sshd,实现 chroot jail,编辑 SSH 配置文件 /etc/ssh/sshd_config , 注释掉默认的 Subsystem 行,使该行语法失效。
# Subsystem sftp /usr/lib/openssh/sftp-server

移动到文件末尾,增加相关配置,增加sftp用户组sftp_users的配置,禁止登录系统,仅允许sftp
# 使用内部 sftp-server 实现 Chroot 功能 Subsystem sftp internal-sftp # 为 SFTP 用户定义匹配组 Match Group sftp_users # 强制使用 internal-sftp ForceCommand internal-sftp # 禁止 TTY 和 X11 转发 PermitTTY no X11Forwarding no # 设置 Chroot 根目录,%h 会被替换为用户的主目录 ChrootDirectory %h # 允许用户的主目录内有读写权限 AllowTcpForwarding no
注释:这里的 %h 是一个变量,它将使用 /etc/passwd 中定义的用户主目录(Home Directory)
继续配置,在系统里增加用户的组,创建不同用户并设置主目录和组
groupadd sftp_users useradd -m -d /sftp/user1 -s /sbin/nologin -g sftp_users user1 passwd user1 useradd -m -d /sftp/user2 -s /sbin/nologin -g sftp_users user2 passwd user2 chown user1:sftp_users /data/user1 chown user2:sftp_users /data/user2 chmod 700 /data/user1 chmod 700 /data/user2 chown root:sftp_users /data/share chmod 770 /data/share
注释:用户的 Home 目录必须设置为 Chroot Jail 的根目录
参数 -m: 创建用户主目录(即 /sftp/user1)
参数 -d /sftp/user1: 指定主目录为 Chroot 根目录
参数 -s /sbin/nologin: 禁止用户通过 SSH 登录 Shell,只能进行 SFTP
设置 Bind Mount 挂载点,在每个用户的 Chroot 根目录下创建挂载点(目标目录),将实际数据目录挂载到 Chroot 内部的入口
mkdir /sftp/user1/user1_files mkdir /sftp/user1/share mount --bind /data/user1 /sftp/user1/user1_files mount --bind /data/share /sftp/user1/share mkdir /sftp/user2/user2_files mkdir /sftp/user2/share mount --bind /data/user2 /sftp/user2/user2_files mount --bind /data/share /sftp/user2/share
编辑 /etc/fstab 文件,使挂载在系统重启后仍然生效,编辑/etc/fstab 中添加以下四行
/data/user1 /sftp/user1/user1_files none bind 0 0 /data/share /sftp/user1/share none bind 0 0 /data/user2 /sftp/user2/user2_files none bind 0 0 /data/share /sftp/user2/share none bind 0 0
设置目录权限,需要确保用户对实际数据目录有正确的读写权限,设置用户私有目录的权限
chown user1:user1 /data/user1 chmod 700 /data/user1 chown user2:user2 /data/user2 chmod 700 /data/user2
设置共享目录的权限
groupadd sftp_users usermod -aG sftp_users user1 usermod -aG sftp_users user2 # 设置 /data/share 目录 chown root:sftp_users /data/share chmod 770 /data/share
重启服务并测试
systemctl restart sshd

注释:用户登录后,其 SFTP 根目录就是 /sftp/userN
,他们将只能看到 userN_files
和 share
目录
章节4、配置过程,增加只读的共享目录
只读共享目录 /data/iso
, 里面放的一些iso文件,这个一般用户,只读即可。
创建目录,并设置权限: 设置它为 root
拥有且不可写。
mkdir -p /data/iso chown root:sftp_users /data/iso chmod 750 /data/iso # 确保所有用户可读、可执行(进入目录)
在 Chroot 内部创建挂载点
mkdir /sftp/user1/iso_ro mkdir /sftp/user2/iso_ro
执行只读 Bind Mount
systemctl daemon-reload mount --bind /data/iso /sftp/user1/iso_ro -o ro mount --bind /data/iso /sftp/user2/iso_ro -o ro
持久化 Bind Mount(系统重启后仍然生效),编辑 /etc/fstab 文件,添加以下两行
/data/iso /sftp/user1/iso_ro none bind,ro 0 0 /data/iso /sftp/user2/iso_ro none bind,ro 0 0
注释:bind,ro
确保了挂载的持久性和只读属性
总结:
私有目录 (/data/user1, /data/user2):通过 chown 和 chmod 700 实现独占读写。 共享目录 (/data/share):通过 sftp_share 组和 chmod 2770 实现组内读写。 只读目录 (/data/iso):通过 mount --bind -o ro 实现只读访问。
附录1、视频操作演示
附录2、@Dasmz
博客内,所有教程为手打原创教程,如果技术教程对您有所帮助,欢迎打赏作者。技术层面,闻道有先后,如有疏漏、错误,欢迎指正。技术博客的内容,一般具有一定的环境依赖,具有一定的年代依赖,酌情参考其中的内容,请勿完全照搬照抄。
对于博客内已提及的专业知识,如果需要技术指导,欢迎联系我,仅需支付工时费
Twitter: Dasmz
Youtube: @DasmzStudio
Telegram: @Dasmz
