NGINX прокси для Ingress Controller с проверкой подлинности сертификата клиента - PullRequest
0 голосов
/ 01 мая 2020

В моей производственной среде у меня есть конфигурация с двумя Nginx, и связь между двумя серверами защищена с помощью этой конфигурации следующим образом: https://docs.nginx.com/nginx/admin-guide/security-controls/securing-http-traffic-upstream/

INTERNET ---> NGINX reverse proxy ---TLS authentication---> NGINX upstream ---> Application 

Conf работает, как и ожидалось, обратный поток принимает запросы только от доверенного сертифицированного.

Но мне нужно перенести исходящий сервер с сервера с нуля на кластер Kubernetes в Azure Kubernetes Service. Итак, conf на сервере, действующем в качестве обратного прокси-сервера, остается неизменным, и я переношу конфигурацию восходящего потока на NGINX Ingress Controller.

Я развернул этот образ Ingress Controller: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0

и настроил ресурс следующим образом :

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-backend
  namespace: dev
  annotations:
    nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
    nginx.ingress.kubernetes.io/auth-tls-secret: "dev/my-cert"
    nginx.ingress.kubernetes.io/auth-tls-error-page: "https://google.com"
spec:
  tls:
    - hosts:
        - my-backend.my-domain
      secretName: my-cert
  rules:
    - host: my-backend.my-domain
      http:
        paths:
          - path: /
            backend:
              serviceName: my-backend-service
              servicePort: http

И секрет, называемый "my-cert", включает: ca.crt tls.crt tls.key, импортированный из NGINX вверх по течению. https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md#client -certificate-authentication

Конфигурация в обратном прокси NGINX без изменений:

location / {
    set $upstream my-upstream;
    proxy_pass https://$upstream$request_uri;
    proxy_set_header Host my-backend.my-domain;
    proxy_set_header X-Request-ID $request_id;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_ssl_certificate /etc/nginx/ssl/client.pem;
    proxy_ssl_certificate_key /etc/nginx/ssl/client.key;
    proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    proxy_ssl_ciphers HIGH:!aNULL:!MD5;
    proxy_ssl_trusted_certificate /etc/nginx/CA/CA.pem;
    proxy_ssl_session_reuse on;
}

Первой попыткой конфигурации был запрос curl от обратный прокси-сервер к Ingress Controller, передающий сертификат клиента:

curl --cacert /etc/nginx/CA/CA.pem --key /etc/nginx/ssl/client.key  --cert /etc/nginx/ssl/client.pem https://my-backend.my-domain/health
{"status":"UP"}

Это работает!

Но при попытке отправить запрос через обратный прокси NGINX я перенаправлен в Google. Страница com, как настроено в Ingress Controller. Это примечание ожидаемого поведения, потому что.

Кто-нибудь может мне помочь исправить конфиг и заставить работать аутентификацию?

1 Ответ

1 голос
/ 02 мая 2020

Мне нужно включить поддержку SNI на клиенте NGINX:

proxy_ssl_server_name on;

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_server_name

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...