Я использую панель управления 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>
.
Однако у меня возникли две проблемы:
- Я изо всех сил пытаюсь получить токен на предъявителя из pam_hook, перенаправленный на панель управления kubernetes;nginx только пересылает базовую аутентификацию.
- Даже если я смог ее пройти, я не уверен, как можно безопасно кешировать ответы.Мне нужно кэшировать токен на предъявителя каждого пользователя отдельно, иначе люди смогут действовать как друг с другом.Этот ответ намекает на это, но он не говорит вам, как избежать проблемы: 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.