微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 用于集群)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。