взаимный TLS на основе конкретного IP - PullRequest
4 голосов
/ 15 апреля 2019

Я пытаюсь настроить nginx-вход для взаимного TLS, но только для определенного удаленного адреса. Я пытался использовать фрагмент, но безуспешно:

nginx.ingress.kubernetes.io/configuration-snippet: |
  if ($remote_addr = 104.214.x.x) {
    auth-tls-verify-client: on;
    auth-tls-secret: namespace/nginx-ca-secret;
    auth-tls-verify-depth: 1;
    auth-tls-pass-certificate-to-upstream: false;
  }

Аннотации auth-tls работают, когда применяются как аннотации, но внутри фрагмента они не работают.

Любая идея, как настроить это или, возможно, обходной путь, чтобы он работал?

1 Ответ

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

Работа mTLS в основном ограничивает доступ к услуге, требуя от клиента предоставить сертификат. Если вы предоставляете услугу, а затем запрашиваете сертификат только у клиентов с определенными IP-адресами, весь остальной мир может по-прежнему иметь доступ к вашей услуге без сертификата, что полностью отрицает точку mTLS.

Если вам нужна дополнительная информация, вот хорошая статья , которая объясняет, почему существуют TLS и mTLS и в чем разница между ними.

Есть два способа сделать разумную установку из этого:

  1. Просто используйте обычный TLS вместо mTLS
  2. Чтобы служба в вашем кластере требовала mTLS для доступа к ней независимо от IP-адресов

Если вы выберете вариант 2, вам нужно настроить саму службу для использования mTLS, а затем настроить вход для прохождения сертификата клиента в службу. Вот пример конфигурации для входа nginx, который будет работать со службой, которая ожидает mTLS:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: mtls-sample
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "https"
    nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"
spec:
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: mtls-svc
              servicePort: 443
...