設定傳輸安全性

您可以強制執行嚴格的相互傳輸層安全標準 (mTLS),透過 Istio API 保護 Cloud Service Mesh 中的服務間流量。在 Kubernetes 工作負載中,系統預設會啟用自動 mTLS:用戶端 Sidecar Proxy 會自動將 mTLS 流量傳送至 Sidecar,但目的地服務仍會接受純文字和加密要求。

PeerAuthentication 政策可讓您限制服務,只接受 mTLS。您可以將政策套用至整個網格、特定命名空間或個別工作負載。如要瞭解各平台支援的欄位,請參閱「支援的功能 (代管控制層)」、「代管 Cloud Service Mesh 的 API 支援」和「支援的功能 (叢集內控制層)」。

為每個命名空間啟用 mTLS

如要為特定命名空間內的所有工作負載啟用 mTLS,請使用命名空間層級的驗證政策。您可以在 metadata 下方指定適用的命名空間。

kubectl apply -f - <<EOF
apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
  name: "AUTH_POLICY_NAME"
  namespace: "NAMESPACE"
spec:
  mtls:
    mode: STRICT
EOF

預期的輸出內容:

peerauthentication.security.istio.io/AUTH_POLICY_NAME created

為各項工作負載啟用 mTLS

如要為特定工作負載設定 PeerAuthentication 政策,您必須設定 selector 區段,並指定與目標工作負載相符的標籤。不過,Cloud Service Mesh 無法針對傳出至服務的 mTLS 流量,匯總工作負載層級政策。您必須設定目的地規則,才能管理該行為。

  1. 將驗證政策套用至命名空間中的特定工作負載:

    cat <<EOF | kubectl apply -n NAMESPACE -f -
    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "AUTH_POLICY_NAME"
      namespace: "NAMESPACE"
    spec:
      selector:
        matchLabels:
          app: WORKLOAD
      mtls:
        mode: STRICT
    EOF
    

    預期輸出內容:

    peerauthentication.security.istio.io/AUTH_POLICY_NAME created
  2. 設定相符的目的地規則:

    cat <<EOF | kubectl apply -n NAMESPACE -f -
    apiVersion: "networking.istio.io/v1beta1"
    kind: "DestinationRule"
    metadata:
      name: "DEST_RULE_NAME"
    spec:
      host: "WORKLOAD.NAMESPACE.svc.cluster.local"
      trafficPolicy:
        tls:
          mode: ISTIO_MUTUAL
    EOF
    

    預期輸出內容:

    destinationrule.networking.istio.io/DEST_RULE_NAME created

強制執行網格層級 mTLS

如要防止網格中的所有服務接受純文字流量,請設定網格層級的 PeerAuthentication 政策,並將 mTLS 模式設為 STRICT (預設為 PERMISSIVE)。網格層級的 PeerAuthentication 政策不應有選取器,且必須在根命名空間 istio-system 中套用。部署政策時,控制層會自動佈建 TLS 憑證,讓工作負載可以互相驗證。

如要強制執行網格層級的 mTLS,請按照下列步驟操作:

kubectl apply -f - <<EOF
apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
  name: "AUTH_POLICY_NAME"
  namespace: "istio-system"
spec:
  mtls:
    mode: STRICT
EOF

預期的輸出內容:

peerauthentication.security.istio.io/AUTH_POLICY_NAME created

停用 mTLS

採用 TRAFFIC_DIRECTOR 控制層的代管 Cloud Service Mesh 不支援 PeerAuthentication 資源 (mtls.mode: DISABLE 或 portLevelMtls.mode: DISABLE) 中的 DISABLE 模式。

如要將明文流量傳送至代管 Cloud Service Mesh 中的特定服務或通訊埠,請設定伺服器端和用戶端 Proxy:

  1. 伺服器端 (PeerAuthentication):使用 PERMISSIVE 模式,確保目的地工作負載接受明文流量。如果網格或命名空間使用預設 PERMISSIVE 政策,則不必建立 PeerAuthentication 資源。如果您強制執行網格範圍或命名空間範圍的 STRICT mTLS,請套用設為 PERMISSIVE 的工作負載專屬或通訊埠專屬 PeerAuthentication 政策。
  2. 用戶端 (DestinationRule):使用 tls.mode: DISABLE 設定 DestinationRule 資源,讓用戶端 Sidecar Proxy 在呼叫該服務或通訊埠時傳送明文流量。

注意:由於伺服器端 Proxy 使用 PERMISSIVE 模式而非 DISABLE,因此目的地工作負載仍會接受來自任何未涵蓋在 DestinationRule 中的用戶端的 mTLS 流量。為確保所有網格用戶端都傳送純文字,請在目的地服務的命名空間 (或 istio-system) 中建立 DestinationRule,而不限制 exportTo。

範例:停用服務的 mTLS

  1. 如果網格或命名空間強制執行 STRICT mTLS,請將目標工作負載 (或特定通訊埠) 的 PeerAuthentication 模式設為 PERMISSIVE,允許其接受明文流量:

    cat <<EOF | kubectl apply -n NAMESPACE -f -
    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "AUTH_POLICY_NAME"
      namespace: "NAMESPACE"
    spec:
      selector:
        matchLabels:
          app: WORKLOAD
      mtls:
        mode: PERMISSIVE
    EOF
    

    如要僅允許特定工作負載通訊埠上的明文 (例如從 portLevelMtls 遷移時),請改為設定 portLevelMtls:

    spec:
      selector:
        matchLabels:
          app: WORKLOAD
      mtls:
        mode: STRICT
      portLevelMtls:
        WORKLOAD_PORT:
          mode: PERMISSIVE
    
  2. 設定 DestinationRule,指示用戶端 Proxy 將明文流量傳送至目標服務:

    cat <<EOF | kubectl apply -n NAMESPACE -f -
    apiVersion: "networking.istio.io/v1beta1"
    kind: "DestinationRule"
    metadata:
      name: "DEST_RULE_NAME"
      namespace: "NAMESPACE"
    spec:
      host: "SERVICE_NAME.NAMESPACE.svc.cluster.local"
      trafficPolicy:
        tls:
          mode: DISABLE
    EOF
    

    如要僅針對特定服務通訊埠停用 mTLS,請在 DestinationRule 中使用 portLevelSettings:

    spec:
      host: "SERVICE_NAME.NAMESPACE.svc.cluster.local"
      trafficPolicy:
        portLevelSettings:
        - port:
            number: SERVICE_PORT
          tls:
            mode: DISABLE
    

尋找並刪除 PeerAuthentication 政策

如要列出服務網格中的所有 PeerAuthentication 政策,請執行下列指令:

kubectl get peerauthentication --all-namespaces

如果 PeerAuthentication 政策已生效,您可以使用 kubectl delete 刪除該政策:

kubectl delete peerauthentication -n NAMESPACE AUTH_POLICY_NAME

後續步驟