关于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
在这里,我开发了一个可以动态设置名称空间的控制器。
答案 0 :(得分:2)
就最低特权政策而言,您的想法不错,但由于以下原因,实施起来有问题。
您试图实现的逻辑超出了Kubernetes网络策略的能力。很难将多个块组合并允许k8中的策略彼此冲突。例如,您的第一个代码段允许访问群集外部的任何IP,然后您的第三个问题是有关禁止访问Internet的信息-这两个策略不能同时工作。
您不应阻止对kube-system命名空间的访问,因为这是k8s DNS服务的部署位置,阻止对它的访问将阻止集群中的所有通信。
要具体回答您的第一个问题:
kubectl get nodes -o wide
关于阻止名称空间之间访问的第四点很好,但是最好使用如下入口策略来做到这一点:
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 :(得分:1)
正如Mark所指出的,NP可能无法解决您的所有用例。您可能想检查一下Open Policy Agent项目,并在那里专门使用Gatekeeper工具,该工具至少可以部分满足您的一些需求。