Security

安全性:容器應該執行 TLS 還是依賴其 sidecar?

  • December 22, 2020

我想知道安全專家如何考慮使容器流量安全。我們以一個簡單的 K8S 集群為例。

我想我們都同意在每個容器中執行 HTTPS 而不是 HTTP 更安全。我通常會在 Ingress 上配置一個 TLS,然後路由到一個內部容器也會配置 TLS。

現代混搭解決方案通常安裝代理 sidecar - 我們以 Linkerd2 為例。Ingress 會將所有傳入流量升級到 TLS,然後它將使用 Linkerd 的 TLS 將流量轉發到 sidecar 代理。直到這里傳輸的所有內容都是 TLS 和安全的。我想知道,既然安全流量“已經到達”pod,容器是否也應該使用 TLS,還是在沒有 TLS 的情況下與 sidecar 通信是否足夠安全?我想听聽容器和它的邊車之間的安全方面。Sidecar 是否應該被視為獨立容器,因此與容器的通信也應該是 TLS 安全的?

在您希望 Kubernetes 集群具有高級別的安全性的環境中,現在通常應用來自零信任網路的原則。對於 Kubernetes 集群中的網路,這通常意味著:

  • 加密所有網路流量
  • 對所有網路流量使用身份驗證
  • 細粒度防火牆規則 - 應用於每個應用程序的微分段
  • 使用 RBAC、服務帳戶、JWT 和 OpenPolicyAgent 的最低權限訪問控制

現在通常使用 Service Mesh 產品來解決前兩個問題,例如LinkerdIstio和雲提供商提供託管解決方案,例如AWS App Mesh。這些產品以 TLS 的形式在每個 Pod 之間應用加密,還使用客戶端證書和相互 TLS、mTLS 以自動方式進行身份驗證。服務網格通常有一個控制平面部分,負責例如自動化的證書輪換。

第三點通常是使用Kubernetes 網路策略來獲得動態的,但精細的防火牆規則應用於每個應用程序實例 (Pod),即使它可以動態地調度到集群中的不同節點。這些策略通常使案例如 Pod 標籤而不是硬編碼的 IP 地址在更高級別聲明。

我想知道,既然安全流量“已經到達”pod,容器是否也應該使用 TLS,還是在沒有 TLS 的情況下與 sidecar 通信是否足夠安全?我想听聽容器和它的邊車之間的安全方面。Sidecar 是否應該被視為獨立容器,因此與容器的通信也應該是 TLS 安全的?

Pod 是Kubernetes中的調度單元,它們是緊密耦合的容器——總是一起調度。Pod 中的容器共享一些資源,例如 linux 命名空間、文件系統捲和 cgroup:

Pod 的共享上下文是一組 Linux 命名空間、cgroup 和可能的其他隔離方面。

此外,Pod 中的容器共享網路身份、IP 地址,並使用 localhost 在 Pod 內進行通信。我會考慮 Pod 內的信任,但您應該應用精細的 Kubernetes 網路策略來鎖定,例如 Pod 可以在哪些埠上接收流量,以及來自哪些 Pod。

引用自:https://serverfault.com/questions/1047254