验证是否启用了双向 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 的仪表板可视化环境网格中的工作负载通信。您可以查看任何工作负载之间的连接是否具有挂锁图标,以验证 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
这些信息对您有用吗?
您有什么改进建议吗?

感谢您的反馈!