Кэшировать результаты модуля auth_request, используя имя пользователя - PullRequest
0 голосов
/ 19 октября 2018

Я использую панель управления Kubernetes, которая в качестве одного из методов аутентификации позволит вам передать заголовок Authorization с токеном-носителем в нем.Токен должен быть токеном на предъявителя, то есть Authorization: Bearer <token goes here>.

Я также использую pam_hook в качестве моей службы аутентификации.Он использует базовую аутентификацию HTTP для запроса PAM, чтобы получить группы пользователей, и с этим создает маркер-носитель.Я немного изменил его, чтобы возвращать токен носителя в заголовке Authorization после просмотра этого ответа, который говорит мне, что вам нужно иметь его в заголовке для того, что я пытаюсь сделать: https://stackoverflow.com/a/31485557/691859

У меня есть внешний прокси (nginx), который использует HTTP-модуль PAM auth для защиты панели мониторинга.Конечно, я могу получить от nginx заголовок Authorization: Basic <basic auth goes here> от этого к pam_hook, и pam_hook может ответить с токеном-носителем в заголовке Authorization: Bearer <token goes here>.

Однако у меня возникли две проблемы:

  1. Я изо всех сил пытаюсь получить токен на предъявителя из pam_hook, перенаправленный на панель управления kubernetes;nginx только пересылает базовую аутентификацию.
  2. Даже если я смог ее пройти, я не уверен, как можно безопасно кешировать ответы.Мне нужно кэшировать токен на предъявителя каждого пользователя отдельно, иначе люди смогут действовать как друг с другом.Этот ответ намекает на это, но он не говорит вам, как избежать проблемы: https://stackoverflow.com/a/44232557/691859

Так что сейчас моя конфигурация выглядит следующим образом (я значительно упрощаю здесь):

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;
}

В настоящее время я получаю сообщение о том, что у меня запрашивают базовую аутентификацию, я передаю свои учетные данные, которые успешно выполняются, а затем приборная панель получает перенаправленный запрос ... но заголовок Authorization содержит основную информацию об аутентификации.из прокси, а не токен на предъявителя.Чего мне не хватает, чтобы заставить это работать?

Редактировать: я поднял многословие логов pam_hook.Он не получает никаких запросов от nginx.Так что это, вероятно, первая проблема, которую я должен решить, а не то, что я понимаю, почему это происходит.Я знаю, что могу свернуть pam_hook из контейнера nginx, так что это не проблема плохой NetworkPolicy.

...