基于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 yanqing@10.40.59.29:/ /tmp/sshfs

但是无登陆权限:

$ ssh yanqing@10.40.59.29
yanqing@10.40.59.29's password: 
This service allows sftp connections only.
Connection to 10.40.59.29 closed.

参考

1 + 5 =
快来做第一个评论的人吧~