Auth

Содержание

Основные понятия

Что такое Auth

Auth — это механизм, который выполняет аутентификацию до того, как запрос достигнет фактического сервиса. Он позволяет обрабатывать аутентификацию на уровне ALB единообразно, без необходимости реализовывать логику аутентификации в каждом backend-сервисе.

Поддерживаемые методы аутентификации

ALB поддерживает два основных метода аутентификации:

  1. Forward Auth (Внешняя аутентификация)

    • Отправка запроса во внешний сервис аутентификации для проверки личности пользователя
    • Сценарии применения: требуется сложная логика аутентификации, например OAuth, SSO и т.д.
    • Рабочий процесс:
      1. Запрос пользователя поступает на ALB
      2. ALB пересылает информацию об аутентификации в сервис аутентификации
      3. Сервис аутентификации возвращает результат проверки
      4. На основе результата аутентификации принимается решение о допуске к backend-сервису
  2. Basic Auth (Базовая аутентификация)

    • Простой механизм аутентификации на основе имени пользователя и пароля
    • Сценарии применения: простое управление доступом, защита среды разработки
    • Рабочий процесс:
      1. Запрос пользователя поступает на ALB
      2. ALB проверяет имя пользователя и пароль в запросе
      3. Сравнивает с настроенной информацией для аутентификации
      4. Если проверка успешна, запрос пересылается в backend-сервис

Способы настройки Auth

  1. Глобальный Auth

    • Настраивается на уровне ALB, применяется ко всем сервисам
    • Конфигурируется в ALB или FT CR
  2. Auth на уровне пути

    • Настраивается на конкретном пути Ingress
    • Конфигурируется на конкретном Rule
    • Может переопределять глобальную конфигурацию auth
  3. Отключение Auth

    • Отключение аутентификации для конкретного пути
    • Конфигурируется в Ingress с аннотацией: alb.ingress.cpaas.io/auth-enable: "false"
    • Конфигурируется в Rule с помощью CR

Обработка результата Auth

  • Успешная аутентификация: запрос будет переслан в backend-сервис
  • Ошибка аутентификации: возвращается ошибка 401 unauthorized
  • Можно настроить поведение перенаправления после ошибки аутентификации (применимо к Forward Auth)

Быстрый старт

Настройка Basic Auth с ALB

Развертывание ALB

cat <<EOF | kubectl apply -f -
apiVersion: crd.alauda.io/v2
kind: ALB2
metadata:
  name: auth
  namespace: cpaas-system
spec:
  config:
    networkMode: container
    projects:
    - ALL_ALL
    replicas: 1
    vip:
      enableLbSvc: false
  type: nginx
EOF
export ALB_IP=$(kubectl get pods -n cpaas-system -l service_name=alb2-auth -o jsonpath='{.items[*].status.podIP}');echo $ALB_IP

Настройка Secret и Ingress

# echo "Zm9vOiRhcHIxJHFJQ05aNjFRJDJpb29pSlZVQU1tcHJxMjU4L0NoUDE=" | base64 -d #  foo:$apr1$qICNZ61Q$2iooiJVUAMmprq258/ChP1
# openssl passwd -apr1 -salt qICNZ61Q bar # $apr1$qICNZ61Q$2iooiJVUAMmprq258/ChP1

kubectl apply -f - <<'END'
apiVersion: v1
kind: Secret
metadata:
  name: auth-file
type: Opaque
data:
  auth: Zm9vOiRhcHIxJHFJQ05aNjFRJDJpb29pSlZVQU1tcHJxMjU4L0NoUDE=
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: auth-file
  annotations:
    "nginx.ingress.kubernetes.io/auth-type": "basic"
    "nginx.ingress.kubernetes.io/auth-secret": "default/auth-file"
    "nginx.ingress.kubernetes.io/auth-secret-type": "auth-file"
spec:
  rules:
  - http:
      paths:
      - path: /app-file
        pathType: Prefix
        backend:
          service:
            name: app-server
            port:
              number: 80
END

Проверка

