Как запустить oauth2_proxy в kubernetes под одним доменом, чтобы перенаправить обратно в исходный домен, который требовал аутентификации?

#docker #nginx #kubernetes #oauth-2.0 #nginx-ingress

#docker #nginx #kubernetes #oauth-2.0 #nginx-вход

Вопрос:

Я настраивал кластер kubernetes и хочу защитить панель мониторинга (запущенную на kube.example.com ) за bitly/oauth2_proxy (запущенной example.com/oauth2 на изображении a5huynh/oauth2_proxy:latest ), поскольку я хочу повторно использовать прокси-сервер OAuth для других служб, которые я буду запускать. Аутентификация работает отлично, но после входа пользователя в систему, т. Е. Возврата обратного вызова, Они отправляются туда example.com , где вместо этого они должны быть отправлены на исходный хост kube.example.com , который инициировал поток. Как я могу это сделать? (Я использую nginx-ingress-controller).

Аннотация на прокси OAuth2:

 kubernetes.io/ingress.class: "nginx",
nginx.ingress.kubernetes.io/force-ssl-redirect: "true",
nginx.ingress.kubernetes.io/secure-backends: "true",
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
  

Аннотация на панели инструментов:

 kubernetes.io/ingress.class: "nginx",
nginx.ingress.kubernetes.io/auth-signin: "https://example.com/oauth2/start",
nginx.ingress.kubernetes.io/auth-url: "https://example.com/oauth2/auth",
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS",
nginx.ingress.kubernetes.io/force-ssl-redirect: "true",
nginx.ingress.kubernetes.io/secure-backends: "true",
nginx.ingress.kubernetes.io/ssl-passthrough: "true",
nginx.ingress.kubernetes.io/ssl-redirect: "true"
  

Я ожидаю, что меня перенаправят на исходный хост kube.example.com после завершения потока OAuth, но меня отправляют обратно на хост OAuth2 example.com

Комментарии:

1. Насколько я понял из их документации, oauth2_proxy должен находиться в том же домене, что и dashboard, потому что то, что он делает, эффективно проксирует запросы к одному восходящему потоку. Я не уверен, способен ли он обслуживать несколько восходящих потоков. Кстати, для этого мы используем Kong, и он довольно хорошо работает с несколькими восходящими потоками и предоставляет им аутентификацию Google.

2. Спасибо за ответ, видимо, это возможно как-то ( github.com/bitly/oauth2_proxy/issues/12 ), Мне просто нужно выяснить, как преобразовать конфигурацию nginx в конфигурацию входа nginx… Конг мог бы это сделать, но тогда это становится еще одним приложением, которым я должен управлять.

3. Судя по приведенной вами ссылке, оптимизация конфигурации для входа в Nginx кажется сложной задачей. В то же время Kong может служить вам как Nginx, так и oauth2_proxy, так что это более эффективно и упрощает настройку, это мое мнение.

4. Я бы согласился с вами, что Kong было бы просто, после некоторого поиска я нашел хорошее решение и опубликую это в качестве ответа ниже.

Ответ №1:

После недолгих поисков я наткнулся на сообщение в блоге о выполнении этого в супер простой усадьбе. К сожалению, я обнаружил, что предоставленный yaml работает не совсем корректно, поскольку oauth2_proxy никогда не попадал из-за того, что nginx перехватывал все запросы (я не уверен, что мой не работал из-за того, что я хотел, чтобы URL-адрес oauth-proxy был example.com/oauth2 , а не oauth2.example.com ). Чтобы исправить это, я добавил обратно путь oauth2-proxy к входу для прокси, т.е.

 apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: oauth2-proxy
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              serviceName: oauth2-proxy
              servicePort: 80
            path: /
          - backend:
              serviceName: oauth2-proxy
              servicePort: 4180
            path: /oauth2
  

и убедился, что служба также все еще открыта, т.е.

 apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: oauth2-proxy
  name: oauth2-proxy
  namespace: default
spec:
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 80
    - name: http-proxy
      port: 4180
      protocol: TCP
      targetPort: 4180
  selector:
    k8s-app: oauth2-proxy

  

Затем, чтобы защитить службы, стоящие за прокси-сервером oauth, мне просто нужно поместить следующее во входные аннотации:

     nginx.ingress.kubernetes.io/auth-url: "https://example.com/oauth2/auth"
    nginx.ingress.kubernetes.io/auth-signin: "https://example.com/oauth2/start?rd=/redirect/$http_host$request_uri"