我有一个K8s Prometheus服务,该服务使用两个不同的端口映射到同一targetPort,并且我想仅将身份验证策略应用于一个端口。这个想法是要能够通过jwt身份验证(使用网关/虚拟服务)将服务公开到网格外部,并具有不通过身份验证的内部版本(我需要它,因为网格内部有一个不支持jwt的客户端身份验证)。
尽管我的策略将目标定义为第一个端口,但该策略影响两个端口。以下是更多详细信息
-
服务
prometheus服务ClusterIP 10.233.31.30 9095 / TCP,9090 / TCP 22d
可以看出,有两个端口9095和9090分别命名为http-port1和http-port-2
- 政策
我在下面创建了一个策略,该策略仅定义第一个端口的目标http-port1。
Name: prometheus-auth-policy
Namespace: powerone-ns
API Version: authentication.istio.io/v1alpha1
Kind: Policy
Spec:
Origins:
Jwt:
Issuer: testing@secure.istio.io
Jwks Uri: https://raw.githubusercontent.com/istio/istio/release-1.3/security/tools/jwt/samples/jwks.json
Peers:
Mtls:
Principal Binding: USE_ORIGIN
Targets:
Name: prometheus-service
Ports:
Name: http-port1
使用istioctl命令,可以看到策略似乎已正确应用。例如,运行命令。/istioctl authn tls-check prometheus-bb6f66586-ffwml -n powerone-ns 我可以看到我的策略仅应用于第一个服务,第二个仅使用默认的。
HOST:PORT STATUS SERVER CLIENT AUTHN POLICY DESTINATION RULE
prometheus-service01.prometheus-service.svc.cluster.local:9090 OK mTLS mTLS prometheus-auth-policy/prometheus-service default/prometheus-service
prometheus-service02.prometheus-service.svc.cluster.local:9095 OK HTTP/mTLS mTLS default/ default/pprometheus-service
当我在两个端口上查询服务而没有通知任何令牌时,我能够正常连接,这是错误的,因为该策略应要求使用JWT令牌。删除第二个端口后,查询失败,并出现预期的401错误(原始身份验证失败。),因为我没有通知任何令牌。因此,似乎ISTIO不遵守我政策中的目标信息。
我也尝试了这种方法的变体。我的意思是,我没有创建具有两个不同端口的服务,而是创建了两个不同的服务(每个端口一个),但是发生了相同的问题。
从我的角度来看,它看起来像个错误。