ForwardAuth
forwardAuth 中间件将认证委托给外部服务。
如果该服务返回 2XX 状态码,则授予访问权限,并执行原始请求。
否则,将返回认证服务器的响应。
配置示例¶
# Forward authentication to example.com
http:
middlewares:
test-auth:
forwardAuth:
address: "https://example.com/auth"# Forward authentication to example.com
[http.middlewares]
[http.middlewares.test-auth.forwardAuth]
address = "https://example.com/auth"# Forward authentication to example.com
labels:
- "traefik.http.middlewares.test-auth.forwardauth.address=https://example.com/auth"// Forward authentication to example.com
{
"Tags" : [
"traefik.http.middlewares.test-auth.forwardauth.address=https://example.com/auth"
]
}# Forward authentication to example.com
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: test-auth
spec:
forwardAuth:
address: https://example.com/auth配置选项¶
| 字段 | 说明 | 默认值 | 必填 |
|---|---|---|---|
address |
认证服务器地址。 | "" | 是 |
trustForwardHeader |
信任所有 X-Forwarded-* 请求头。trustForwardHeader 选项已弃用,将在下一个主版本中移除。 更多信息见此处。 |
- | 否 |
authResponseHeaders |
要从认证服务器响应中复制并设置到转发请求上的请求头列表,替换任何已有的冲突请求头。 | [] | 否 |
authResponseHeadersRegex |
用于匹配请求头的正则表达式。先移除所有匹配的请求头,再从认证服务器响应中复制匹配的请求头,并设置到转发请求上。 更多信息见此处。 |
"" | 否 |
authRequestHeaders |
从请求中复制给认证服务器的请求头列表。 可用于过滤不应传给认证服务器的请求头。 未设置或为空时,传递所有请求头。 |
[] | 否 |
addAuthCookiesToResponse |
从认证服务器复制到响应中的 Cookie 列表,替换转发响应中已有的冲突 Cookie。 请注意,与配置列表匹配的所有后端 Cookie 都不会添加到响应中。 |
[] | 否 |
forwardBody |
将 forwardBody 设置为 true 可发送请求体。由于 Traefik 会在转发前读取请求体,这会破坏流式传输。 |
false | 否 |
maxBodySize |
设置 maxBodySize 来限制请求体大小,单位为字节。超出此大小时返回 401(未授权)。未设置时,请求体大小不受限制,可能带来性能或安全影响。更多信息见此处。 |
-1 | 否 |
maxResponseBodySize |
设置 maxResponseBodySize 来限制认证服务器的响应体大小,单位为字节。超出此限制时返回 401(未授权)。未设置时,响应体大小不受限制,可能带来性能或安全影响。更多信息见此处。 |
- | 否 |
headerField |
定义用于存储已认证用户的请求头字段。 | "" | 否 |
preserveLocationHeader |
定义是将 Location 头原样转发给客户端,还是为其添加认证服务器域名前缀。 | false | 否 |
preserveRequestMethod |
定义向认证服务器转发请求时,是否保留原始请求方法。 | false | 否 |
authSigninURL |
指定认证服务器返回 401 Unauthorized 时重定向到的 URL。 | "" | 否 |
tls.ca |
设置用于与认证服务器建立安全连接的证书颁发机构证书路径,默认使用系统证书包。 | "" | 否 |
tls.cert |
设置用于与认证服务器建立安全连接的公钥证书路径。使用此选项时,必须设置 key 选项。 | "" | 否 |
tls.key |
设置用于与认证服务器建立安全连接的私钥路径。使用此选项时,必须设置 cert 选项。 |
"" | 否 |
tls.caSecret |
定义包含证书颁发机构证书的 Secret,用于与认证服务器建立安全连接;默认使用系统证书包。此选项仅适用于 Kubernetes CRD。 | 否 | |
tls.certSecret |
定义包含私钥和公钥证书的 Secret,用于与认证服务器建立安全连接。此选项仅适用于 Kubernetes CRD。 | 否 | |
tls.insecureSkipVerify |
在 TLS 连接期间,如果此选项设置为 true,认证服务器将接受服务端提供的任何证书,而不考虑其涵盖的主机名。 |
false | 否 |
authResponseHeadersRegex 响应头正则表达式¶
允许使用正则表达式对请求头名称进行部分匹配。
应使用字符串起始(^)和字符串结束($)锚点,确保完整匹配请求头名称。
可以使用 Go Playground 或 Regex101 等在线工具测试正则表达式和替换规则。
maxBodySize 请求体大小上限¶
maxBodySize 选项控制转发给认证服务器的请求体最大大小。
⚠️ 重要安全注意事项
默认情况下,未设置 maxBodySize(值为 -1),即请求体大小不受限制。这可能带来显著的安全和性能影响:
- 安全风险:攻击者可能发送极大的请求体,导致 DoS 攻击或内存耗尽。
- 性能影响:大型请求体消耗内存和处理资源,影响整个系统的性能。
- 资源消耗:不受限制的请求体大小可能导致非预期的资源使用情况。
建议配置
强烈建议根据具体使用场景设置合适的 maxBodySize 值:
# For most web applications (1MB limit)
maxBodySize: 1048576 # 1MB in bytes
# For API endpoints expecting larger payloads (10MB limit)
maxBodySize: 10485760 # 10MB in bytes
# For file upload authentication (100MB limit)
maxBodySize: 104857600 # 100MB in bytes
设置 maxBodySize 的指导原则
- Web 表单:1–5MB 通常足以满足大多数表单提交。
- API 端点:考虑预期最大的 JSON/XML 负载,并预留余量。
- 文件上传:根据预期最大的文件大小设置。
- 高流量服务:使用较小限制,避免资源耗尽。
maxResponseBodySize 响应体大小上限¶
maxResponseBodySize 选项定义认证服务器响应体允许的最大大小,单位为字节。
如果响应体超过配置的限制,则以 401(未授权)状态拒绝请求。
未设置时,请求体大小不受限制,可能带来性能或安全影响。
警告
强烈建议将此选项设置为适当的值。
不设置(或设为 -1)会允许无限大的响应体,可能导致 DoS 攻击和内存耗尽。
trustForwardHeader 信任转发头¶
警告
trustForwardHeader 选项已弃用,将在下一个主版本中移除。
使用 forwardedHeaders.trustedIPs 在 入口点层级配置可信 IP,
并在此中间件上将 trustForwardHeader 设置为 true。
在此配置下,入口点负责清理传入的 X-Forwarded-* 请求头:
移除不可信客户端发送的此类请求头,仅保留来自可信上游代理的请求头。
当 ForwardAuth 中间件处理请求时,可以保证所有 X-Forwarded-* 请求头都可信,
包括中间件链中其他中间件有意添加的请求头,例如 StripPrefix 中间件设置的 X-Forwarded-Prefix。
如果没有显式设置 trustForwardHeader,Traefik 会在启动时记录警告,并采用旧行为:移除部分 X-Forwarded-* 请求头(例如 X-Forwarded-For、X-Forwarded-Proto),但原样转发其他请求头(例如 X-Forwarded-Prefix)。
要消除此警告,请显式将 trustForwardHeader 设置为 true 或 false。
将 trustForwardHeader 选项设为 true,即可信任所有 X-Forwarded-* 请求头。
转发请求头¶
以下请求属性会以 X-Forwarded- 请求头的形式提供给转发认证目标端点。
| 属性 | 转发请求头 |
|---|---|
| HTTP 方法 | X-Forwarded-Method |
| 协议 | X-Forwarded-Proto |
| 主机 | X-Forwarded-Host |
| 请求 URI | X-Forwarded-Uri |
| 来源 IP 地址 | X-Forwarded-For |
在生产环境使用 Traefik OSS?
如果你在工作中使用 Traefik,可以考虑为 Traefik OSS 增加企业级 API 网关能力或商业支持。
为 Traefik OSS 增加 API 网关能力快捷且平滑,无需推倒重来,现有配置也会完整保留。请通过这个简短视频了解实际效果。