Authentication 验证请求模块的缓存结果,由用户名键入

Authentication 验证请求模块的缓存结果,由用户名键入,authentication,nginx,kubernetes,basic-authentication,pam,Authentication,Nginx,Kubernetes,Basic Authentication,Pam,我正在运行Kubernetes仪表板,作为其身份验证方法之一,它将允许您使用其中的承载令牌。令牌必须是承载令牌,即授权:承载 我还作为身份验证服务运行。它使用HTTP基本身份验证来查询PAM以获取用户的组,并使用该组构造一个承载令牌。在看到以下回答后,我对其进行了轻微修改,以在授权标题中返回承载令牌,该回答告诉我,您需要在标题中包含该令牌,以便我尝试执行以下操作: 我有一个前置代理(nginx),它使用来保护仪表板。当然,我可以让nginx将Authorization:Basic头从此转发到pa

我正在运行Kubernetes仪表板,作为其身份验证方法之一,它将允许您使用其中的承载令牌。令牌必须是承载令牌,即
授权:承载

我还作为身份验证服务运行。它使用HTTP基本身份验证来查询PAM以获取用户的组,并使用该组构造一个承载令牌。在看到以下回答后,我对其进行了轻微修改,以在
授权
标题中返回承载令牌,该回答告诉我,您需要在标题中包含该令牌,以便我尝试执行以下操作:

我有一个前置代理(nginx),它使用来保护仪表板。当然,我可以让nginx将
Authorization:Basic
头从此转发到pam_hook,pam_hook可以在
Authorization:bearer
头中使用承载令牌进行回复

然而,我有两个问题:

  • 我正在努力从pam_hook处获取转发到kubernetes仪表盘的不记名令牌;nginx仅转发基本身份验证
  • 即使我能够让它通过,我也不确定如何安全地缓存响应。我需要分别缓存每个用户的不记名令牌,否则,人们将能够彼此扮演角色。这个答案暗示了这一点,但并没有告诉你如何避免这个问题:
  • 所以现在我的配置看起来像这样(我在这里大大简化):

    nginx.conf:

    http {
      proxy_cache_path /tmp/cache levels=1:2 keys_zone=authentication:10m inactive=15m;
      proxy_cache_valid 200 15m;
      include /etc/nginx/conf.d/pam.conf;
      include /etc/nginx/conf.d/upstream.conf;
    }
    
    pam.conf:

    auth_pam "Log in please";
    auth_pam_service_name "nginx";
    
    upstream.conf:

    upstream backend {
      server localhost:9090
    }
    
    server {
      listen 443 default_server;
    
      location @upstream {
        proxy_pass https://backend;
        proxy_redirect off;
      }
    
      include /etc/nginx/conf.d/basic_auth_proxy.conf;
    
      location / {
        root /dev/null;
        try_files $uri @upstream;
        auth_request /basicauthproxy;
        auth_request_set $authorization_header $upstream_http_authorization;
        proxy_set_header Authorization $authorization_header;
      }
    }
    
    basic_auth_proxy.conf:

    location /basicauthproxy {
      internal;
    
      proxy_pass              https://pamhook/token;
      proxy_cache             authentication;
      proxy_cache_key         $cookie_authentication;
      proxy_pass_request_body off;
      proxy_hide_header       Set-Cookie;
      proxy_ignore_headers    Set-Cookie;
      proxy_set_header        Cookie "";
      proxy_set_header        Host $host;
      proxy_set_header        Content-Length "";
      proxy_set_header        X-Original-URI $request_uri;
    }
    
    我现在得到的行为是,提示我输入基本身份验证,传递我的凭据,成功,然后仪表板获取转发的请求。。。但是
    授权
    头包含来自代理的基本身份验证信息,而不是承载令牌。我错过了什么才能让它发挥作用

    编辑:我增加了pam_hook日志的详细内容。它没有收到nginx的任何请求。所以这可能是第一个要解决的问题,但我并不理解为什么会发生这种情况。我知道我可以从nginx容器中卷曲pam_hook,所以这不是一个糟糕的网络策略问题