K8s+Ingress-Nginx+oauth2-proxy下如何传递Ingress URL至skip_auth_routes
核心思路
要实现将Ingress的原始URL传递给oauth2-proxy并用于配置skip_auth_routes,关键是让Nginx Ingress在转发认证请求时,通过自定义请求头携带Ingress的主机或路径信息,再让oauth2-proxy基于这些头信息设置针对性的跳过规则。
具体操作步骤
1. 在Ingress中添加注解传递自定义请求头
在需要传递Ingress信息的Ingress资源里,新增nginx.ingress.kubernetes.io/auth-snippet注解,注入携带Ingress主机和路径的自定义请求头:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/auth-url: https://$host/oauth2/auth nginx.ingress.kubernetes.io/auth-snippet: | proxy_set_header X-Original-Ingress-Host $host; proxy_set_header X-Original-Ingress-Path $request_uri; spec: # 你的Ingress路由规则配置
这里通过X-Original-Ingress-Host和X-Original-Ingress-Path两个请求头,把当前Ingress的主机名和用户请求的完整路径传递给oauth2-proxy。
2. 配置oauth2-proxy的skip_auth_routes规则
在oauth2-proxy的配置中,利用传递过来的请求头,编写精准的跳过认证规则:
# 以helm values.yaml为例 config: skip_auth_routes: - "^/oauth2/.*$" - "Header(`X-Original-Ingress-Host`, `app.example.com`) && Path(`/public/api/`)" - "Header(`X-Original-Ingress-Host`, `static.example.com`) && Path(`/`)"
也可以通过命令行参数直接设置:
--skip-auth-route="Header(`X-Original-Ingress-Host`, `app.example.com`) && Path(`/public/api/`)"
oauth2-proxy支持Host()、Path()、Header()等函数的组合匹配,这样就能指定特定Ingress下的路径跳过认证。
3. 验证请求头传递有效性
查看oauth2-proxy的日志,确认自定义请求头是否被正确接收:
[2023/04/20 11:53:41] ***.com GET - "/oauth2/auth" HTTP/1.1 "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" Headers: {"X-Original-Ingress-Host": ["app.example.com"], "X-Original-Ingress-Path": ["/public/api/"]}
如果日志中能看到上述自定义头信息,说明传递成功,对应的跳过规则即可生效。
注意事项
- 确保oauth2-proxy默认允许转发这些自定义请求头,若有特殊配置,需检查
pass_authorization_header等相关参数是否开启。 - 规则语法需符合oauth2-proxy的要求,可参考其官方配置文档调整匹配逻辑。
内容的提问来源于stack exchange,提问作者Diego Jarillo

