Kubernetes nginx ingress + тайм-аут внешней аутентификации oauth2

Я пытаюсь защитить страницу состояния службы с помощью oauth2_proxy, используя Azure AD в качестве внешнего поставщика проверки подлинности. В настоящее время, если я перехожу к общедоступному URL-адресу приложения (https://sub.domain.com/service/hangfire), я получаю тайм-аут 504 шлюза, где он должен направлять меня на аутентификацию.

Я в основном следил за этим руководством для справки: https://msazure.club/protect-kubernetes-webapps-with-azure-active-directory-aad-authentication/

Если я отключу аннотации, направляющие аутентификацию, я смогу без проблем попасть на общедоступную страницу статуса. Если я перехожу к https://sub.domain.com/oauth2, я получаю запрос на аутентификацию у моего провайдера, чего я и ожидал. Я не уверен, где проблема заключается в конфигурации входа, но мне не удалось найти подобные случаи в Интернете, stackoverflow или иным образом.

В этом случае все (развертывание oauth, служба и правила входа) находится в пространстве имен «dev», за исключением фактического развертывания входа, которое находится в своем собственном пространстве имен. Я не подозреваю, что это имеет значение, но завершение SSL обрабатывается шлюзом за пределами кластера.

развертывание oauth2:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: oauth2-proxy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: oauth2-proxy
  template:
    metadata:
      labels:
        app: oauth2-proxy
    spec:
      containers:
      - name: oauth2-proxy
        image: quay.io/pusher/oauth2_proxy:v3.2.0
        imagePullPolicy: IfNotPresent
        args:
        - --provider=azure
        - --email-domain=domain.com
        - --upstream=http://servicename
        - --http-address=0.0.0.0:4180
        - --azure-tenant=id
        - --client-id=id
        - --client-secret=number
        env:
         - name: OAUTH2_PROXY_COOKIE_SECRET
           value: secret
        ports:
         - containerPort: 4180
           protocol : TCP
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: oauth2-proxy
  name: oauth2-proxy
spec:
  ports:
  - name: http
    port: 4180
    protocol: TCP
    targetPort: 4180
  selector:
    app: oauth2-proxy 

Правила входа:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: service-ingress1
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/auth-url: https://sub.domain.com/oauth2/auth"
    nginx.ingress.kubernetes.io/auth-signin: https://sub.domain.com/oauth2/start?rd=$https://sub.domain.com/service/hangfire"
spec:
  rules:
  - host: sub.domain.com       
    http:
      paths:
      - path: /service/hangfire
        backend:
          serviceName: service
          servicePort: 80                    
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: service-oauth2-proxy
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: sub.domain.com      
    http:
      paths:
      - path: /oauth2
        backend:
          serviceName: oauth2-proxy
          servicePort: 4180           

Я получаю 504 ошибки при переходе по URL-адресу, но я не вижу никаких ошибок во входных модулях.

Что у вас здесь как -upstream=http://servicename именно? Я не могу понять, что здесь ожидается.

Karl 23.10.2020 14:07

У меня есть полное доменное имя хоста входящего трафика. Поэтому, если бы я выполнял этот вход для google.com, я бы поместил его в восходящий поток.

stevenmiller 24.10.2020 23:33

Спасибо. Это то, что я понял, но я не мог заставить его работать. В конце концов, для меня проблема заключалась в том, что файлы cookie, передаваемые Azure AD, были слишком большими для обработки Nginx, что приводило к сбою перенаправления. Единственное реальное решение — запустить сервер Redis для управления файлами cookie. Было довольно сложно отладить эту проблему, поэтому, если кто-то еще столкнется с этим, посмотрите: github.com/oauth2-proxy/oauth2-proxy/issues/866

Karl 26.10.2020 08:13
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
4
3
2 499
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вот что я делал с моим прокси-сервером oAuth для Azure AD:

  annotations:
    kubernetes.io/ingress.class: "nginx"
    ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"
    nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$escaped_request_uri"

И я использовал этот прокси-сервер oAuth:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: oauth2-proxy
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: oauth2-proxy
  template:
    metadata:
      labels:
        app: oauth2-proxy
    spec:
      containers:
      - env:
          - name: OAUTH2_PROXY_PROVIDER
            value: azure
          - name: OAUTH2_PROXY_AZURE_TENANT
            value: xxx
          - name: OAUTH2_PROXY_CLIENT_ID
            value: yyy
          - name: OAUTH2_PROXY_CLIENT_SECRET
            value: zzz
          - name: OAUTH2_PROXY_COOKIE_SECRET
            value: anyrandomstring
          - name: OAUTH2_PROXY_HTTP_ADDRESS
            value: "0.0.0.0:4180"
          - name: OAUTH2_PROXY_UPSTREAM
            value: "http://where_to_redirect_to:443"
        image: machinedata/oauth2_proxy:latest
        imagePullPolicy: IfNotPresent
        name: oauth2-proxy
        ports:
        - containerPort: 4180
          protocol: TCP

Это выглядит почти так же, как у меня. Не могли бы вы опубликовать больше входных данных службы? К сожалению, я просто получаю эти 504 ошибки на входе без реальных ошибок. Единственное, в чем я не уверен, так это в «OAUTH2_PROXY_UPSTREAM», это должна быть конечная точка внутренней службы или внешний URL-адрес?

stevenmiller 22.05.2019 16:19

он должен быть там, где вы перенаправляете после авторизации (для меня это внутренняя служба), конечно, он выглядит похоже, но это не то же самое, так что вам лучше попробовать этот, потому что у меня он работает без проблем

4c74356b41 22.05.2019 17:16

Не могли бы вы уточнить, что именно должно быть http://where_to_redirect_to:443? У меня проблемы с этим. IP-адрес «service-ingress1» (как определено рассматриваемым OP)? ClusterIP службы за входом?

Karl 23.10.2020 13:54

поднимите новый вопрос, вместо того, чтобы задавать вопросы в комментариях

4c74356b41 24.10.2020 17:38

вверх по течению может быть конечной точкой службы kubernetes

niranjan pb 26.02.2021 12:40

Моя установка аналогична 4c74356b41.

развертывание прокси-сервера oauth2

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: oauth2-proxy
  name: oauth2-proxy
  namespace: monitoring
spec:
  replicas: 1
  selector:
    matchLabels:
      app: oauth2-proxy
  template:
    metadata:
      labels:
        app: oauth2-proxy
    spec:
      containers:
      - args:
        - --azure-tenant=TENANT-GUID
        - --email-domain=company.com
        - --http-address=0.0.0.0:4180
        - --provider=azure
        - --upstream=file:///dev/null
        env:
        - name: OAUTH2_PROXY_CLIENT_ID
          valueFrom:
            secretKeyRef:
              key: client-id
              name: oauth2-proxy
        - name: OAUTH2_PROXY_CLIENT_SECRET
          valueFrom:
            secretKeyRef:
              key: client-secret
              name: oauth2-proxy
        - name: OAUTH2_PROXY_COOKIE_SECRET
          valueFrom:
            secretKeyRef:
              key: cookie-secret
              name: oauth2-proxy
        image: quay.io/pusher/oauth2_proxy:v3.1.0
        name: oauth2-proxy

oauth2-прокси-сервис

apiVersion: v1
kind: Service
metadata:
  labels:
    app: oauth2-proxy
  name: oauth2-proxy
  namespace: monitoring
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: http
  selector:
    app: oauth2-proxy
  type: ClusterIP

oauth2-прокси-вход

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
  labels:
    app: oauth2-proxy
  name: oauth2-proxy
  namespace: monitoring
spec:
  rules:
  - host: myapp.hostname.net
    http:
      paths:
      - backend:
          serviceName: oauth2-proxy
          servicePort: 80
        path: /oauth2

конфигурация oauth2-прокси

apiVersion: v1
kind: Secret
metadata:
  labels:
    app: oauth2-proxy
  name: oauth2-proxy
  namespace: monitoring
data:
# Values below are fake
  client-id: AAD_CLIENT_ID
  client-secret: AAD_CLIENT_SECRET
  cookie-secret: COOKIE_SECRET

Приложение, использующее AAD Ingress

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/auth-signin: https://$host/oauth2/start?rd=$request_uri
    nginx.ingress.kubernetes.io/auth-url: https://$host/oauth2/auth
  labels:
    app: myapp
  name: myapp
  namespace: monitoring
spec:
  rules:
  - host: myapp.hostname.net
    http:
      paths:
      - backend:
          serviceName: myapp
          servicePort: 80
        path: /
  tls:
  - hosts:
    - myapp.hostname.net

Дополнительным шагом, который необходимо выполнить, является добавление URI перенаправления в регистрацию приложения AAD. Перейдите к регистрации приложения AAD на портале Azure > Аутентификация > Добавить https://myapp.hostname.net/oauth2/callback в URI перенаправления > Сохранить.

Спасибо за публикацию, ваша конфигурация очень похожа на мою. Странно, что я получаю 504 тайм-аута, и в журналах nginx ничего не отображается, похоже, что аннотации аутентификации просто нарушают для меня входную конфигурацию. Есть ли у вас какие-либо другие изменения конфигурации nginx? Насколько я знаю, я использую стандартную конфигурацию, но я не видел никаких особых изменений конфигурации, упомянутых при ее реализации.

stevenmiller 23.05.2019 13:58
Ответ принят как подходящий

В итоге я нашел разрешение здесь: https://github.com/helm/charts/issues/5958

Мне пришлось использовать адрес внутренней службы для URL-адреса авторизации, о котором я больше нигде не упоминал.

nginx.ingress.kubernetes.io/auth-url: http://oauth2-proxy.development.svc.cluster.local:4180/oauth2/auth

Другие вопросы по теме