взаимный TLS на основе определенного IP

Я пытаюсь настроить nginx-ingress для взаимного 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 работают, когда применяются как аннотации, но внутри фрагмента - нет.

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


person vasilis    schedule 15.04.2019    source источник
comment
Кто-нибудь знает, как это сделать?   -  person vasilis    schedule 18.04.2019
comment
Зачем вам нужен mTLS только для определенных удаленных IP-адресов? Таким образом вы не получите никакой дополнительной защиты, потому что вы аутентифицируете только некоторых клиентов. Кроме того, исходные IP-адреса могут быть подделаны. Обычный старый не взаимный TLS будет делать то же самое в вашем случае.   -  person Shnatsel    schedule 24.04.2019
comment
Нам нужен mTLS для конкретной связи только между одной службой нашего приложения и внешней системой. Любой другой будет общаться без mTLS на всех сервисах.   -  person vasilis    schedule 01.05.2019


Ответы (1)


Задача 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
person Shnatsel    schedule 02.05.2019