我想知道安全专家如何考虑使容器流量安全。我们以一个简单的 K8S 集群为例。
我想我们都同意在每个容器中运行 HTTPS 而不是 HTTP 更安全。我通常会在 Ingress 上配置一个 TLS,然后路由到一个内部容器也会配置 TLS。
现代混搭解决方案通常安装代理 sidecar - 我们以 Linkerd2 为例。Ingress 会将所有传入流量升级到 TLS,然后它将使用 Linkerd 的 TLS 将流量转发到 sidecar 代理。直到这里传输的所有内容都是 TLS 和安全的。我想知道,既然安全流量“已经到达”pod,容器是否也应该使用 TLS,还是在没有 TLS 的情况下与 sidecar 通信是否足够安全?我想听听容器和它的边车之间的安全方面。Sidecar 是否应该被视为独立容器,因此与容器的通信也应该是 TLS 安全的?
在您希望 Kubernetes 集群具有高级别的安全性的环境中,现在通常应用来自零信任网络的原则。对于 Kubernetes 集群中的网络,这通常意味着:
现在通常使用 Service Mesh 产品来解决前两个问题,例如Linkerd、Istio和云提供商提供托管解决方案,例如AWS App Mesh。这些产品以 TLS 的形式在每个 Pod 之间应用加密,还使用客户端证书和相互 TLS、mTLS 以自动方式进行身份验证。服务网格通常有一个控制平面部分,负责例如自动化的证书轮换。
第三点通常是使用Kubernetes 网络策略来获得动态的,但精细的防火墙规则应用于每个应用程序实例 (Pod),即使它可以动态地调度到集群中的不同节点。这些策略通常使用例如 Pod 标签而不是硬编码的 IP 地址在更高级别声明。
Pod 是Kubernetes中的调度单元,它们是紧密耦合的容器——总是一起调度。Pod 中的容器共享一些资源,例如 linux 命名空间、文件系统卷和 cgroup:
此外,Pod 中的容器共享网络身份、IP 地址,并使用 localhost 在 Pod 内进行通信。我会考虑 Pod 内的信任,但您应该应用精细的 Kubernetes 网络策略来锁定,例如 Pod 可以在哪些端口上接收流量,以及来自哪些 Pod。