# echo "Zm9vOiJhYXIi" | base64 -d # foo:bar
curl -v -X GET -H "Authorization: Basic Zm9vOmJhcg==" http://$ALB_IP:80/app-file # должен вернуть 200
# неправильный пароль
curl -v -X GET -H "Authorization: Basic XXXXOmJhcg==" http://$ALB_IP:80/app-file # должен вернуть 401

Связанные аннотации Ingress

Ingress-nginx определяет ряд аннотаций для настройки конкретных деталей процесса аутентификации. Ниже приведён список аннотаций, поддерживаемых ALB, где "v" означает поддержку, а "x" — отсутствие поддержки.

supporttypenote
forward-authforward auth путём отправки http запроса
nginx.ingress.kubernetes.io/auth-urlvstring
nginx.ingress.kubernetes.io/auth-methodvstring
nginx.ingress.kubernetes.io/auth-signinvstring
nginx.ingress.kubernetes.io/auth-signin-redirect-paramvstring
nginx.ingress.kubernetes.io/auth-response-headersvstring
nginx.ingress.kubernetes.io/auth-proxy-set-headersvstring
nginx.ingress.kubernetes.io/auth-request-redirectvstring
nginx.ingress.kubernetes.io/auth-always-set-cookievboolean
nginx.ingress.kubernetes.io/auth-snippetxstring
basic-authаутентификация по имени пользователя и паролю с использованием секрета
nginx.ingress.kubernetes.io/auth-realmvstring
nginx.ingress.kubernetes.io/auth-secretvstring
nginx.ingress.kubernetes.io/auth-secret-typevstring
nginx.ingress.kubernetes.io/auth-type-"basic" or "digest"basic: поддерживается apr1 digest: не поддерживается
auth-cache
nginx.ingress.kubernetes.io/auth-cache-keyxstring
nginx.ingress.kubernetes.io/auth-cache-durationxstring
auth-keepalivekeepalive при отправке запроса. Поведение keepalive задаётся через набор аннотаций
nginx.ingress.kubernetes.io/auth-keepalivexnumber
nginx.ingress.kubernetes.io/auth-keepalive-share-varsx"true" or "false"
nginx.ingress.kubernetes.io/auth-keepalive-requestsxnumber
nginx.ingress.kubernetes.io/auth-keepalive-timeoutxnumber
auth-tlsпри https-запросе дополнительная проверка сертификата
nginx.ingress.kubernetes.io/auth-tls-secretxstring
nginx.ingress.kubernetes.io/auth-tls-verify-depthxnumber
nginx.ingress.kubernetes.io/auth-tls-verify-clientxstring
nginx.ingress.kubernetes.io/auth-tls-error-pagexstring
nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstreamx"true" or "false"
nginx.ingress.kubernetes.io/auth-tls-match-cnxstring

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. По умолчанию отправляются следующие заголовки:

X-Original-URI          $request_uri;
X-Scheme                $pass_access_scheme;
X-Original-URL          $scheme://$http_host$request_uri;
X-Original-Method       $request_method;
X-Sent-From             "alb";
X-Real-IP               $remote_addr;
X-Forwarded-For         $proxy_add_x_forwarded_for;
X-Auth-Request-Redirect $request_uri;

Конструкция аннотаций, связанных с app-request

auth-response-headers

Значение — строка с разделёнными запятыми заголовками, позволяющая передавать определённые заголовки из auth-response в app-request. пример:

nginx.ingress.kubernetes.io/auth-response-headers: Remote-User,Remote-Name

Когда 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.

Конфигурация, связанная с Redirect sign

Когда auth-server возвращает 401, можно установить заголовок redirect в 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

Ссылка на секрет с именем пользователя и паролем, формат ns/name

auth-secret-type

Секрет поддерживает два типа:

  1. auth-file: данные секрета содержат только один ключ "auth", значение — строка в формате Apache htpasswd. Например:

    data:
      auth: "user1:$apr1$xyz..."
  2. auth-map: в данных секрета каждый ключ — это имя пользователя, а соответствующее значение — хэш пароля (без имени пользователя в формате htpasswd). Например:

    data:
      user1: "$apr1$xyz...."
      user2: "$apr1$abc...."

