Кэшировать результаты модуля auth_request с ключом по имени пользователя

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

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

У меня есть внешний прокси-сервер (nginx), который использует модуль HTTP-аутентификации для защиты панели управления. Конечно, я могу заставить 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;
}

пэм.конф:

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.


person 2rs2ts    schedule 19.10.2018    source источник