后端网络存储【免费下载链接】sftpgoFull-featured and highly configurable SFTP, HTTP/S, FTP/S and WebDAV server - S3, Google Cloud Storage, Azure Blob项目地址https://gitcode.com/gh_mirrors/sf/sftpgo点击查看免费下载导读本指南围绕 SFTPGo 的External Authentication外部认证机制讲解如何在 Windows Server 上通过sftpgo-ldap-http-server项目让 SFTPGo 的用户认证经由一个或多个 Active Directory 连接完成并结合 Caddy Web 服务器实现静态文件对外公开访问。读完本文你将掌握外部认证钩子的配置方法、PHP 端configuration.php的完整参数含义、虚拟文件夹与权限对象的设计技巧以及一份可直接改编的 Caddyfile 示例。本文示例源自仓库中的 examples/php-activedirectory-http-server/README.md与本仓库的 examples/ldapauthserver基于 Go 的 LDAP 认证 HTTP 服务示例同属外部认证钩子的落地参考可作为对照学习。一、方案全景为什么用外部认证钩子接 Active DirectorySFTPGo 是一个功能完整的 SFTP/HTTP(S)/FTP(S)/WebDAV 服务器其用户认证默认由内置数据提供者SQLite、MySQL、PostgreSQL、内存等完成。但在企业场景中账号体系通常沉淀在 Active Directory 中直接为每个员工在 SFTPGo 内维护账号并不现实。为此SFTPGo 提供了外部认证钩子External Auth Hook配置项external_auth_hook可以是一个 HTTP URL也可以是一个外部程序的可执行路径用于在用户登录时验证凭据并按需创建或更新用户。该机制在源码中定义于 internal/dataprovider/dataprovider.go相关注释明确说明它比内置认证方式更慢但非常灵活任何人都可以轻松编写自己的认证钩子。本方案的技术栈如下组件作用SFTPGoSFTP/WebDAV 等文件传输服务主体位于 Windows Server 上sftpgo-ldap-http-server独立的外部认证 HTTP 服务监听localhost:9001代理到 Active Directory 查询Active Directory账号与组的权威来源可配置一个或多个连接Caddy反向代理/静态文件服务器将F:\files\public等目录以 HTTPS 公开configuration.phpPHP 配置文件控制虚拟文件夹、连接输出对象、自动组模式等全部行为该示例与仓库内ldapauthserver示例思路相近但更聚焦于 Active Directory 与 Windows Server 场景ldapauthserver基于 Go 编写配置见 examples/ldapauthserver/ldapauth.toml而sftpgo-ldap-http-server基于 PHP两者都以“HTTP 外部认证服务 SFTPGo 钩子”的方式工作。二、部署步骤从下载到跑通认证原文档给出的部署流程如下其中每一步都有对应的 SFTPGo 配置落点1. 下载并解压 sftpgo-ldap-http-server从sftpgo-ldap-http-server项目发布页下载最新的 Release ZIP 包将其解压到 Windows Server 上一个独立文件夹。ZIP 内包含sftpgo-ldap-http-server.exe可执行主程序OpenLDAP文件夹主要用来支持 LDAP 连接启用 TLS 所需的库文件Data文件夹内含logs目录、configuration.example.php、functions.php、LICENSE 与 README 文件。2. 安装 SFTPGo 并准备配置在服务器上安装 SFTPGoWindows 安装方式可参考 init/sftpgo.service 对应的服务化思路与官方安装包。然后进入Data目录将configuration.example.php复制一份并重命名为configuration.php开始按需定制填入你自己的 LDAP/Active Directory 连接设置设置目录创建方式最低限度必须把 home 目录home directories配置成符合你环境的期望路径——如果你用不到虚拟文件夹或其他高级功能可以完全不管它们。3. 启动 HTTP 认证服务在命令提示符cmd窗口中先切换到解压 ZIP 的目录然后直接执行sftpgo-ldap-http-server.exe此时程序会启动一个监听Port 9001、仅绑定 localhost 的简易 HTTP 服务器。端口同样可以在configuration.php中调整。4. 配置 SFTPGo 的 external_auth_hookSFTPGo 侧需要把data_provider.external_auth_hook指向该服务{ data_provider: { external_auth_hook: http://localhost:9001/, external_auth_scope: 0 } }仓库根目录的默认配置文件 sftpgo.json 中即包含这两个键的占位默认值为空字符串与 0。完成配置后即可发起认证测试——前提是 LDAP 设置全部正确且没有中间问题。5. 对照仓库内置的 ldapauthserver 如何构建若你更偏好 Go 实现可在 examples/ldapauthserver 目录执行go build -ldflags -s -w -o ldapauthserver其配置通过 ldapauth.toml 完成处理逻辑在 httpd/ldapauth.go接收 SFTPGo 发来的认证请求 → 连接并绑定 LDAP → 搜索用户要求结果恰好一条len(sr.Entries) ! 1时返回Expected one user, found: N→ 若带公钥则比对 LDAP 中存储的公钥否则用userdn password二次 Bind 校验密码 → 组装 SFTPGo 用户 JSON 返回。这套请求/响应契约与 PHP 方案完全一致。三、源码视角SFTPGo 外部认证钩子的请求与响应契约请求格式当external_auth_hook以http开头时SFTPGo 会向该 URL 发送POST application/json请求载荷字段见 getExternalAuthResponseJSON 字段含义username尝试登录的用户名ip客户端 IPpassword明文密码public_key公钥字符串公钥认证时protocol发起认证的协议keyboard_interactive键盘交互认证时的响应tls_certTLS 客户端证书若启用user已存在的用户对象若 SFTPGo 中已有该账号ID 0时附带钩子必须返回HTTP 200否则会报wrong external auth http status code错误internal/dataprovider/dataprovider.go。响应格式与处理逻辑认证服务返回的是一个 SFTPGo 用户 JSON 对象。SFTPGo 侧的处理流程doExternalAuth值得注意空响应表示不修改用户仅当 SFTPGo 中已存在该用户时才放行否则报“用户不存在”已存在时还会用本地密码库校验密码checkPasswordAfterEmptyExtAuthResponse。响应中username为空视为认证失败返回ErrInvalidCredentialsinternal/dataprovider/dataprovider.go。响应中username非空该用户名而非登录名被用作最终账号若与登录名不同SFTPGo 会按返回的用户名查找已有账号用于实现“多个登录名映射到同一 SFTPGo 账号”用户已存在则保留配额、上次登录、TOTP 等字段后更新不存在则自动创建provider.addUser。这解释了原文档强调的“认证通过的同时用户会被自动写入 SFTPGo 数据提供者”这一行为也意味着configuration.php里返回的对象字段越完整用户在 SFTPGo 中落地后越可用。认证范围external_auth_scopeexternal_auth_scope控制钩子参与哪些认证方式见 internal/dataprovider/dataprovider.go 与 isExternalAuthConfigured0全部范围密码、公钥、键盘交互、TLS 证书都走外部认证1仅密码2仅公钥4仅键盘交互8仅 TLS 证书可组合例如3 密码 公钥5 密码 键盘交互。取值范围0~15越界会被重置为 0见 internal/config/config.go。四、虚拟文件夹为每个用户同时挂载“私有”与“公共”目录原文档给出了完整的虚拟文件夹配置示例。SFTPGo 的虚拟文件夹Virtual Folder把用户家目录之外的磁盘路径映射为登录后的虚拟路径——定义见 internal/vfs/folder.go虚拟路径不能是/映射的父目录必须存在SFTPGo 会在登录时尝试自动创建缺失的父目录。以下配置为每位用户生成两个虚拟文件夹#USERNAME#会被替换成实际登录用户名$virtual_folders[example] [ [ //id 0, name private-#USERNAME#, mapped_path F:\files\private\#USERNAME#, //used_quota_size 0, //used_quota_files 0, //last_quota_update 0, virtual_path /_private, quota_size -1, quota_files -1 ], [ //id 0, name public-#USERNAME#, mapped_path F:\files\public\#USERNAME#, //used_quota_size 0, //used_quota_files 0, //last_quota_update 0, virtual_path /_public, quota_size -1, quota_files -1 ] ];各字段含义如下字段说明name虚拟文件夹在 SFTPGo 中的名称支持#USERNAME#占位符mapped_path对应的真实磁盘绝对路径同样支持占位符virtual_path登录后挂载的虚拟路径如/_privatequota_size字节配额上限0表示无限制-1表示计入用户总配额与quota_files语义一致见 internal/vfs/folder.goquota_files文件数配额上限0表示无限制-1表示计入用户总配额原文档特别提醒“Public” 虚拟文件夹本身并不是公开的。仅靠 SFTPGo 侧配置用户仍需认证登录才能访问。要真正把F:\files\public变成公开站点必须配合下方第五节的 Caddy 配置将站点根目录指向该磁盘路径才能实现。五、连接输出对象用权限矩阵把根目录变成“只读门户”原文档指出“魔法发生在 permissions 值里”通过把根home/root目录的权限限制为仅list与download再给两个虚拟文件夹授予全部权限即可实现“根目录没有文件、文件都放在公私虚拟文件夹中”的目录结构。$connection_output_objects[example] [ status 1, username , expiration_date 0, home_dir , uid 0, gid 0, max_sessions 0, quota_size 0, quota_files 100000, permissions [ / [list, download], /_private [*], /_public [*], ], upload_bandwidth 0, download_bandwidth 0, filters [ allowed_ip [], denied_ip [], ], public_keys [], ];字段要点status 1用户启用username留空表示沿用登录用户名home_dir留空时由服务端按configuration.php的 home 设置生成uid/gidWindows 场景下通常填0max_sessions0表示不限制并发会话数quota_files 100000给根目录设置一个宽松的文件数上限避免“无配额”误报permissions以目录为键的权限矩阵。SFTPGo 支持的权限字符串定义于 internal/dataprovider/user.go*全部权限list、download、upload、overwrite、delete、rename、create_dirs、create_symlinks、chmod、chown、chtimes、copy 等list允许列出文件与目录PermListItemsdownload允许下载文件PermDownload其余常用值还有upload、overwrite、delete、rename、create_dirs、copy等filters.allowed_ip/filters.denied_ipIP 白名单/黑名单空数组表示不限制public_keys允许的公钥列表可留空让认证走 AD 密码。借助该对象你可以做到用户登录后看不到家目录里的任何业务文件根目录仅可浏览/下载而/_private与/_public两个挂载点则拥有完整读写权限——/_public再配合 Caddy 对外发布就是典型的“私有空间 公开共享空间”企业文件分发模型。六、自动组模式按组前缀批量生成虚拟文件夹企业里用户往往属于多个 AD 组。sftpgo-ldap-http-server支持自动把用户所属组映射为虚拟文件夹但若不加限制所有组都会被塞进 SFTPGo。原文档给出的做法是开启自动组模式 声明允许的组前缀只让前缀匹配的组进入并自动剥离前缀。// If automatic groups mode is disabled, then you have to manually add the allowed groups into $allowed_groups down below: // If enabled, then any groups you are a memberof will automatically be added in using the template below. $auto_groups_mode true; $auto_groups_mode_virtual_folder_template [ [ //id 0, name groups-#GROUP#, mapped_path F:\files\groups\#GROUP#, //used_quota_size 0, //used_quota_files 0, //last_quota_update 0, virtual_path /groups/#GROUP#, quota_size 0, quota_files 100000 ] ]; // Used only when auto groups mode is enabled and will help prevent all your groups from being // added into SFTPGo since only groups with the prefixes defined here will be automatically added // with prefixes automatically removed when listed as a virtual folder (e.g. a group with name // sftpgo-example would simply become example). $allowed_group_prefixes [ sftpgo- ];行为说明auto_groups_mode false时必须手动把允许的组填入$allowed_groups原文档注释指明该变量auto_groups_mode true时用户所属的任何组都会按$auto_groups_mode_virtual_folder_template模板生成虚拟文件夹但只有名称以$allowed_group_prefixes中某个前缀开头的组才会被添加前缀在生成虚拟文件夹名称/路径时会自动移除例如 AD 组名sftpgo-example会变成example对应挂载点/groups/example、磁盘目录F:\files\groups\example模板中以#GROUP#占位替换模板中quota_size 0表示组目录无配额上限quota_files 100000给出宽松的文件数上限。七、Caddy 配置公开静态文件 HSTS 安全头 滚动日志 WebDAV 反代最后一块拼图是 Caddy。原文档提供的 Caddyfile 通过“可复用片段snippets”组织包含静态文件服务、安全响应头、日志三个片段以及站点与反向代理两组定义。片段一静态文件服务特性(add_static_file_serving_features) { # Allow accessing files without requiring .html: try_files {path} {path}.html # Enable Static File Server and Directory Browsing: file_server browse # Enable templating functionality: templates # Enable Compression for Output: encode zstd gzip handle_errors { respond pre{http.error.status_code} {http.error.status_text}/pre } }try_files {path} {path}.html访问不带.html的路径时自动补全扩展名file_server browse启用静态文件服务并允许目录浏览这正是让F:\files\public对外可见的关键指令templates启用模板渲染encode zstd gzip输出压缩handle_errors统一返回包含状态码/状态文本的纯文本错误页。片段二HSTS 与安全响应头(add_hsts_headers) { header { # Enable HTTP Strict Transport Security (HSTS) to force clients to always # connect via HTTPS (do not use if only testing) Strict-Transport-Security max-age31536000; includeSubDomains # Enable cross-site filter (XSS) and tell browser to block detected attacks X-XSS-Protection 1; modeblock # Prevent some browsers from MIME-sniffing a response away from the declared Content-Type X-Content-Type-Options nosniff # Disallow the site to be rendered within a frame (clickjacking protection) X-Frame-Options DENY # keep referrer data off of HTTP connections Referrer-Policy no-referrer-when-downgrade } }各头的作用HSTS 强制客户端始终走 HTTPS仅测试时可关闭X-XSS-Protection开启浏览器跨站脚本过滤X-Content-Type-Options: nosniff禁止 MIME 嗅探X-Frame-Options: DENY防点击劫持Referrer-Policy控制 referrer 泄露。片段三带路径参数的 JSON 滚动日志(add_logging_with_path) { log { output file {args.0} { roll_size 100mb roll_keep 5 roll_keep_for 720h } format json #format console #format single_field common_log } }该片段通过{args.0}接收日志文件路径单文件滚动阈值 100MB保留 5 个历史文件、保留时长 720 小时输出 JSON 格式注释中保留了console与common_log备选格式。站点定义公开的静态站点public.example.com { # Site Root: root * F:\files\public import add_logging_with_path F:\caddy\logs\public_example_com_access.log import add_static_file_serving_features import add_hsts_headers }root * F:\files\public把站点根目录指向磁盘公共目录——注意这与第五节中/_public虚拟文件夹映射的F:\files\public\#USERNAME#不同层级若想公开整个共享区可将 root 指向F:\files\public再配合file_server browse对外提供目录浏览。反向代理定义把 SFTPGo 的 WebDAV 暴露出去webdav.example.com { reverse_proxy localhost:9000 import add_logging_with_path F:\caddy\logs\webdav_example_com_access.log }reverse_proxy localhost:9000将 Caddy 收到的请求转发给本机 9000 端口的 SFTPGo WebDAV 服务让用户可以在浏览器/客户端中以https://webdav.example.com访问 WebDAV 能力并复用上述日志片段。八、排障与常见坑原文档指出其配套视频详细演示了若干排障场景结合源码可以归纳出这些高频问题认证服务未启动或端口不符sftpgo-ldap-http-server.exe默认监听 localhost:9001若configuration.php改了端口external_auth_hook必须同步修改否则 SFTPGo 报 HTTP 连接错误源码见 getExternalAuthResponse 的error getting external auth hook HTTP response。钩子返回非 200SFTPGo 严格要求 HTTP 200任何 4xx/5xx 都会导致登录被拒wrong external auth http status code。ldapauthserver 的实现也展示了典型错误码用法LDAP 连接失败 500、找不到唯一用户 404、公钥/密码校验失败 403。LDAP 搜索匹配不唯一认证服务要求搜索恰好命中一个用户命中 0 个或多个都会失败——请检查 BaseDN 与搜索过滤器是否过宽。home 目录路径未配置这是原文档强调的“最低限度”要求路径不对会直接导致后续虚拟文件夹的mapped_path创建失败。Public 目录“不公开”记得只有 Caddyfile_server browseroot指向对应磁盘目录才能真正对外发布SFTPGo 侧的/_public只是虚拟挂载不等于公开。HTTPS 强制HSTS 头一旦下发浏览器会长期强制 HTTPS仅内网测试时按注释建议先不要开启。九、延伸阅读本方案的同源对照实现examples/ldapauthserver/README.mdGo 版 LDAP 认证服务含 ldapauth.toml 配置与go build命令外部认证钩子的请求/响应契约与权限校验源码internal/dataprovider/dataprovider.go虚拟文件夹定义与配额语义internal/vfs/folder.go权限字符串完整清单internal/dataprovider/user.goSFTPGo 默认配置模板含external_auth_hook与external_auth_scopesftpgo.json。赞分享后端网络存储【免费下载链接】sftpgoFull-featured and highly configurable SFTP, HTTP/S, FTP/S and WebDAV server - S3, Google Cloud Storage, Azure Blob项目地址https://gitcode.com/gh_mirrors/sf/sftpgo点击查看免费下载相关推荐SFTPGo 外部认证 HTTP 钩子基于 LDAP 认证服务器ldapauthserver的完整实战指南SFTPGo 外部认证 HTTP 钩子基于 LDAP 认证服务器ldapauthserver的完整实战指南 导读 本文以 SFTPGo 仓库中 examp后端网络存储SFTPGo 外部认证钩子实战用 Go 编写 LDAP 认证程序389ds / Active DirectorySFTPGo 外部认证钩子实战用 Go 编写 LDAP 认证程序389ds / Active Directory 本指南以 SFTPGo 仓库中的 exa后端网络存储Apereo CAS 基于 LDAP 目录Active Directory / OpenLDAP的认证集成与配置指南Apereo CAS 基于 LDAP 目录Active Directory / OpenLDAP的认证集成与配置指南 CAS 将 LDAP 目录如 Act后端认证鉴权单点登录上一篇深入理解react-typeahead的模糊搜索原理实现高效数据过滤下一篇InfinityStar代码解读VideoVAE模块与多尺度BSQ量化技术实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考