Auth
Содержание
Основные понятияЧто такое AuthПоддерживаемые методы аутентификацииСпособы настройки AuthОбработка результата аутентификацииБыстрый стартРазвёртывание ALBНастройка Secret и IngressПроверкаСвязанные аннотации Ingressforward-authКонструирование связанных аннотацийauth-urlauth-methodauth-proxy-set-headersКонструирование аннотаций, связанных с app-requestauth-response-headersОбработка cookieКонфигурация, связанная с редиректом при аутентификацииauth-signinauth-signin-redirect-paramauth-request-redirectbasic-authauth-realmauth-typeauth-secretauth-secret-typeCRСпециальная аннотация Ingress для ALBAuth-EnableДругие функции, связанные с аутентификацией в Ingress-NginxGlobal-AuthNo-Auth-LocationsПримечание: несовместимые моменты с Ingress-NginxУстранение неполадокОсновные понятия
Что такое Auth
Auth — это механизм, который выполняет аутентификацию до того, как запрос попадёт в реальный сервис. Он позволяет обрабатывать аутентификацию на уровне ALB единообразно, без необходимости реализовывать логику аутентификации в каждом бэкенд-сервисе.
Поддерживаемые методы аутентификации
ALB поддерживает два основных метода аутентификации:
-
Forward Auth (Внешняя аутентификация)
- Отправка запроса во внешний сервис аутентификации для проверки личности пользователя
- Сценарии применения: требуется сложная логика аутентификации, например OAuth, SSO и т.д.
- Рабочий процесс:
- Запрос пользователя поступает в ALB
- ALB пересылает информацию для аутентификации в сервис аутентификации
- Сервис аутентификации возвращает результат проверки
- На основе результата аутентификации принимается решение о допуске к бэкенд-сервису
-
Basic Auth (Базовая аутентификация)
- Простой механизм аутентификации на основе имени пользователя и пароля
- Сценарии применения: простая защита доступа, защита среды разработки
- Рабочий процесс:
- Запрос пользователя поступает в ALB
- ALB проверяет имя пользователя и пароль в запросе
- Сравнивает с настроенной информацией для аутентификации
- Если проверка успешна, запрос пересылается в бэкенд-сервис
Способы настройки Auth
-
Глобальная аутентификация
- Настраивается на уровне ALB, применяется ко всем сервисам
- Настраивается в ALB или FT CR
-
Аутентификация на уровне пути
- Настраивается на конкретном пути Ingress
- Настраивается в конкретном Rule
- Может переопределять глобальную настройку аутентификации
-
Отключение аутентификации
- Отключение аутентификации для конкретного пути
- Настраивается в Ingress с аннотацией:
alb.ingress.cpaas.io/auth-enable: "false" - Настраивается в Rule с помощью CR
Обработка результата аутентификации
- Успешная аутентификация: запрос будет перенаправлен в бэкенд-сервис
- Ошибка аутентификации: возвращается ошибка 401 unauthorized
- Можно настроить поведение редиректа после неудачной аутентификации (применимо для Forward Auth)
Быстрый старт
Настройка Basic Auth с ALB
Развёртывание ALB
Настройка Secret и Ingress
Проверка
Связанные аннотации Ingress
Ingress-nginx определяет ряд аннотаций для настройки деталей процесса аутентификации. Ниже приведён список аннотаций, поддерживаемых ALB, где "v" означает поддержку, а "x" — отсутствие поддержки.
forward-auth
Связанные аннотации:
- nginx.ingress.kubernetes.io/auth-url
- nginx.ingress.kubernetes.io/auth-method
- nginx.ingress.kubernetes.io/auth-signin
- nginx.ingress.kubernetes.io/auth-signin-redirect-param
- nginx.ingress.kubernetes.io/auth-response-headers
- nginx.ingress.kubernetes.io/auth-proxy-set-headers
- nginx.ingress.kubernetes.io/auth-request-redirect
- nginx.ingress.kubernetes.io/auth-always-set-cookie
Эти аннотации описывают изменения, внесённые в auth-request, app-request и cli-response на диаграмме выше.
Конструирование связанных аннотаций
auth-url
URL для auth-request, значение может быть переменной.
auth-method
Метод для auth-request.
auth-proxy-set-headers
Значение — ссылка на ConfigMap в формате ns/name.
По умолчанию все заголовки из cli-request отправляются auth-server. Дополнительные заголовки можно настроить через proxy_set_header. По умолчанию отправляются следующие заголовки:
Конструирование аннотаций, связанных с app-request
auth-response-headers
Значение — строка с разделением запятыми, позволяющая передавать определённые заголовки из auth-response в app-request. пример:
Когда ALB инициирует app-request, он включит Remote-User и Remote-Name из заголовков auth-response.
Обработка cookie
auth-response и app-response могут устанавливать cookie. По умолчанию только при успешном app-response, cookie из auth-response.set-cookie будут объединены с cli-response.set-cookie.
Конфигурация, связанная с редиректом при аутентификации
Когда auth-server возвращает 401, можно установить заголовок редиректа в cli-response, чтобы браузер перенаправился на url, указанный в auth-signin, для прохождения проверки.
auth-signin
Значение — url, указывает заголовок location в cli-response.
auth-signin-redirect-param
Имя параметра запроса в signin-url, по умолчанию rd.
Если signin-url не содержит параметр с именем, указанным в auth-signin-redirect-param, alb автоматически добавит этот параметр. Значение параметра будет установлено в $pass_access_scheme://$http_host$escaped_request_uri, используется для записи исходного URL запроса.
auth-request-redirect
Устанавливает заголовок x-auth-request-redirect в auth-request.
basic-auth
basic-auth — процесс аутентификации, описанный в RFC 7617. Процесс взаимодействия следующий:
auth-realm
описание защищённой области
Это значение realm в заголовке WWW-Authenticate cli-response.
WWW-Authenticate: Basic realm="$realm"
auth-type
Тип схемы аутентификации, в настоящее время поддерживается только basic
auth-secret
Ссылка на secret с именем пользователя и паролем, формат ns/name
auth-secret-type
Secret поддерживает два типа:
-
auth-file: данные секрета содержат только один ключ "auth", значение — строка в формате Apache htpasswd. Например:
-
auth-map: в данных секрета каждый ключ — это имя пользователя, а соответствующее значение — хэш пароля (без имени пользователя в формате htpasswd). Например:
Примечание: В настоящее время поддерживаются только хэши паролей в формате htpasswd, сгенерированные с использованием алгоритма apr1.
CR
В ALB CR добавлены конфигурационные параметры, связанные с аутентификацией, которые можно настроить в ALB/Frontend/Rule CR. Во время работы ALB преобразует аннотации на Ingress в правила.
Поддерживается конфигурация Auth в:
.spec.config.authAlb CR.spec.config.authFrontend CR.spec.config.authRule CR
Порядок наследования: Alb > Frontend > Rule. Если дочерний CR не настроен, используется конфигурация родительского CR.
Специальная аннотация Ingress для ALB
В процессе обработки Ingress ALB определяет приоритет на основе префикса аннотации. Приоритет от высокого к низкому:
index.$rule_index-$path_index.alb.ingress.cpaas.ioalb.ingress.cpaas.ionginx.ingress.kubernetes.io
Это позволяет решить проблему совместимости с ingress-nginx и указать конфигурацию аутентификации на конкретном пути Ingress.
Auth-Enable
Новая аннотация, добавленная ALB, используется для указания, включена ли функция аутентификации для Ingress.
Другие функции, связанные с аутентификацией в Ingress-Nginx
Global-Auth
В ingress-nginx можно задать глобальную аутентификацию через ConfigMap. Это эквивалентно настройке аутентификации для всех Ingress. В ALB можно настроить аутентификацию в ALB2 и FT CR. Правила под ними наследуют эти настройки.
No-Auth-Locations
В ALB можно отключить функцию аутентификации для данного Ingress, настроив аннотацию: alb.ingress.cpaas.io/auth-enable: "false" в Ingress.
Примечание: несовместимые моменты с Ingress-Nginx
- Не поддерживается auth-keepalive
- Не поддерживается auth-snippet
- Не поддерживается auth-cache
- Не поддерживается auth-tls
- Basic-auth поддерживает только basic, digest не поддерживается
- Basic-auth basic поддерживает только алгоритм apr1, bcrypt, sha256 и др. не поддерживаются
Устранение неполадок
- Проверить логи контейнера Nginx в pod ALB
- Проверить заголовок
X-ALB-ERR-REASONв ответе