Защита службы Kubernetes с помощью TLS

У меня есть приложение, которое является внутренним и доступно только другому приложению в кластере службой с IP-адресом кластера. Другие службы получают доступ к этому приложению через его DNS (serviceName-namespace.svc.cluster.local). Это приложение обрабатывает конфиденциальные данные, поэтому, хотя все коммуникации происходят внутри кластера, я хотел бы использовать TLS для защиты связи с этим приложением.

Мой вопрос: как я могу включить TLS для службы? Что-то уже существует или я должен обрабатывать это в коде приложения? Кроме того, есть ли уже ЦС, который я могу использовать в кластере, который может подписывать сертификаты для .svc.cluster.local?

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

Спасибо, Омер


person Omer Levi Hevroni    schedule 17.06.2018    source источник
comment
Вы уже ознакомились с проектом Jetstack cert-manager?   -  person Michael Hausenblas    schedule 17.06.2018
comment
Нет, но теперь, после беглого просмотра, я не уверен, что это будет работать для внутренних служб с внутренним DNS.   -  person Omer Levi Hevroni    schedule 17.06.2018


Ответы (4)


Я только что обнаружил, что API Kubernetes можно использовать для создания сертификата, которому будут доверять все модули, работающие в кластере. Этот вариант может быть проще, чем альтернативы. Вы можете найти документацию здесь, включая полный поток создания сертификата и его использования.

person Omer Levi Hevroni    schedule 17.07.2018
comment
Интересно и проще, чем мой ответ. +1 - person VonC; 17.07.2018
comment
Это работает нормально для вас? Документация, на которую вы ссылаетесь, описывает размещение IP-адресов модулей в качестве SAN в сертификате. Конечно, они будут регулярно меняться, когда капсула будет переработана и станет недействительной? - person Ieuan; 31.10.2018
comment
Я еще не играл с ним. Если у меня будет возможность, я попробую и обновлю - person Omer Levi Hevroni; 31.10.2018
comment
@OmerLeviHevroni: работает ли это решение? Кроме того, в документе говорится Now you can use server.crt and server-key.pem as the keypair to start your HTTPS server. Что это значит? example.default.svc.cluster.local — это URL-адрес по умолчанию для всех служб. Где мы должны предоставить этот сертификат? - person Ronak Patel; 01.08.2019
comment
Вам необходимо предоставить их вашему сервису, чтобы начать подключение TLS. Это действительно зависит от стека - разные технологии имеют разные параметры конфигурации для этого. - person Omer Levi Hevroni; 01.08.2019
comment
Я предоставляю информацию о сертификате в nginx ingress для общедоступных доменов. Но нет доступа для default.svc.cluster.local доменов. Не уверен, как я могу настроить его. - person Ronak Patel; 07.08.2019
comment
да, вам придется обрабатывать TKS непосредственно в коде или использовать такие инструменты, как Istio, которые обрабатывают TLS за вас. - person Omer Levi Hevroni; 07.08.2019

Следуя комментариям @vonc ниже, я думаю, что у меня есть решение:

  • Приобретите действующий общедоступный домен для этой службы (например, something.mycompany.com).
  • Используйте CoreDNS, чтобы добавить правило переопределения, чтобы все запросы к something.mycompany.com направлялись к something-namesapce.svc.cluster.local, поскольку служба не доступна извне (это можно сделать и с обычной записью A для моего варианта использования).
  • Используйте Nginx или что-то еще для обработки TLS с сертификатом для something.mycompany.com.

Это звучит довольно сложно, но может сработать. Что вы думаете?

person Omer Levi Hevroni    schedule 17.06.2018

Проверьте, соответствует ли руководство безопасным службам Kubernetes. с Ingress, TLS и LetsEncrypt могут относиться к вам:

Ingress может поддерживаться различными реализациями за счет использования разных контроллеров Ingress. Наиболее популярным из них является контроллер Nginx Ingress, однако существуют доступны другие варианты, такие как Traefik, Rancher, HAProxy и т. д. Каждый контроллер должен поддерживать базовую конфигурацию, но может даже предоставлять другие функции (например, правила перезаписи, режимы аутентификации) с помощью аннотаций.

Дайте ему доменное имя и включите TLS. LetsEncrypt — это бесплатный центр сертификации TLS, использующий kube-lego мы можем автоматически запрашивать и обновлять сертификаты LetsEncrypt для общедоступных доменных имен, просто добавив несколько строк в наше определение Ingress!

Чтобы это работало правильно, требуется общедоступное доменное имя, и оно должно иметь запись A, указывающую на внешний IP-адрес службы Nginx.

Однако для ограничения внутри домена кластера (svc.cluster.local) вы может потребоваться CoreDNS.

person VonC    schedule 17.06.2018
comment
Я знаю, что это можно сделать с помощью входа, я использовал вход пару раз раньше. Я не хочу использовать вход, потому что я хочу, чтобы эта служба оставалась внутренней (например, доступной только внутри кластера). Кажется, это возможно, прочитав здесь, но это кажется немного сложно. Кроме того, какой сертификат я должен использовать? - person Omer Levi Hevroni; 17.06.2018
comment
@OmerLeviHevroni Вы можете использовать самоподписанный сертификат для тестирования (kubernetes.io/docs/concepts/services-networking/) - person VonC; 17.06.2018
comment
Я знаю, но это не похоже на то, что я хотел бы использовать в производстве. Это означает, что я должен установить самозаверяющий сертификат для каждого клиента, использующего эту службу. - person Omer Levi Hevroni; 17.06.2018
comment
@OmerLeviHevroni Согласен: на работе мы используем подстановочный сертификат, управляемый F5 (наш прокси: f5.com/glossary /обратный прокси) - person VonC; 17.06.2018
comment
F5 работает в кластере и действует как ЦС? Я недостаточно знаком с этим, поэтому извините, если это тривиальный вопрос. Кроме того, это звучит как дорогое решение... - person Omer Levi Hevroni; 17.06.2018
comment
Да, у меня нет универсального решения, я просто указал, что мы делаем. - person VonC; 17.06.2018

В Google Cloud вы можете сделать службу балансировки нагрузки внутренней, например:

    annotations = {
      "cloud.google.com/load-balancer-type" = "Internal"
    }
person orkenstein    schedule 29.07.2019