{ auto_https off admin off servers { # 只信本机 nginx 追加的 X-Forwarded-*。private_ranges 会把整个内网段当作可信代理 # (同网段任何人都能伪造 XFF/X-Forwarded-Proto 污染注册限流键与协议判定)。 # nginx 不在本机时,把它的 IP 逐个列进来,别放开网段。 trusted_proxies static 127.0.0.0/8 } } # ★ 特权方法路径:这一条正则是**唯一权威**,必须与 Authelia configuration.yml 里 # admins 放行 + 其余 deny 的两条 resources 正则逐字符一致(已按全匹配形式对齐: # Caddy 的 path_regexp 要求整段匹配,故结尾带 .*$;Authelia 锚定开头,结尾天然不限)。 # 改一边不改另一边 = 权限漂移(要么成员拿到 Host: localhost 的特权调用,要么管理员被 403)。 # 升级 dsh 后若核心新增特权方法,同步这一处 + Authelia 那一处,并跑 handbooks/upgrade.md 的验收。 :9443 { bind 127.0.0.1 @adminapi path_regexp adminapi ^/api/(settings\.|credentials\.|agentPreset\.(read|copy|openDocument|remove)|host\.(pickDirectory|openPath)).*$ handle @adminapi { forward_auth 127.0.0.1:9091 { uri /auth/api/authz/forward-auth copy_headers Remote-User Remote-Groups Remote-Email Remote-Name } reverse_proxy 127.0.0.1:3088 { header_up Host localhost header_up -Origin header_up X-Dsh-Tenancy-Key "{env.DSH_TENANCY_SECRET}" flush_interval -1 } } # P4:邀请码注册页 —— 匿名可达(不走 forward_auth,不注入身份头; # 插件侧自带每 IP 限流 + 一次性邀请码校验 + browser-trust 围栏)。 # 密钥照样注入:插件用它证明"这请求经过了 Caddy",不是来自直连 3088 的伪造方。 @register path /register /register/* handle @register { reverse_proxy 127.0.0.1:3088 { header_up Host dsh.example.com header_up -X-Forwarded-For header_up -X-Real-IP header_up X-Dsh-Tenancy-Key "{env.DSH_TENANCY_SECRET}" flush_interval -1 } } # 团队常规路径:固定公网域名(基础围栏依赖 Origin==Host;防 Host: localhost 越权) handle { forward_auth 127.0.0.1:9091 { uri /auth/api/authz/forward-auth copy_headers Remote-User Remote-Groups Remote-Email Remote-Name } reverse_proxy 127.0.0.1:3088 { header_up Host dsh.example.com # ★ 不要在这里 header_up -Remote-*:copy_headers 是覆盖语义, # 认证成功后 Authelia 的真实身份会替换客户端伪造值;若在此删除, # dsh 收不到身份头,会把所有人都当 local admin(fallback 语义)。 header_up X-Dsh-Tenancy-Key "{env.DSH_TENANCY_SECRET}" flush_interval -1 } } } # ──────────────────────────────────────────────────────────────────────────── # 公开站点(pub.example.com)—— P11,匿名静态发布,不经 forward_auth。 # 默认拓扑是 nginx 把该域名直连 127.0.0.1:3089(见 examples/nginx/ # dsh.example.com.conf),无需本块。若你的拓扑要求「全部流量都走 Caddy」, # 可把公开域名挂在 Caddy 上(另起端口,nginx 再转发到该端口),例如: # # pub.example.com:9444 { # bind 127.0.0.1 # reverse_proxy 127.0.0.1:3089 { # flush_interval -1 # } # } # ────────────────────────────────────────────────────────────────────────────