引言:
零信任概念最早由 Forrester 的分析师 John Kindervag 于 2010 年提出,核心思想是“从来不信任,始终在校验(Never Trust, Always Verify)”。在 IT 领域经过多年的演化之后,形成了以零信任模型,零信任网络为主体的安全架构。不同的组织机构和技术领域有不同的定义与理解。
容器的 "Zero Trust" 运行环境是指容器化应用程序在一个高度安全和可信任的环境中运行,其中所有网络通信和访问控制都基于 "Zero Trust" 安全原则。"Zero Trust" 是一种安全模型,它假定内部和外部网络都是不受信任的,要求对任何设备、用户或应用程序的访问都进行验证和授权,而不是简单地信任内部或外部网络。
Zero Trust安全模型适用于容器环境,因为容器化应用程序的动态性和复杂性使得传统的边界安全控制不再足够满足要求。Zero Trust确保了容器之间的通信和访问都受到精确的控制,从而降低了横向攻击的风险,并提高了整个容器环境的安全性。这对于现代云原生应用程序和微服务架构非常重要,因为它们经常部署在分布式、多云和混合云环境中。
理解Kubernetes Network Policy:
Kubernetes Network Policy 是 Kubernetes 中的一种资源类型,用于定义和控制容器间通信的网络访问策略。它允许定义哪些容器可以与其他容器通信,以及允许或禁止哪些网络流量通过网络策略。
以下是一些关键概念和功能,以帮助理解 Kubernetes Network Policy:
选择器(Selectors):Network Policy 使用标签选择器来选择受策略影响的 Pods。这意味着可以根据标签来选择一组容器,然后为它们定义网络策略。
入口规则和出口规则(Ingress/Egress):可以定义入口规则(Ingress)和出口规则(Egress)。入口规则控制从外部进入受策略保护的 Pods 的流量,而出口规则控制从受策略保护的 Pods 出去的流量。这使得可以精确控制哪些流量可以通过 Pods,以及从Pods流出的流量。
策略规则(Policy Rules):可以定义规则,描述了允许或拒绝特定流量的方式。这些规则通常包括源 Pod 选择器、目标 Pod 选择器、端口信息等。可以根据需要组合多个规则。
默认策略:如果没有为 Namespace 定义 Network Policy,将采用默认策略,这意味着所有流量都允许。
安全性和分隔性:Network Policy 可以帮助提高容器环境的安全性,确保只有受信任的 Pods 可以相互通信,同时阻止未经授权的访问。这有助于实现多租户和分隔性。
适用范围:Network Policy 可以应用到整个 Namespace,或者可以按标签选择器仅应用到特定 Pods。这允许在同一 Namespace 中不同的 Pods 之间应用不同的策略。
如何在Kubernetes集群中应用Network Policy:
在 Kubernetes 集群中应用 Network Policy 以控制容器之间的网络通信需要遵循一些基本步骤。下面是一个通用的指南:
1. 检查 CNI 插件支持:
首先,确保Kubernetes 集群使用的容器网络接口(Container Network Interface,CNI)插件支持 Network Policy。常见的 CNI 插件,如Calico、Cilium和Weave,都支持 Network Policy。确保集群已正确配置了支持 Network Policy 的 CNI 插件。
2. 创建 Namespace(可选):
如果需要,可以创建一个独立的 Kubernetes Namespace,以便在特定的命名空间中应用网络策略。这有助于将策略应用到特定应用程序或服务而不影响其他部署。
3. 定义 Network Policy:
创建一个或多个 Network Policy 对象,定义规则以控制容器之间的通信。这些规则通常包括选择器(Selectors)来指定目标 Pods,端口规则,入口规则和出口规则。
定义零信任(Zero Trust)的 Network Policy 将拒绝所有 Pods 的 Ingress 和 Egress 流量,以确保没有流量被允许通过,实现了严格的网络策略。
定义允许通过的网络流量的策略,只有符合条件的网络流量才会放行。
4. 应用 Network Policy:
使用 kubectl 或者其他工具将 Network Policy 对象应用到 Kubernetes 集群。
这会将定义的 Network Policy 应用到集群中,开始限制 Pods 之间的通信。
5. 验证策略:
在应用 Network Policy 后,确保它按预期工作。可以尝试通过尝试进行禁止或允许的通信来测试策略。
6. 监控和审计:
设置监控和审计工具,以确保 Network Policy 正常运行,并能及时检测并响应异常行为。
应用 Kubernetes Network Policy的最佳实践:
-
使用默认拒绝所有deny-all(零信任)网络策略来确保仅发生明确允许的通信。
-
将必须使用 PodSelector 参数相互通信的 Pod 分组。
-
不允许不必要的网络通信——即使在 Kubernetes 集群内也是如此。
-
允许集群内的 Pod 接收非集群网络流量时请务必小心。
-
拒绝传出公共互联网流量可能会干扰特定的应用程序更新或验证过程。
OCI OKE 对Network Policy的支持:
当在OCI上创建OKE集群时,需要选择网络类型。选择的网络类型决定了用于 Pod 网络的 CNI 网络提供商和关联的 CNI 插件,如下所示:
VCN-native Pod 网络:
使用 OCI VCN-Native Pod Networking CNI 插件将工作线程节点连接到 Oracle Cloud Infrastructure VCN 中的 Pod 子网。因此,VCN 内的 Pod IP 地址可从连接(对等)到该 VCN 的其他 VCN、本地网络和 Internet 直接路由。
Flannel Overlay 网络:
使用 flannel CNI 插件封装 flannel 覆盖网络中 pod 之间的通信,这是一个将 IP 地址附加到容器的简单私有覆盖虚拟网络。私有覆盖网络中的 Pod 只能从同一集群中的其他 Pod 访问。
目前在OKE 上无论选择何种网络类型,都可以使用开源的Calico network policy来配置应用间的网络策略。
详细的网络策略配置安装过程参见OKE 官方文档:
https://docs.public.oneportal.content.oci.oraclecloud.com/en-us/iaas/Content/ContEng/Tasks/contengsettingupcalico.htm