Как динамически настроить информацию в сетевой политике Kubernetes? - PullRequest
1 голос
/ 31 мая 2019

У меня есть несколько вопросов относительно Kubernetes: Как защитить кластер Kubernetes?

Мой план состоит в том, чтобы разработать приложение, которое по умолчанию защищает кластер Kubernetes.Я успешно написал и протестировал несколько сетевых политик.В качестве второго шага я хочу установить эти данные динамически в моем приложении на основе облачного провайдера и т. Д.

1.) Я хочу заблокировать доступ к сети хоста, а также к службам метаданных (мой кластер работаетна AWS):

  egress:
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
        except:
        - 10.250.0.0/16     # host network
        - 169.254.169.254/32    # metadata service

Кто-нибудь знает, как я могу получить динамический доступ к сети хоста?Я обнаружил проблему, которая говорит о том, что вы должны использовать службу метаданных: https://github.com/kubernetes/kubernetes/issues/24657

Кто-нибудь знает, как я могу узнать, на каком облачном провайдере я сейчас работаю?На основании этой информации я хочу установить IP-адрес службы метаданных.

2.) Я хочу заблокировать доступ к пространству имен "kube-system":

  egress:
  - to:
    - podSelector:
        matchExpressions:
        - key: namespace
          operator: NotIn
          values:
          - kube-system

Кто-нибудь знаеткак я могу обеспечить фактический отказ в доступе?Насколько я понял, «пространство имен», обозначенное ключом, - это просто имя, которое я выбрал.Как Kubernetes знает, что я на самом деле имею в виду пространство имен и ничего больше?

3.) Я хочу заблокировать доступ в Интернет:

spec:
  podSelector: {}
  policyTypes:
  - Egress

Кто-нибудь знает, если что-то вроде DNS-сервера взона DMZ все еще доступна?

4.) Я хочу заблокировать связь с модулями с другим пространством имен:

  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          project: default

Здесь я разработал контроллер, который динамически устанавливает пространство имен.

Ответы [ 2 ]

2 голосов
/ 05 июня 2019

Ваши идеи хороши с точки зрения политики наименьших привилегий, но реализация проблематична по следующим причинам:

  1. Логика, которую вы пытаетесь достичь за пределами возможностейСетевые политики Kubernetes.Очень сложно объединить несколько блоков и разрешить политики в k8, не конфликтуя друг с другом.Например, ваш первый фрагмент позволяет получить доступ к любому IP-адресу за пределами кластера, а затем ваш третий вопрос касается блокировки доступа в Интернет - эти две политики не могут работать одновременно.

  2. Не следует блокировать доступ к пространству имен системы kube, потому что именно там развернута служба DNS k8s, а блокирование доступа к ней предотвратит все коммуникации в кластере.

  3. Чтобы конкретно ответить на ваш 1-й вопрос:

    • Как получить динамический доступ к сети хоста?
      Подсеть кластера определяется при его развертывании в AWS - вам следуетсохраните его во время создания и добавьте его в свою политику.Кроме того, вы можете получить его, позвонив в AWS API.Вы также можете получить IP-адреса узлов кластера от Kubernetes: kubectl get nodes -o wide
    • Как узнать, на каком облачном провайдере я сейчас работаю?
      Kubernetes не знает, на какой платформе он работает, новы можете догадаться, основываясь на префиксе имени узла, например: aks-nodepool1-18370774-0 или gke -...
  4. Ваш 4-й пункт о блокировании доступа между пространствами именэто хорошо, но было бы лучше сделать это с помощью политики доступа, подобной этой:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Ingress

Для более подробной информации я рекомендую этот пост в блоге, который объясняет сложности сетевых политик k8s:https://medium.com/@reuvenharrison/an-introduction-to-kubernetes-network-policies-for-security-people-ba92dd4c809d

1 голос
/ 11 июня 2019

Как отметил Марк, NP, возможно, не сможет рассмотреть все ваши варианты использования.Возможно, вы захотите проверить проект Open Policy Agent и, в частности, инструмент Gatekeeper , который можно использовать, чтобы хотя бы частично удовлетворить некоторые ваши потребности.

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