繁体   English   中英

无法使用 Google Kubernetes Engien Nginx 入口控制器获得 HTTP 基本身份验证

[英]Can't get HTTP basic auth with Google Kubernetes Engien Nginx ingress controller

根据 Kubernetes 文档,Nginx 入口控制器支持添加基本身份验证。 我正在设置的必需的 Ingress 注释是:

nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: namespace/secret
nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"

我的入口控制器图像是:gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.11

我找不到来自入口控制器的任何指示错误的日志,但不存在基本身份验证。 以防万一,我正在使用 cert-manager 来配置 Let's Encrypt TLS 证书,它运行良好。

您使用了错误的控制器/注释。 这些注释适用于具有此官方图像的https://github.com/kubernetes/ingress-nginx

您有如何在此处部署控制器的示例

如果你想使用 gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.11,注释是:

ingress.kubernetes.io/auth-type: basic
ingress.kubernetes.io/auth-secret: basic-auth
ingress.kubernetes.io/auth-realm: "Authentication Required"

您可以在此处此处找到完整的文章。

要在 Nginx Ingress 上配置基本身份验证,应该做两件事:
(我假设您已经在集群上运行了入口控制器)

  1. 一个名称和内容为 base64 编码行的用户名/密码的 Secret 应该存在:(在本例中,名称“basic-auth”用作 Secret 的名称,但您可以选择任何您想要的有效名称。) : foo , 密码: bar

     $ htpasswd -c auth foo New password: bar Re-type new password: bar Adding password for user foo $ kubectl create secret generic basic-auth --from-file=auth secret "basic-auth" created $ kubectl get secret basic-auth -o yaml apiVersion: v1 data: auth: Zm9vOiRhcHIxJE9GRzNYeWJwJGNrTDBGSERBa29YWUlsSDkuY3lzVDAK kind: Secret metadata: name: basic-auth namespace: default type: Opaque
  2. Ingress 对象应该与 Secret 存在于同一个命名空间中:
    (这里我们为 Ingress 和 Secret 使用默认命名空间)

     echo " apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-with-auth annotations: # type of authentication nginx.ingress.kubernetes.io/auth-type: basic # name of the secret that contains the user/password definitions nginx.ingress.kubernetes.io/auth-secret: basic-auth # message to display with an appropriate context why the authentication is required nginx.ingress.kubernetes.io/auth-realm: \\"Authentication Required - foo\\" spec: rules: - host: foo.bar.com http: paths: - path: / backend: serviceName: <your_backend_service_name> servicePort: <your_backend_service_port> " | kubectl create -f -

要使用带有或不带有身份验证的 GET 请求来验证您的配置检查回复:
30xxx - 从命令kubectl get svc --all-namespaces | grep ingress-nginx | grep NodePort输出中获取端口号)

$ curl -v http://cluster.node.ip.address:30xxx/ -H 'Host: foo.bar.com'
...
< HTTP/1.1 401 Unauthorized
...

$ curl -v http://cluster.node.ip.address:30xxx/ -H 'Host: foo.bar.com' -u 'foo:bar'
...
< HTTP/1.1 200 OK
...

在下一步中,您可以将您选择的 SSL 或 TLS 配置添加到 Ingress 对象规范。

更新:上面的例子在 当前的 nginx 入口控制器v0.44.0 上仍然可以正常工作

我重新确认,如果未强制实施 SSL/HTTPS,则cert-manager配置不应影响入口控制器管理普通 HTTP 流量的方式。

htpasswd可以作为 CentOS 的 Ubuntu/Debian 软件包apache2-utilshttpd-tools的一部分安装:

apt install apache2-utils
yum install httpd-tools

对于入口控制器的ngninxinc版本,请考虑阅读问题 #200

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM