驗證雙向 TLS 是否啟用

一旦將應用程式新增至 Ambient 網格,您可以使用以下一種或多種方法輕鬆驗證 mTLS 是否在您的工作負載之間啟用

使用工作負載的 ztunnel 設定驗證 mTLS

使用方便的 istioctl ztunnel-config workloads 命令,您可以查看您的工作負載是否設定為透過 PROTOCOL 欄的值傳送和接收 HBONE 流量。例如

$ istioctl ztunnel-config workloads
NAMESPACE    POD NAME                                IP         NODE                     WAYPOINT PROTOCOL
default      details-v1-857849f66-ft8wx              10.42.0.5  k3d-k3s-default-agent-0  None     HBONE
default      kubernetes                              172.20.0.3                          None     TCP
default      productpage-v1-c5b7f7dbc-hlhpd          10.42.0.8  k3d-k3s-default-agent-0  None     HBONE
default      ratings-v1-68d5f5486b-b5sbj             10.42.0.6  k3d-k3s-default-agent-0  None     HBONE
default      reviews-v1-7dc5fc4b46-ndrq9             10.42.1.5  k3d-k3s-default-agent-1  None     HBONE
default      reviews-v2-6cf45d556b-4k4md             10.42.0.7  k3d-k3s-default-agent-0  None     HBONE
default      reviews-v3-86cb7d97f8-zxzl4             10.42.1.6  k3d-k3s-default-agent-1  None     HBONE

在您的工作負載上設定 HBONE 並不代表您的工作負載會拒絕任何純文字流量。如果您希望您的工作負載拒絕純文字流量,請為您的工作負載建立一個 PeerAuthentication 原則,並將 mTLS 模式設定為 STRICT

從度量驗證 mTLS

如果您已安裝 Prometheus,您可以使用以下命令設定連接埠轉送並開啟 Prometheus UI

$ istioctl dashboard prometheus

在 Prometheus 中,您可以查看 TCP 度量的值。首先,選取 [圖表] 並輸入度量,例如:istio_tcp_connections_opened_totalistio_tcp_connections_closed_totalistio_tcp_received_bytes_totalistio_tcp_sent_bytes_total。最後,點擊 [執行]。資料將包含類似以下的項目

istio_tcp_connections_opened_total{
  app="ztunnel",
  connection_security_policy="mutual_tls",
  destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",
  destination_service="details.default.svc.cluster.local",
  reporter="source",
  request_protocol="tcp",
  response_flags="-",
  source_app="curl",
  source_principal="spiffe://cluster.local/ns/default/sa/curl",source_workload_namespace="default",
  ...}

驗證 connection_security_policy 值設定為 mutual_tls 以及預期的來源和目的地身分資訊。

從記錄驗證 mTLS

您也可以檢視來源或目的地 ztunnel 記錄,以確認 mTLS 是否已啟用,以及對等身分。以下是從 curl 服務到 details 服務的請求的來源 ztunnel 記錄範例

2024-08-21T15:32:05.754291Z info access connection complete src.addr=10.42.0.9:33772 src.workload="curl-7656cf8794-6lsm4" src.namespace="default"
src.identity="spiffe://cluster.local/ns/default/sa/curl" dst.addr=10.42.0.5:15008 dst.hbone_addr=10.42.0.5:9080 dst.service="details.default.svc.cluster.local"
dst.workload="details-v1-857849f66-ft8wx" dst.namespace="default" dst.identity="spiffe://cluster.local/ns/default/sa/bookinfo-details"
direction="outbound" bytes_sent=84 bytes_recv=358 duration="15ms"

驗證 src.identitydst.identity 值是否正確。它們是用於來源和目標工作負載之間 mTLS 通訊的身份。請參閱透過日誌驗證 ztunnel 流量章節,以了解更多詳細資訊。

使用 Kiali 儀表板驗證

如果您已安裝 Kiali 和 Prometheus,您可以使用 Kiali 的儀表板視覺化 Ambient Mesh 中的工作負載通訊。您可以查看任何工作負載之間的連線是否有鎖圖示,以驗證是否已啟用 mTLS,並同時查看對等身份資訊。

Kiali dashboard
Kiali 儀表板

請參閱視覺化應用程式和指標文件,以了解更多詳細資訊。

使用 tcpdump 驗證

如果您可以存取 Kubernetes 工作節點,您可以執行 tcpdump 命令來捕獲網路介面上所有流量,並可選擇專注於應用程式端口和 HBONE 端口。在此範例中,端口 9080details 服務端口,而 15008 是 HBONE 端口。

$ tcpdump -nAi eth0 port 9080 or port 15008

您應該從 tcpdump 命令的輸出中看到加密的流量。

如果您無法存取工作節點,您可以使用 netshoot 容器映像輕鬆執行此命令。

$ POD=$(kubectl get pods -l app=details -o jsonpath="{.items[0].metadata.name}")
$ kubectl debug $POD -i --image=nicolaka/netshoot -- tcpdump -nAi eth0 port 9080 or port 15008
這些資訊對您有幫助嗎?
您有任何改進的建議嗎?

感謝您的回饋!