SFTPGo 是一款免费、开源、功能齐全且高度可配置的 SFTP 服务器,具有可选的 HTTP/S、FTP/S 和 WebDAV 支持。
支持多种存储后端:本地文件系统、加密的本地文件系统、S3(兼容)对象存储、谷歌云存储、Azure Blob 存储、其他 SFTP 服务器。
GitHub 项目页面上详细描述了所有支持的功能 。
SFTPGo 适用于许多操作系统,包括 Linux、Windows、macOS、FreeBSD。
在本教程中,您将学习如何在 Ubuntu Ubuntu 22.04 系统上安装 SFTPGo,我们将探索 v2.3.0 中引入的主要新功能。
出于安全原因,建议在您的系统中安装和配置 UFW 防火墙。首先,使用以下命令安装 UFW 防火墙:
sudo apt install ufw -y
SFTPGo 使用以下默认配置的 TCP 端口:
我们还需要允许 OpenSSH 端口用于服务器管理。
使用以下命令允许所有需要的端口:
sudo ufw allow OpenSSH
sudo ufw allow 2022/tcp
sudo ufw allow 8080/tcp
接下来,在系统重启后启用 UFW 防火墙:
sudo ufw enable
检查状态:
sudo ufw status
您将获得以下输出:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2022/tcp ALLOW Anywhere
8080/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
2022/tcp (v6) ALLOW Anywhere (v6)
8080/tcp (v6) ALLOW Anywhere (v6)
您可以从其PPA安装 SFTPGo 。
首先添加 PPA:
sudo add-apt-repository ppa:sftpgo/sftpgo
sudo apt update
接下来安装 SFTPGo:
sudo apt install sftpgo
安装后 SFTPGo 应该已经使用默认配置运行并配置为在启动时自动启动,使用以下命令检查其状态:
systemctl status sftpgo
现在,打开您的 Web 浏览器并使用 URL 访问 SFTPGo 安装向导:“ http://<your server ip/hostname:8080>/”。
您将被重定向到以下页面:
提供您的管理员用户名和密码,然后单击“创建管理员”按钮。
新创建的管理员将自动登录,因此您可以创建 SFTPGo 用户。
有关创建用户的更多详细信息,您可以查看入门指南。
让我们在接下来的部分中探讨 v2.3.0 中引入的主要新功能。
使用组可以简化多个 SFTPGo 用户的管理:您可以将设置一次分配给一个组,而不是多次分配给每个单独的用户。
SFTPGo 支持两种类型的组:
用户可以是主要组和许多次要组的成员。根据组类型,设置的继承方式不同。
您可以通过查阅官方文档找到更多详细信息。
让我们在这里看一些用法示例。
假设您有以下要求:
/srv/sftpgo/data/<username>
/s3<username>
中有一个可用的 S3 虚拟文件夹,并且每个用户只能访问 S3 存储桶的指定“前缀”。它不能访问其他用户的文件我们可以通过定义两个组来轻松满足这些要求。
在 SFTPGo WebAdmin UI 中,单击“文件夹”,然后单击“+”图标。
创建一个名为“S3private”的文件夹。
将存储设置为“AWS S3(兼容)”并填写所需参数:
重要的部分是“密钥前缀”,将其设置为users/%username%/
。
“密钥前缀”限制对指定存储桶子文件夹的访问。
占位符“ %username% ”将替换为相关的用户名。
使用与“S3private”相同的设置创建另一个名为“S3shared”的文件夹,但这次将“密钥前缀”设置为shared/。
“密钥前缀”没有占位符,因此文件夹将在不会根据关联用户更改的静态路径上运行。
现在单击“组”,然后单击“+”图标并添加一个名为“Primary”的组。
将“主目录”设置为/srv/sftpgo/data/%username%
。
和以前一样,占位符“ %username% ”将替换为关联的用户名。
将两个虚拟文件夹添加到该组,并将“最大文件上传大小”设置为 1073741824 字节 (1GB)。
添加一个新组并将其命名为“SharedReadOnly”,在 ACL 部分中设置/shared路径的权限,以便授予只读访问权限。
组设置现已完成。
我们现在可以创建我们的用户并将主要组设置为“主要”。对于需要对/shared
路径进行只读访问的用户,我们还必须将“SharedReadOnly”设置为辅助组。
单击“用户”,然后单击“+”图标并添加一个名为“user1”的用户。
此用户符合上述限制,并具有对/shared路径的完全访问权限。
现在创建符合上述限制并且对/shared路径 具有只读访问权限的“user2” 。
您还可以使用模板功能同时创建多个用户。
只需设置用户名、凭据和组成员身份。
现在您可以使用 FileZilla、WinSCP 等任何 SFTP 客户端登录并验证是否满足要求。
在没有 SFTPGo 帐户的情况下与外部用户共享文件是一项常见要求。在 v2.3.0 中,此功能已得到改进。
支持以下共享模式:
让我们看看它们是如何工作的。
登录到 WebClient UI 并创建一个名为“external_share”的新目录。
将一些文件添加到新创建的目录中。
然后选择“external_share”文件夹并单击“共享”图标。
将出现“添加新共享”屏幕,选择“读取”范围。
或者,您可以限制共享的使用次数,使用密码保护共享,通过源 IP 地址限制访问,设置自动到期日期。
然后从共享列表中,选择您刚刚创建的共享并单击“链接”图标。将出现一个弹出窗口,其中包含有关如何使用共享的说明。
您可以将共享内容下载为单个 zip 文件,也可以浏览它们并逐个文件下载。
您可以复制这些链接并将它们发送给您的外部客户。
如您在以下屏幕中所见,将显示可浏览共享的链接。
现在,编辑共享并将范围更改为“写入”。
共享链接将显示以下屏幕。
因此,您的外部用户可以上传文件,但不能浏览或下载共享内容。
如果要防止覆盖现有文件,可以使用标准 SFTPGo 每个目录权限。
再次编辑共享并将范围更改为“读/写”。
共享链接将显示以下屏幕。
所以现在外部用户可以浏览、下载和添加新文件到共享目录。
可以自定义 SFTPGo 网络用户界面以匹配您的品牌。以下是/etc/sftpgo/sftogo.json
中的相关配置部分:
"branding": {
"web_admin": {
"name": "",
"short_name": "",
"favicon_path": "",
"logo_path": "",
"login_image_path": "",
"disclaimer_name": "",
"disclaimer_path": "",
"default_css": "",
"extra_css": []
},
"web_client": {
"name": "",
"short_name": "",
"favicon_path": "",
"logo_path": "",
"login_image_path": "",
"disclaimer_name": "",
"disclaimer_path": "",
"default_css": "",
"extra_css": []
}
}
查看 WebAdmin 登录屏幕。
默认的“名称”是“SFTPGo WebAdmin”,因此页面标题是“SFTPGo WebAdmin - 登录”。
默认的“短名称”是“WebAdmin”,因此登录页面显示“WebAdmin - <SFTPGo 版本>”。
您可以通过设置“favicon_path”来自定义图标,通过设置“login_image_path”来自定义左侧的图像。
如果您设置“disclaimer_name”和“disclaimer_path”,登录页面底部会出现一个新链接。您可以将其用于法律免责声明或其他任何内容。
您可以通过设置“logo_path”和“short_name”为登录用户自定义页面左上角的徽标和标签。
SFTPGo 使用优秀的 SB Admin2主题。如果您想对主题进行一些小的更改,您可以设置“extra_css”以指向您的自定义 CSS 文件的路径。
另一方面,如果您重建 SB Admin 2 CSS,则可以将“default_css”设置为自定义 CSS 的路径。这样我们就可以避免加载默认主题,然后用您的更改覆盖它。
所有配置的路径(favicon_path、logo_path 等)必须相对于“static_files_path”。
在 Linux 上,默认的“static_files_path”是/usr/share/sftpgo/static
,例如,您可以创建一个“品牌”目录并将您的自定义资源放在那里。
例如,您可以将 favicon 复制到/usr/share/sftpgo/static/branding/favicon.ico
并将“favicon_path”设置为/branding/favicon.ico
。
您可以使用环境变量覆盖任何配置选项,例如,可以使用SFTPGO_HTTPD__BINDINGS__0__BRANDING__WEB_ADMIN__FAVICON_PATH
环境变量设置 Web 管理图标路径。
更改配置文件后,您需要重新启动 SFTPGo 服务以应用更改。
sudo systemctl restart sftpgo.service
如果您有一个现有的身份提供者,它可能支持 OpenID Connect标准。
您现在可以将您的身份提供者用户映射到 SFTPGo 管理员/用户,这样您就可以使用您的身份提供者登录到 SFTPGo WebClient 和 WebAdmin UI。
SFTPGo 用户也可以通过定义pre-login hook在成功 OpenID 连接登录后自动创建。您可以将令牌声明字段配置为可用于登录前挂钩,然后在挂钩中创建/更新 SFTPGo 用户时实现您自己的自定义逻辑。
SFTPGo 官方文档解释了将 SFTPGo 与Keycloak集成的步骤。其他身份提供商,如 Google Identity、Azure Active Directory、Auth0、OneLogin 已通过 SFTPGo 社区的测试,并已确认可以正常工作。
一般来说,任何实现 OpenID Connect Discovery规范的 OpenID Connect 身份提供者都应该可以工作。
SFTPGo 内置 ACME(自动证书管理环境),因此您可以轻松获取和更新免费的 Let's encrypt TLS 证书,用于 SFTPGo Web UI 和 REST API、WebDAV 服务和 FTP 服务。
获取 Let's Encrypt 证书涉及解决 ACME(自动证书管理环境)服务器发出的域验证挑战。此挑战验证您对尝试获取证书的域的所有权。存在不同的挑战类型,SFTPGo 支持“HTTP-01”和“TLS-ALPN-01”挑战类型。
为了能够使用 ACME 协议,您需要一个带有服务器 IP 的有效域名。
让我们看一个示例配置,我们做出以下假设:
/var/www/sftpgo.com
打开 SFTPGo 配置文件/etc/sftpgo/sftpgo.json
,搜索“acme”部分,修改如下:
"acme": {
"domains": ["sftpgo.com"],
"email": "<you email address here>",
"key_type": "4096",
"certs_path": "/var/lib/sftpgo/certs",
"ca_endpoint": "https://acme-v02.api.letsencrypt.org/directory",
"renew_days": 30,
"http01_challenge": {
"port": 80,
"proxy_header": "",
"webroot": "/var/www/sftpgo.com"
},
"tls_alpn01_challenge": {
"port": 0
}
}
确保“sftpgo”用户可以写入/var/www/sftpgo.com
目录或预先创建具有适当权限 的/var/www/sftpgo.com/.well-known/acme-challenge
目录。
通过运行以下命令注册您的帐户并获取证书:
sudo -E su - sftpgo -m -s /bin/bash -c 'sftpgo acme run -c /etc/sftpgo'
完毕!从现在开始,SFTPGo 服务将负责为配置的域自动更新证书。
默认情况下,证书存储在/var/lib/sftpgo/certs
目录中。您现在可以配置 SFTPGo 服务以使用这些证书。
例如,对于 Web UI,将 SFTPGo 配置文件/etc/sftpgo/sftpgo.json
更改如下:
"httpd": {
"bindings": [
{
"port": 9443,
"address": "",
"enable_web_admin": true,
"enable_web_client": true,
"enable_https": true,
"certificate_file": "/var/lib/sftpgo/certs/sftpgo.com.crt",
"certificate_key_file": "/var/lib/sftpgo/certs/sftpgo.com.key",
.....
重新启动 SFTPGo 服务以应用更改:
sudo systemctl restart sftpgo.service
您可以以类似的方式为其他服务启用 TLS。
SFTPGO Geo-IP 过滤插件允许根据客户端 IP 地址的地理位置接受/拒绝连接。
该插件可以读取 MaxMind GeoLite2和 GeoIP2数据库。您需要下载 MMDB 格式的国家数据库。
让我们看一个示例配置。
我们做出以下假设:
/usr/local/bin/sftpgo-plugin-geoipfilter-linux-amd64
路径/var/lib/sftpgo/GeoLite2-Country.mmdb
路径打开 SFTPGo 配置文件 /etc/sftpgo/sftpgo.json ,搜索“plugins”部分,修改如下:
"plugins": [
{
"type": "ipfilter",
"cmd": "/usr/local/bin/sftpgo-plugin-geoipfilter-linux-amd64",
"args": ["serve", "--db-file", "/var/lib/sftpgo/GeoLite2-Country.mmdb", "--allowed-countries", "IT"],
"sha256sum": "",
"auto_mtls": true
}
]
重新启动 SFTPGo 服务以应用更改:
sudo systemctl restart sftpgo.service
完毕!
在 SFTPGo 日志中,当来自被拒绝国家/地区的连接被拒绝时,您将看到如下内容:
{"level":"debug","time":"2022-06-02T14:05:48.616","sender":"plugins.ipfilter.sftpgo-plugin-geoipfilter-linux-amd64","message":"[DEBUG] country not allowed: ip=XXX.XX.XXX.XXX country=NL"}
其他 SFTPGo 插件可在此处获得。
SFTPGo 支持每个用户和每个目录的 shell 模式过滤器:可以根据 shell 模式允许、拒绝和可选地隐藏文件。
让我们看一些例子。
假设您要拒绝特定目录中所有带有 jpg 和 png 扩展名的文件。
选择要修改的用户,展开“ACLs”部分并添加类似 shell 的模式限制。
这样,具有 png 和 jpg 扩展名的文件无法下载或上传,但如果已经存在,则在目录列表中仍然可见。
您可以通过将策略设置为“隐藏”来隐藏它们。
“隐藏”策略是在 v2.3.0 中引入的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。