基于SSHFS的网盘搭建
文章最后更新时间为:2020年09月04日 00:47:49
1. 介绍
SSHFS 是一个基于fuse的文件系统客户机,用于在安全Shell连接上挂载远程目录,可以用来挂载一个远程的sftp文件系统。
2. 使用
2.1 挂载
SSH用户需要能够访问目录。调用sshfs挂载远程目录
$ sshfs [user@]host:[dir] mountpoint [options]
示例
$ sshfs myuser@mycomputer:/remote/path /local/path -C -p 9876
这里的-p参数指定ssh端口,-C参数允许压缩传输
2.2 解除挂载
$ umount mountpoint
示例:
$ umount /local/path
2.3 更多参数
完整的参数列表可以参考https://linux.die.net/man/1/sshfs
3. SFTP服务端
SFTP(SSH文件传输协议)使用Secure Shell 协议(SSH)传输文件。和FTP类似,但是具有更高的安全性。有如下特点:
命令和文件通过ssh加密后传输。
与SCP协议只允许文件传输相比,SFTP更像一个远程文件系统协议。SFTP能力包括额外的恢复中断传输,目录列表和远程文件移动。
SSH软件包中,已经包含了一个SFTP子系统。只需在ssh配置中启用sftp子系统即可:
vim /etc/ssh/sshd_config
取消下面配置的注释
#Subsystem sftp /usr/lib/openssh/sftp-server
4. 安全性
sshfs的安全性主要依靠远程sftp服务端的安全限制。
4.1 设置只读权限
根据sftp-server的man手册https://manpages.debian.org/stretch/openssh-sftp-server/sftp-server.8.en.html,可以通过-R参数将sftp-server设置成只读模式。
# 将整个sftp-server子系统设置成只读模式
Subsystem sftp /usr/lib/ssh/sftp-server -R
4.2 多用户隔离
设置不同用户的sftp根目录 [5] 可以保证同时使用sftp服务器的多个用户相互隔离。
只需在/etc/ssh/sshd_config文件中添加如下配置:
Subsystem sftp /usr/lib/ssh/sftp-server
Match Group sftponly
ChrootDirectory %h
该规则的含义:是当匹配到用户组sftponly,将其根目录设置成该用户对应的home目录。
也可以使用Match User来代替Match Group匹配到用户名。
Match的作用是引入条件块。如果匹配行上的所有条件都得到满足,那么下面几行上的关键字将覆盖配置文件全局部分中设置的关键字,直到另一个匹配行或文件结束。如果一个关键字出现在满足要求的多个匹配块中,则只应用该关键字的第一个实例。
4.3 设置不同网段拥有不同的读写权限
在sshd_config配置文件中Match不仅可以匹配用户组和用户名,还可以匹配ip地址。
比如下面的demo配置:
Match Address 10.40.59.0/24
ChrootDirectory %h
ForceCommand internal-sftp -R
Match Address 10.10.201.0/24
ChrootDirectory %h
ForceCommand internal-sftp
通过上面的配置,可以限制10.40.59.0/24网段的用户只可读,10.10.201.0/24网段的用户可读可写。
4.4 禁止用户的ssh登陆权限和端口转发权限等。
通过Match规则可以限制用户的登陆权限和端口转发权限等等。
Match Group sftpusers
ChrootDirectory %h
ForceCommand internal-sftp -R
X11Forwarding no
AllowTcpForwarding no
PermitTTY no
或者也可以通过创建用户时将其登陆shell设置为/sbin/nologin来限制用户登录。
5.搭建sftp服务器实践
sftp server:
# 1. 创建sftp用户组和用户组目录,设置目录权限 groupadd sftpusers mkdir /home/sftpusers chown root:root /home/sftpusers chmod 755 /home/sftpusers # 2. 创建新用户,设置用户目录和目录权限 useradd -s /usr/sbin/nologin -G sftpusers -d /home/sftpusers/yanqing yanqing passwd yanqing mkdir /home/sftpusers/yanqing chown root:sftpusers /home/sftpusers/yanqing # 确保sftp用户根目录的所有人是root, 权限是 750 或者 755 chmod 755 /home/sftpusers/yanqing # 3. 给用户新建传输目录 mkdir -p /home/sftpusers/yanqing/trans chown yanqing:sftpusers /home/sftpusers/yanqing/trans # 4. 配置sshd_config vim /etc/ssh/sshd_config ---------- # override default of no subsystems Subsystem sftp internal-sftp Match Address 10.10.179.0/24 Group sftpusers ChrootDirectory /home/sftpusers/%u ForceCommand internal-sftp -R Match Address 10.10.200.*,10.40.0.0/16 Group sftpusers ChrootDirectory /home/sftpusers/%u ForceCommand internal-sftp ---------- # 5. 重启sshd服务 service sshd restart
- 客户端连接
可以挂载网盘:
sshfs [email protected]:/ /tmp/sshfs
但是无登陆权限:
$ ssh [email protected]
[email protected]'s password:
This service allows sftp connections only.
Connection to 10.40.59.29 closed.
参考
- https://zh.wikipedia.org/wiki/FUSE
- https://wiki.archlinux.org/index.php/SSHFS
- https://linux.die.net/man/1/sshfs
- https://zh.wikipedia.org/wiki/Secure_Shell
- https://wiki.archlinux.org/index.php/SFTP_chroot
- https://manpages.debian.org/stretch/openssh-sftp-server/sftp-server.8.en.html
- https://jlk.fjfi.cvut.cz/arch/manpages/man/sshd_config.5
- Linux 创建sftp用户并限制目录权限
- https://unix.stackexchange.com/questions/344444/match-multiple-users-in-sshd-config