nginx 入口使用 k8s 秘密作为 HTTP 标头

问题描述

我使用 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 用于集群)