• Русский
  • 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. Глобальная аутентификация

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

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

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

    Обработка результата аутентификации

    • Успешная аутентификация: запрос будет перенаправлен к 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аутентификация по имени пользователя и паролю через secret
    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.success, 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

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

    auth-secret-type

    Secret поддерживает два типа:

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

      data:
        auth: "user1:$apr1$xyz..."
    2. auth-map: данные secret, где каждый ключ — имя пользователя, а соответствующее значение — хэш пароля (без имени пользователя в формате 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 поддерживает настройку в:

    • Alb CR в .spec.config.auth
    • Frontend CR в .spec.config.auth
    • Rule CR в .spec.config.auth

    Порядок наследования: 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.

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

    Global-Auth

    В ingress-nginx можно задать глобальную аутентификацию через 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 в ответе