K8s -> nginx Ingress: SSO

У меня есть служба с HTTP Basic Auth. Перед ним у меня стоит nginx Ingress, у которого тоже есть basic-auth. Как я могу прикрепить заголовок авторизации с учетными данными после входа в систему с помощью Ingress для достижения единого входа?

Это конфигурация моего Ingress:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/auth-realm: Authentication Required
    nginx.ingress.kubernetes.io/auth-secret: kibana-user-basic-auth
    nginx.ingress.kubernetes.io/auth-type: basic
  name: kibana-user
  namespace: {{.Release.Namespace}}
spec:
  tls:
  - secretName: kibana-tls
    hosts:
    - {{.Values.ingress.user.host}}
  rules:
  - host: {{.Values.ingress.user.host}}
    http:
      paths:
      - backend:
          serviceName: kibana-logging
          servicePort: {{ .Values.kibana.service.internalPort }}
        path: /

person Kristian    schedule 21.03.2019    source источник


Ответы (2)


Вы можете использовать аннотацию nginx.ingress.kubernetes.io/configuration-snippet: proxy_set_header Authorization $http_authorization; для пересылки заголовка Authorization во внутреннюю службу.

Ресурс Ingress должен выглядеть так

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/auth-realm: Authentication Required
    nginx.ingress.kubernetes.io/auth-secret: kibana-user-basic-auth
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/configuration-snippet: "proxy_set_header Authorization $http_authorization;"
  name: kibana-user
  namespace: {{.Release.Namespace}}
spec:
  tls:
  - secretName: kibana-tls
    hosts:
    - {{.Values.ingress.user.host}}
  rules:
  - host: {{.Values.ingress.user.host}}
    http:
      paths:
      - backend:
          serviceName: kibana-logging
          servicePort: {{ .Values.kibana.service.internalPort }}
        path: /
person Владимир Начев    schedule 28.03.2019

Я предполагаю, что вы можете распространять заголовок авторизации в nginx.ingress.kubernetes.io/auth-response-headers аннотация:

nginx.ingress.kubernetes.io/auth-response-headers: Authorization

Или, альтернативным способом, вы можете добиться того же подхода, применив proxy_set_header внутри целевого местоположения Ingress через фрагмент конфигурации аннотации, как описано здесь:

annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
        proxy_set_header Authorization "Basic base64 encode value";
person Nick_Kh    schedule 22.03.2019
comment
Я думаю, что эти аннотации используются, если вы хотите, чтобы ваш Ingress читал заголовок из запроса. Но в моем случае аутентификация находится в Ingress. Я хочу, чтобы Ingress распространял заголовок авторизации на серверную службу. Другими словами, когда Ingress отправляет запрос на серверную службу, я хочу, чтобы заголовок авторизации был в этом запросе. - person Kristian; 22.03.2019
comment
Согласно входной документации Nginx, аннотация nginx.ingress.kubernetes.io/auth-response-headers используется для передачи заголовка авторизации серверным службам. - person Nick_Kh; 22.03.2019