问题描述
我使用 Nginx ingress 的设置如下:
Nginx.ingress.kubernetes.io/auth-url: http://api/v1/introspect
Nginx.ingress.kubernetes.io/auth-method: POST
Nginx.ingress.kubernetes.io/auth-response-headers: X-User-Auth
Nginx.ingress.kubernetes.io/auth-snippet: |
proxy_set_header auth-header "authheaderhere==";
我的问题很简单,但不确定答案是否是:
如何在不硬编码入口定义中的 auth-header
的情况下定义入口?
内省端点(解码 JWT 令牌并将其附加到代理到其他微服务的原始请求)没有暴露在集群之外,但我希望更加安心,因为知道端点,即使在集群中,也只响应到经过身份验证的请求(auth-header 是一个 base64 编码的字符串,其中包含一个客户端密钥和客户端 ID)
解决方法
您可以使用注释 nginx.ingress.kubernetes.io/auth-proxy-set-headers
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#external-authentication 来指代包含标题的 ConfigMap
。
您可以在此处找到示例 https://kubernetes.github.io/ingress-nginx/examples/customization/custom-headers
,如何在不硬编码入口定义中的 auth-header 的情况下定义入口?
开发自己的控制器。一个如何做的例子是here。
如果您不想将其附加到 Ingress 实体 - 必须有人这样做。
自己的控制器可以观察现有的入口(通过一些你的标签过滤)并更新入口清单:附加你想要的注释。
内省端点(解码 JWT 令牌并将其附加到代理到其他微服务的原始请求)没有暴露在集群之外,但我希望更加安心,因为知道端点,即使在集群中,也只响应到经过身份验证的请求(auth-header 是一个 base64 编码的字符串,其中包含一个客户端密钥和客户端 ID)
如果您想将您的 JWT 令牌隐藏到 Secret - 使用 vanilla Nginx IngressController 没有简单的方法可以做到。 The source 说:
nginx.ingress.kubernetes.io/auth-snippet
:<Auth_Snippet>
指定用于外部身份验证的自定义片段,例如
即只是您可以包含的 nginx 配置示例,无需其他转换。
但是如果你可以部署额外的 IngressController 实例,你可以在那里使用 global-auth-snippet
参数。
将您的代码段添加到 Nginx 的 ConfigMap。然后创建一些 IngressClass 并将 kubernetes.io/ingress.class=my_ingress_class_name
注释添加到您的 Ingress(甚至 make the class Default 用于集群)