Я запускаю панель инструментов 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>
.
Однако у меня две проблемы:
- Я изо всех сил пытаюсь перенаправить токен носителя из 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;
}
пэм.конф:
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.