全部產品
Search
文件中心

Container Service for Kubernetes:網路安全

更新時間:Jul 13, 2024

網路安全防護涉及存取控制和流量加密。通過定義網路原則,您可以限制服務之間的網路訪問,只允許特定的流量通過。網路原則涉及很多方面,例如預設允許或拒絕規則、命名空間隔離、安全性群組設定等。通過加密傳輸的流量,可以確保敏感性資料在傳輸過程中不被篡改或竊取。通過綜合使用以上技術和措施,您可以增強服務之間的安全性和保護敏感性資料的傳輸。

網路原則

在Kubernetes叢集中,預設情況下允許所有Pod間的通訊。在生產環境中這樣的預設配置是不安全的。Kubernetes網路原則(Network Policy)為您提供了一種機制來限制Pod間的網路流量(通常稱為東/西向流量)以及Pod和外部服務之間的網路流量。Network Policy使用Pod Selectors和Labels標籤標識源和目的Pod,同時在策略中支援指定的IP地址、連接埠號碼和協議類型及組合。使用Terway容器網路時,如果您希望在IP地址或者連接埠層面控制網路流量,您可以為叢集中特定應用配置網路原則。具體操作,請參見使用網路原則Network PolicyKubernetes 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進行名稱解析的全域規則。

  1. 執行以下命令,對命名空間添加標籤。

    kubectl label namespace kube-system name=kube-system
  2. 使用以下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。

  1. 執行以下命令,建立一個包含app-bookstorerole=api標籤的應用Pod樣本。

    kubectl run apiserver --image=nginx --labels="app=bookstore,role=api" --expose --port=80
  2. 使用以下模板並執行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
  3. 執行以下命令,查看其它流量是否被攔截。

    kubectl run test-$RANDOM --rm -i -t --image=alpine -- sh

    預期輸出:

    / # wget -qO- --timeout=2 http://apiserver
    wget: download timed out
  4. 執行以下命令,測試包含指定的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訪問