Auth — это механизм, который выполняет аутентификацию до того, как запрос достигнет фактического сервиса. Он позволяет обрабатывать аутентификацию на уровне ALB единообразно, без необходимости реализовывать логику аутентификации в каждом backend-сервисе.
ALB поддерживает два основных метода аутентификации:
Forward Auth (Внешняя аутентификация)
Basic Auth (Базовая аутентификация)
Глобальный Auth
Auth на уровне пути
Отключение Auth
alb.ingress.cpaas.io/auth-enable: "false"
Настройка Basic Auth с ALB
Ingress-nginx определяет ряд аннотаций для настройки конкретных деталей процесса аутентификации. Ниже приведён список аннотаций, поддерживаемых ALB, где "v" означает поддержку, а "x" — отсутствие поддержки.
support | type | note | |
---|---|---|---|
forward-auth | forward auth путём отправки http запроса | ||
nginx.ingress.kubernetes.io/auth-url | v | string | |
nginx.ingress.kubernetes.io/auth-method | v | string | |
nginx.ingress.kubernetes.io/auth-signin | v | string | |
nginx.ingress.kubernetes.io/auth-signin-redirect-param | v | string | |
nginx.ingress.kubernetes.io/auth-response-headers | v | string | |
nginx.ingress.kubernetes.io/auth-proxy-set-headers | v | string | |
nginx.ingress.kubernetes.io/auth-request-redirect | v | string | |
nginx.ingress.kubernetes.io/auth-always-set-cookie | v | boolean | |
nginx.ingress.kubernetes.io/auth-snippet | x | string | |
basic-auth | аутентификация по имени пользователя и паролю с использованием секрета | ||
nginx.ingress.kubernetes.io/auth-realm | v | string | |
nginx.ingress.kubernetes.io/auth-secret | v | string | |
nginx.ingress.kubernetes.io/auth-secret-type | v | string | |
nginx.ingress.kubernetes.io/auth-type | - | "basic" or "digest" | basic: поддерживается apr1 digest: не поддерживается |
auth-cache | |||
nginx.ingress.kubernetes.io/auth-cache-key | x | string | |
nginx.ingress.kubernetes.io/auth-cache-duration | x | string | |
auth-keepalive | keepalive при отправке запроса. Поведение keepalive задаётся через набор аннотаций | ||
nginx.ingress.kubernetes.io/auth-keepalive | x | number | |
nginx.ingress.kubernetes.io/auth-keepalive-share-vars | x | "true" or "false" | |
nginx.ingress.kubernetes.io/auth-keepalive-requests | x | number | |
nginx.ingress.kubernetes.io/auth-keepalive-timeout | x | number | |
auth-tls | при https-запросе дополнительная проверка сертификата | ||
nginx.ingress.kubernetes.io/auth-tls-secret | x | string | |
nginx.ingress.kubernetes.io/auth-tls-verify-depth | x | number | |
nginx.ingress.kubernetes.io/auth-tls-verify-client | x | string | |
nginx.ingress.kubernetes.io/auth-tls-error-page | x | string | |
nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream | x | "true" or "false" | |
nginx.ingress.kubernetes.io/auth-tls-match-cn | x | string |
Связанные аннотации:
Эти аннотации описывают изменения, вносимые в auth-request, app-request и cli-response в приведённой выше диаграмме.
URL для auth-request, значение может быть переменной.
Метод для auth-request.
Значение — ссылка на ConfigMap в формате ns/name
.
По умолчанию все заголовки из cli-request отправляются auth-server. Дополнительные заголовки можно настроить через proxy_set_header. По умолчанию отправляются следующие заголовки:
Значение — строка с разделёнными запятыми заголовками, позволяющая передавать определённые заголовки из auth-response в app-request. пример:
Когда ALB инициирует app-request, он включит Remote-User и Remote-Name из заголовков auth-response.
auth-response и app-response могут устанавливать cookie. По умолчанию, только если app-response успешен, cookie из auth-response.set-cookie будут объединены с cli-response.set-cookie.
Когда auth-server возвращает 401, можно установить заголовок redirect в cli-response, чтобы браузер перенаправился на url, указанный в auth-signin для прохождения проверки.
Значение — url, указывает заголовок location в cli-response.
Имя параметра запроса в signin-url, по умолчанию rd.
Если signin-url не содержит параметр с именем, указанным в auth-signin-redirect-param
, alb автоматически добавит этот параметр. Значение параметра будет установлено в $pass_access_scheme://$http_host$escaped_request_uri
, используется для записи исходного URL запроса.
Устанавливает заголовок x-auth-request-redirect
в auth-request.
basic-auth — процесс аутентификации, описанный в RFC 7617. Процесс взаимодействия следующий:
описание защищённой области
Это значение realm в заголовке WWW-Authenticate
cli-response.
WWW-Authenticate: Basic realm="$realm"
Тип схемы аутентификации, в настоящее время поддерживается только basic
Ссылка на секрет с именем пользователя и паролем, формат ns/name
Секрет поддерживает два типа:
auth-file: данные секрета содержат только один ключ "auth", значение — строка в формате Apache htpasswd. Например:
auth-map: в данных секрета каждый ключ — это имя пользователя, а соответствующее значение — хэш пароля (без имени пользователя в формате htpasswd). Например:
Примечание: в настоящее время поддерживаются только хэши паролей в формате htpasswd, сгенерированные с использованием алгоритма apr1.
В ALB CR добавлены конфигурационные параметры, связанные с auth, которые можно настроить в ALB/Frontend/Rule CR. Во время выполнения ALB преобразует аннотации в Ingress в правила.
Auth поддерживает конфигурацию в:
.spec.config.auth
ALB CR.spec.config.auth
Frontend CR.spec.config.auth
Rule CRПорядок наследования: Alb > Frontend > Rule. Если дочерний CR не настроен, используется конфигурация родительского CR.
При обработке Ingress ALB определяет приоритет на основе префикса аннотации. Приоритет от высокого к низкому:
index.$rule_index-$path_index.alb.ingress.cpaas.io
alb.ingress.cpaas.io
nginx.ingress.kubernetes.io
Это позволяет решать проблему совместимости с ingress-nginx и задавать конфигурацию auth на конкретном пути Ingress.
Новая аннотация, добавленная ALB, используется для указания, включена ли функция аутентификации для данного Ingress.
В ingress-nginx можно задать глобальный auth через ConfigMap. Это эквивалентно настройке auth для всех Ingress. В ALB auth можно настроить в ALB2 и FT CR. Правила под ними наследуют эти настройки.
В ALB можно отключить функцию auth для данного Ingress, настроив аннотацию: alb.ingress.cpaas.io/auth-enable: "false"
в Ingress.
X-ALB-ERR-REASON
в ответе