網路安全防護涉及存取控制和流量加密。通過定義網路原則,您可以限制服務之間的網路訪問,只允許特定的流量通過。網路原則涉及很多方面,例如預設允許或拒絕規則、命名空間隔離、安全性群組設定等。通過加密傳輸的流量,可以確保敏感性資料在傳輸過程中不被篡改或竊取。通過綜合使用以上技術和措施,您可以增強服務之間的安全性和保護敏感性資料的傳輸。
網路原則
在Kubernetes叢集中,預設情況下允許所有Pod間的通訊。在生產環境中這樣的預設配置是不安全的。Kubernetes網路原則(Network Policy)為您提供了一種機制來限制Pod間的網路流量(通常稱為東/西向流量)以及Pod和外部服務之間的網路流量。Network Policy使用Pod Selectors和Labels標籤標識源和目的Pod,同時在策略中支援指定的IP地址、連接埠號碼和協議類型及組合。使用Terway容器網路時,如果您希望在IP地址或者連接埠層面控制網路流量,您可以為叢集中特定應用配置網路原則。具體操作,請參見使用網路原則Network Policy和Kubernetes Network Policy Recipes。
Network Policy只適用於Terway叢集。當叢集節點數量較多(節點大於100),Network Policy的代理會給Kubernetes的管控帶來較大壓力,您可以通過最佳化大規模叢集Network Policy進行調整。具體操作,請參見最佳化大規模Terway叢集NetworkPolicy的擴充性。
建立預設拒絕策略
與RBAC
策略一樣,建立Network Policy
同樣應遵循最小許可權訪問原則。應建立一個預設拒絕(Deny All)策略限制來自命名空間的所有入站和出站流量,或者使用Calico建立一個全域原則。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
建立允許DNS查詢的規則
設定了預設的Deny All規則,您就可以開始對其他規則進行分層,例如允許Pod查詢CoreDNS進行名稱解析的全域規則。
執行以下命令,對命名空間添加標籤。
kubectl label namespace kube-system name=kube-system
使用以下YAML樣本建立Network Policy。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-dns-access namespace: default spec: podSelector: matchLabels: {} policyTypes: - Egress egress: - to: - namespaceSelector: matchLabels: name: kube-system ports: - protocol: UDP port: 53
重要關於如何在Kubernetes Network Policy中配置Pod間的流量控制,請參見官方文檔。
限制應用Pod的網路流量
在以下應用情境中,您可以通過部署Network Policy限制到指定應用Pod的網路流量。
僅允許指定的微服務訪問該應用Pod服務。
僅允許指定應用訪問該資料庫Pod。
執行以下命令,建立一個包含
app-bookstore
和role=api
標籤的應用Pod樣本。kubectl run apiserver --image=nginx --labels="app=bookstore,role=api" --expose --port=80
使用以下模板並執行
kubectl apply -f
部署Network Policy限制。該限制表示只允許被包含
app-bookstore
標籤的Pod的流量訪問。kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: api-allow spec: podSelector: matchLabels: app: bookstore role: api ingress: - from: - podSelector: matchLabels: app: bookstore
執行以下命令,查看其它流量是否被攔截。
kubectl run test-$RANDOM --rm -i -t --image=alpine -- sh
預期輸出:
/ # wget -qO- --timeout=2 http://apiserver wget: download timed out
執行以下命令,測試包含指定的
app-bookstore
標籤的應用Pod流量是否被允許存取。kubectl run test-$RANDOM --rm -i -t --image=alpine --labels="app=bookstore,role=frontend" -- sh
預期輸出:
/ # wget -qO- --timeout=2 http://apiserver <!DOCTYPE html> <html><head>
添加規則選擇性允許Namespaces/Pods間的流量
首先允許命名空間內的Pod相互連信,然後添加自訂規則,進一步限制該命名空間內的Pod和Pod間的通訊。更多資訊,請參見Kubernetes Network Policy Recipes。
對網路流量資料進行分析監控
阿里雲VPC提供流日誌功能,可以記錄VPC網路中彈性網卡ENI(Elastic Network Interface)傳入和傳出的流量資訊,協助您檢查存取控制規則、監控網路流量和排查網路故障。通過分析這些資訊可以尋找VPC內資源(包括Pod)之間的異常流量。更多資訊,請參見流日誌概述。
安全性群組
ACK使用安全性群組來約束控制面節點和節點之間的網路流量。安全性群組還用於控制節點、其他VPC資源和外部IP地址之間的流量。建立ACK叢集時,會預設自動為您分配一個安全性群組。該安全性群組允許叢集內部節點之間的訪問不受限制。出於安全考慮,您還可以繼續收斂安全性群組出、入規則,實現叢集的最小化訪問規則。詳細資料,請參見叢集安全性群組出、入規則推薦配置。
更多資訊,請參見ECS安全性群組配置案例和配置安全性群組。
傳輸加密
阿里雲Service Mesh (ASM)
ASM可以協助您實現服務之間的傳輸加密,除了服務之間的雙向TLS加密,也支援使用SDS(Envoy' s Secret Discovery Service)為服務網關提供HTTPS安全支援、認證動態載入,從而提升服務網關整體安全性。同時ASM支援配合阿里雲應用高可用服務AHAS對部署在Service Mesh內的應用進行流量控制,通過整合阿里雲鏈路追蹤服務Tracing Analysis,為分布式應用的開發人員提供完整的調用鏈路還原、調用請求量統計、鏈路拓撲、應用依賴分析等能力,可以協助開發人員快速分析和診斷分布式應用架構下的效能瓶頸,提升開發診斷效率。
通過Secret配置TLS認證實現HTTPS訪問
叢集中通過Ingress暴露的服務需要開啟HTTPS訪問。具體操作,請參見通過Secret配置TLS認證實現HTTPS訪問。