設定傳輸安全性
您可以強制執行嚴格的相互傳輸層安全標準 (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 流量,匯總工作負載層級政策。您必須設定目的地規則,才能管理該行為。
將驗證政策套用至命名空間中的特定工作負載:
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
設定相符的目的地規則:
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:
- 伺服器端 (
PeerAuthentication):使用PERMISSIVE模式,確保目的地工作負載接受明文流量。如果網格或命名空間使用預設PERMISSIVE政策,則不必建立PeerAuthentication資源。如果您強制執行網格範圍或命名空間範圍的STRICTmTLS,請套用設為PERMISSIVE的工作負載專屬或通訊埠專屬PeerAuthentication政策。 - 用戶端 (
DestinationRule):使用tls.mode: DISABLE設定DestinationRule資源,讓用戶端 Sidecar Proxy 在呼叫該服務或通訊埠時傳送明文流量。
注意:由於伺服器端 Proxy 使用 PERMISSIVE 模式而非 DISABLE,因此目的地工作負載仍會接受來自任何未涵蓋在 DestinationRule 中的用戶端的 mTLS 流量。為確保所有網格用戶端都傳送純文字,請在目的地服務的命名空間 (或 istio-system) 中建立 DestinationRule,而不限制 exportTo。
範例:停用服務的 mTLS
如果網格或命名空間強制執行
STRICTmTLS,請將目標工作負載 (或特定通訊埠) 的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設定
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