Примечание: в настоящее время поддерживаются только хэши паролей в формате htpasswd, сгенерированные с использованием алгоритма apr1.

CR

В ALB CR добавлены конфигурационные параметры, связанные с auth, которые можно настроить в ALB/Frontend/Rule CR. Во время выполнения ALB преобразует аннотации в Ingress в правила.

auth:
  # Конфигурация базовой аутентификации
  basic:
    #  string; соответствует nginx.ingress.kubernetes.io/auth-type: basic
    auth_type: "basic"
    #  string; соответствует nginx.ingress.kubernetes.io/auth-realm
    realm: "Restricted Access"
    #  string; соответствует nginx.ingress.kubernetes.io/auth-secret
    secret: "ns/name"
    #  string; соответствует nginx.ingress.kubernetes.io/auth-secret-type
    secret_type: "auth-map|auth-file"
  # Конфигурация Forward аутентификации
  forward:
    #  boolean; соответствует nginx.ingress.kubernetes.io/auth-always-set-cookie
    always_set_cookie: true
    #  string; соответствует nginx.ingress.kubernetes.io/auth-proxy-set-headers
    auth_headers_cm_ref: "ns/name"
    #  string; соответствует nginx.ingress.kubernetes.io/auth-request-redirect
    auth_request_redirect: "/login"
    #  string; соответствует nginx.ingress.kubernetes.io/auth-method
    method: "GET"
    #  string; соответствует nginx.ingress.kubernetes.io/auth-signin
    signin: "/signin"
    #  string; соответствует nginx.ingress.kubernetes.io/auth-signin-redirect-param
    signin_redirect_param: "redirect_to"
    #  []string; соответствует nginx.ingress.kubernetes.io/auth-response-headers
    upstream_headers:
      - "X-User-ID"
      - "X-User-Name"
      - "X-User-Email"
    #  string; соответствует nginx.ingress.kubernetes.io/auth-url
    url: "http://auth-service/validate"

Auth поддерживает конфигурацию в:

  • .spec.config.auth ALB CR
  • .spec.config.auth Frontend CR
  • .spec.config.auth Rule CR

Порядок наследования: Alb > Frontend > Rule. Если дочерний CR не настроен, используется конфигурация родительского CR.

Специальная аннотация Ingress для ALB

При обработке Ingress ALB определяет приоритет на основе префикса аннотации. Приоритет от высокого к низкому:

  • index.$rule_index-$path_index.alb.ingress.cpaas.io
  • alb.ingress.cpaas.io
  • nginx.ingress.kubernetes.io

Это позволяет решать проблему совместимости с ingress-nginx и задавать конфигурацию auth на конкретном пути Ingress.

Auth-Enable

alb.ingress.cpaas.io/auth-enable: "false"

Новая аннотация, добавленная ALB, используется для указания, включена ли функция аутентификации для данного Ingress.

Другие функции, связанные с Auth в Ingress-Nginx

Global-Auth

В ingress-nginx можно задать глобальный auth через ConfigMap. Это эквивалентно настройке auth для всех Ingress. В ALB auth можно настроить в ALB2 и FT CR. Правила под ними наследуют эти настройки.

No-Auth-Locations

В ALB можно отключить функцию auth для данного Ingress, настроив аннотацию: alb.ingress.cpaas.io/auth-enable: "false" в Ingress.

Примечание: несовместимые моменты с Ingress-Nginx

  1. Не поддерживается auth-keepalive
  2. Не поддерживается auth-snippet
  3. Не поддерживается auth-cache
  4. Не поддерживается auth-tls
  5. Basic-auth поддерживает только basic, digest не поддерживается
  6. Basic-auth basic поддерживает только алгоритм apr1, bcrypt, sha256 и др. не поддерживаются

Устранение неполадок

  1. Проверьте логи контейнера Nginx в pod ALB
  2. Проверьте заголовок X-ALB-ERR-REASON в ответе