1

我有几个关于 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.) 我想阻止 Internet 访问:

spec:
  podSelector: {}
  policyTypes:
  - Egress

有谁知道,像 DMZ 区域中的 DNS 服务器之类的东西是否仍然可以访问?

4.) 我想阻止与具有不同命名空间的 pod 的通信:

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

在这里,我开发了一个动态设置命名空间的控制器。

4

2 回答 2

2

您的想法在最低特权政策方面是好的,但由于以下原因,实施存在问题。

  1. 您尝试实现的逻辑超出了 Kubernetes 网络策略的功能。在 k8s 中组合多个块和允许策略而不相互冲突是非常困难的。例如,您的第一个代码段允许访问集群外的任何 IP,然后您的第三个问题是关于阻止访问互联网 - 这两个策略不能同时工作。

  2. 您不应该阻止对 kube-system 命名空间的访问,因为这是部署 k8s DNS 服务的地方,阻止对它的访问将阻止集群中的所有通信。

  3. 要具体回答您的第一个问题:

    • 如何动态访问主机网络?
      集群子网是在您将其部署到 AWS 时定义的 - 您应该在创建期间将其存储并将其注入您的策略中。或者,您可以通过调用 AWS API 来获取它。您还可以从 Kubernetes 获取集群节点 IP:kubectl get nodes -o wide
    • 如何找出我当前在哪个云提供商上运行?
      Kubernetes 不知道它运行在哪个平台上,但是你可以根据节点名前缀来猜测它,例如:aks-nodepool1-18370774-0 或 gke-...
  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

于 2019-06-05T19:09:14.600 回答
1

正如 Mark 指出的那样,NP 可能无法解决您所有的用例。您可能想查看Open Policy Agent项目,特别是可以使用的Gatekeeper工具,以至少部分满足您的一些需求。

于 2019-06-11T04:53:39.110 回答