Unraid SFTPGo 搭建与使用:兼具多功能与自定义的高性能SFTP服务
SFTPGo 是一个功能齐全,高度可配置化,支持自定义 HTTP/S、FTP/S、WebDAV 的 SFTP 服务。它支持本地文件系统、加密本地文件系统、S3(兼容)对象存储,Google Cloud 存储,Azure Blob 存储,SFTP 等多种存储形式。
通过 SFTPGo,你可以搭建基于 HTTP/S,FTP/S,WebDAV 的 SFTP 文件协议的云存储服务器,并且你在创建用户的同时,能够对用户的权限进行多种自定义配置,包括限制来访用户的 IP 地址、上传下载的带宽大小、可访问的具体文件类型、可以使用的文件协议、二次认证、最大并发会话数量、可使用的磁盘配额.....等多种权限设置。
同时用户还可以方便的分享他的文件,甚至你还可以设置一个文件最多能够被访问多少次,当超过访问次数之后文件将无法访问等多种分享手段。
本文基于 Unraid 系统,向读者介绍此服务的安装与使用方法。恰巧社区里没有关于此工具的介绍,因此如果本文中有描述不正确的地方,烦请指正。
一、Docker 安装
进入到 Unraid 的 APP 应用商店,直接搜索 SFTPgo 即可搜索出对应的 Docker 应用,选择 Install 即可进入 Docker 的配置安装界面:
Unraid 商店中的 SFTPGo 模板已经为我们配置好大多数的参数,一般情况下我们只需要修改这里的 Share Access 路径映射参数和 Passive Mode IP 变量参数即可。
Share Access:将映射到容器内的路径设置为我们希望给到 SFTPGo 使用的文件夹即可。
以下图为例,作者在 Unraid 中创建了一个叫做 sftpgo 的共享文件夹,绝对路径为
/mnt/user/sftpgo,将其映射到容器中的 /unraid 路径”:
Passive Mode IP:将其设置为 Unraid 的内网 IP 地址即可:
配置完参数后,其他的配置可以不用修改,直接点击 APPLY 开始拉去镜像并创建容器。
安装完成后,输入 http://ip地址:2221 的地址即可进入到 WebUI 界面(2221 端口为 WebUI 的访问端口)。
二、本地文件系统与用户的相关配置
初次安装完成后,登录页面时会自动跳转到 /web/admin/setup 的 URL 后缀页面,并要求你创建一个系统管理员用户:
这里作者填写了一个账号为 admin 的账号,点击 Create admin 之后即可完成创建:
登陆后点击左侧的 Status 系统服务状态栏,会显示当前系统的服务状态:
从 Status 页面可以看到目前 SFTPGo 各项服务和功能的状态,这里一共显示了六项,分别是 SFTP/SSH、FTP、WebDAV、Defender、Multi-factor authentication 和 Data provider。其中前三项的 SFTP/SSH、FTP 和 WebDAV 会分别显示当前的开启状态和所监听的端口号等信息,所以当你需要使用某一种文件传输协议的时候就可以到此界面去查看对应的端口号,以便进行访问。 这里对 Defender、Multi-factor authentication 和 Data provider 做下简单的说明:
以下内容在官方的 Github 项目中都有说明,但是由于社区不能放链接,请大家自行到项目中去查看和搜索相应的内容。
Defender:Defender 是 SFTPGo 的 SFTP, HTTP, FTP and WebDAV 等服务的安全防护工具,可以防止 DoS 攻击,并且可以根据配置的策略实现自动封锁(IP、访问内容)。
Multi-factor authentication:这里指的是 SFTPGo 目前开启的认证方式,SFTPGo 支持多种认证方式,比如说两步认证(Two-factor Authentication,也叫2FA)、键盘交互认证(Keyboard Interactive Authentication)、SSH 的证书密钥认证(certificate authentication)等,并且也提供了相应的方式让用户去对某些认证方式做自定义;
Data provider:数据库配置。SFTPGo 支持 PostgreSQL, MySQL and CockroachDB 等外部数据库,如果没有对这些数据库做相应的配置(比如说我们现在的这种方式),那么默认情况下会在内部使用 SQLite 来作为数据库存储数据(容器启动时会自动创建)。所以如果你不想使用内置的 SQLite 作为数据库,那么你可以通过在 Docker 的配置中添加如下变量来链接到外部的数据库,比如说你在 Unraid 上安装了 Mariadb ,那么可以通过添加如下变量:
SFTPGO_DATA_PROVIDER__DRIVER :数据库类型,这里的值设置为 “mysql”;
SFTPGO_DATA_PROVIDER__NAME: 数据库名称,需要你提前在数据库中创建,比如说你在 mysql 中创建了一个名为“sftpgo”的数据库,那么这里就填写“sftpgo”;
SFTPGO_DATA_PROVIDER__HOST: 填写数据库的 IP 地址;
SFTPGO_DATA_PROVIDER__PORT: 数据库端口;
SFTPGO_DATA_PROVIDER__USERNAME :数据库用户名;
SFTPGO_DATA_PROVIDER__PASSWORD :数据库用户密码;
(一)创建本地后端存储(Local Storage)文件夹(Virtual folders)
我们第一步要做的配置工作,可以先从创建本地存储开始,点击 Folders 进入配置界面:
这里作者创建了一个叫做 share 的本地后端存储文件夹,并且此文件夹的位于我们映射到容器内的 /unraid 文件夹下(注意,当存储形式使用 Local 时需要使用绝对路径):
关于 Storage (Storage backends)的类型解释:
Local:即本地存储,这也是使用最多的形式,可以指向任意文件夹来作为存储目录;
Local encrypted(Data At Rest Encryption,静态数据加密):SFTPGo 通过其 cryptfs 虚拟文件系统支持静态数据加密,在这种模式下,SFTPGo在上传和/或下载过程中对数据(从本地磁盘)进行透明的加密和解密,确保服务器端的静态文件总是被加密的。
需要注意的是,如果你选择了这种存储类型,那么你在设置本地文件夹时,这一文件夹里面不能含有文件,也就是说你需要创建一个空文件夹用于使用这种加密的存储类型,否则系统会试图解密那些首先没有被加密的现有文件而产生错误(失败);
AWS S3/Google Cloud Storage/Azure Blob Storage:亚马逊、Google 和 微软的云存储等相关存储服务,这里就不做介绍了,感兴趣的可以去看说明;
SFTP:支持连接到其他 SFTP 服务器来作为后端存储,这里也不过多介绍,具体请查阅官方文档。
(二)创建用户并服务相关权限
在 SFTPGo 中对用户的权限配置有着丰富的可配置选项,这一小节会花费比较多的内容去做介绍。
后端存储建立好后,我们接下来需要创建相应的用户,并给到用户具体的权限来是使用我们搭建的 SFTPGo 服务。
Public Keys:非必填项,但是如果你没有填写上面的账户密码,那你就必须填写这里的 Public Keys,二选一。Public Keys 用于 SSH 登录,可通过 Linux 上的 ssh-keygen 命令来生成相应的公钥和私钥,生成之后将公钥的内容复制粘贴到这里的 Public Keys 文本框即可,这里不多做介绍。
这里作者创建了一个用户名为 jackie 的用户并设置了对应的密码,接下来我们会逐一介绍用户这一块的相关配置。
用户组(Groups)和文件系统(Filesystem):
用户组(Groups):SFTPGo 支持用户组的创建,可以通过用户组来批量管理用户,给用户组设置相应的权限后,归属于相应用户组的用户就会继承用户组的权限,这一点相信大家都能理解。其创建方法跟用户的创建类似,因此本文就不对用户组的内容做介绍了,大家去尝试即可。
文件系统(Filesystem):这里用于设置 SFTP/FTP/WebDAV 用户的家目录(home directory),需要使用绝对路径,留空即可。
在 SFTPGo 中,SFTP/FTP/WebDAV 用户的家目录存储在系统中的 /srv/sftpgo/data/<username> 文件夹下,因为我们在创建 Docker 的时候,已经将 /srv/sftpgo/data 这一文件夹进行了映射,所以我们在这里可以不用手动去设置其他的路径,直接留空即可。
默认情况下,每一个用户只能访问属于自己的家目录,可以上传文件到家目录,并对文件进行增删改查,并且还可以将自己的文件进行分享,通过登录到 WebUI 界面后可以对自己的文件进行相应的操作,如下图:
虚拟文件夹(Virtual folders)与配额(Quota):
虚拟文件夹(Virtual folders):虚拟文件夹是本地文件系统(filesystem)与虚拟路径(virtual path)之间的映射。以下图为例,作者分别建立了两个虚拟路径 /share_media 和 /share_book ,share_media 和 share_book 这两个虚拟文件夹都指向了之前创建好的本地文件夹 share (本地路径为/unraid/share)。
但需要注意的是,对一个用户来说,一个本地存储文件夹只能对应一个虚拟文件夹,所以当我们这里点击页面下方右下角的 Submit 提交用户创建信息时,会提示:Validation error: the folder "share" is duplicated.
也就是说同一个用户下, share 这个本地文件夹不能被多个虚拟文件夹映射。
因此我们这里就可以选择删掉其中一个虚拟文件夹,比如说删掉 share_media 这一个虚拟文件夹:
删除后:
配额(Quota):配额指的是这个用户对这一个虚拟文件夹能够使用多少的存储空间(Quota size)和可上传的文件数量(Quota files)。跟群晖上的用户配额限制是一样的意思,如下图在群晖中对新创建的用户限制了50G的相册套件使用空间(不过没有文件数量的限制):
对应到我们这里,我们对 jackie 这一用户限制了 10MB 的存储空间,并且最多不能上传超过2个文件:
存储空间的配额以字节(byte)来作为单位,由于我们一般都习惯使用 MB 来计算大小,所以我们可以通过在线网站去进行单位的换算:
需要特别说明的是,如果 Quota size 或 Quota files 被设置成了 -1 ,那么就表示这个虚拟文件夹的配额被限制在这个用户自身的配额上,也就表示只有这个用户对这一虚拟文件夹有使用权限,所以如果这个虚拟文件夹想要分享给其他用户去使用,那么就不能设置成 -1 。
Profile(用户档案信息):此设置可对用户的激活状态、设置过期时间、API 认证功能和其他相关的用户文字描述进行设置,没有需要特别注意的地方。
ACLs(Access Control Lists,用户访问控制列表):在此模块我们可以通过 SFTPGo 提供的多种精细化的权限控制设置,来对一个用户做到精确的权限范围界定。
如下图所示,我们可以在 Permissions(权限)的下拉菜单中,可以对这个用户能够使用哪些权限进行勾选(比如说:download-下载权限,upload-上传权限,rename-文件重命名…),你也可以保持默认的 * 不变,表示让这一用户能够使用所有的权限,然后再通过 ACLS 模块中的其余权限设置来覆盖相应的功能权限:
Per-directory permissions(虚拟文件夹权限):SFTPGo 允许对虚拟文件夹进行权限设置(virtual permissions),以下图为例:
根据上图,我们对 jackie 这一用户访问 /read-only 和 /subdir 路径下的内容进行了限制:虽然此用户拥有默认的全部权限(也就是在 Permissions 权限菜单中选择了 * ),但是此用户只能对 /read-only 路径下的文件进行查看(list,即 Linux 系统中的 ls 查看文件命令)和文件下载(download);同时此用户对 /subdir 下的内容没有任何权限(即不拥有查看、下载、重命名、删除…等所有权限),因为我们没有在 /subdir 右侧的权限列表中勾选任何的权限。
Per-directory pattern restrictions(文件限制模板规则):假设你希望限制用户对 /read-only 路径内的 png 和 jpg 图片的权限进行限制(无法下载、修改等),那么你可以通过 Per-directory pattern restrictions 功能进行配置,如下图所示:
此功能基于 shell 模板,可以通过通配符、字符集等去匹配对应的文件,例如上图中对 /read-only 文件夹下的 zip, txt, pdf 文件进行了限制,虽然这些文件可以看到的(Visible),用户无法修改、上传和下载这些文件。
其他设置:如下图,除了对具体文件夹和文件的限制之外,还可以对用户连接 SFTPGo 服务器的的最大并发会话数量(Max sessions),不允许使用的协议(Denied protocols:SSH, FTP, DAV, HTTP)、不允许的登录方式(Denied login methods)、需要二次认证的协议(HTTP、SSH、FTP)、拒绝和允许特定IP地址的访问等,这里就不一一做介绍了。
Disk quota and bandwidth limits(存储空间配额与带宽限制):此设置可限制该用户可用的存储空间、文件上传数量和带宽大小等一系列权限。
前面我们在设置虚拟文件夹的时候可以限制用户对虚拟文件夹所能使用的存储空间大小和文件数量,但如果虚拟文件夹的配额都设置成了 -1,那么就表示这一虚拟文件夹的配额量就被限制在的配额大小中。
完成用户创建:至此已经介绍完绝大部分的用户设置了,此时我们只需要点击右下角的 Submit 即可提交相关设置来完成用户的创建。
Disconnect the user after the update 指的是如果你对这一用户修改了相关设置并勾选了此选项之后,那么如果此用户在线的话会强制将用户踢下线,以此来让配置生效,用户重新登录之后即可应用新的用户配置。
三、文件的上传和下载
在前面的一章内容中,我们已经创建了一个用户名为 jackie 的用户,此时我们就可以使用 这个用户登录到 WebUI。
退出当前管理员用户:
点击 WebClient 切换至普通用户登录窗口:
输入用户的账号密码:
进入到 share_media 文件夹:
点击上传箭头即可通过网页的形式将文件进行上传:
由于作者先前对这一用户做了文件上传的限制,限制了此用户(jackie)不能上传 zip txt pdf 格式的文件,所以当这里上传这些类型的文件时会产生错误提示,提示 permission denied 的错误,告诉用户不能够上传此类型的文件:
上传 zip 文件时报错
上传 txt 文件时报错
除了上传文件,还可以通过网页的形式对文件夹内的数据进行重命名、删除和下载等,这里作者说一下文件的分享功能:
如上图所示,我们只需要勾选需要分享的文件,然后点击分享按钮后,在设置界面配置好相应的选项后,即可生成对应的分享选项,如下图:
链接的类型介绍如下:
如果是以文件夹为单位进行分享,那么点击上图中第二个连接后,会以文件列表的形式进行浏览和分享:
如果设置了 Max tokens,那么当访问的次数超过 Max tokens 的数值时,会提示无法访问,因为分享的访问次数已经用完:
四、使用软件客户端登录并挂载
常见的 FTP、SFTP、WebDAV 软件有 RaiDrive 和 WinSCP 等,这里以这两个软件做演示。
(一)使用 RaiDrive 挂载 WebDAV 和 SFTP
挂载 WebDAV
输入 SFTPGo 的服务器 ip 地址和端口号(WebDAV 为 10080 端口),并输入账号密码挂载即可。
由于我们是在内网中挂载,所以这里不需要使用 https 的话,点击 Address 取消使用 Https 连接方式。
挂载 SFTP
挂载方式同理:
(二)使用 WinSCP 来连接到 SFTPGo
WinSCP 也同时支持多种文件协议,连接的方式也是一样的,输入相应的 IP 地址、账号和密码进行连接即可:
五、结尾
SFTPGo 的大致用法基本上都已经介绍完了,除了本文介绍到的内容之外,仍有不少本值得去学习和研究的功能,包括本文没有介绍到的 Defender 安全防护与屏蔽功能、两步 TLS 验证、用户模板、API 接口等,读者感兴趣的话可以到官方的项目中去进一步学习(官方的文档写的很详细)。
(完)
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

xdos
校验提示文案
lcocuu
校验提示文案
不辣的啤特
校验提示文案
值友7982590037
校验提示文案
YikLiu
校验提示文案
值友5168276656
校验提示文案
yinhao
校验提示文案
值友6318172971
校验提示文案
沉和
校验提示文案
值友6012639097
校验提示文案
值友6012639097
校验提示文案
沉和
校验提示文案
值友6318172971
校验提示文案
yinhao
校验提示文案
值友7982590037
校验提示文案
不辣的啤特
校验提示文案
值友5168276656
校验提示文案
lcocuu
校验提示文案
YikLiu
校验提示文案
xdos
校验提示文案