我发现 502 是由于应用了 AuthorizationPolicy 而导致负载均衡器运行状况检查失败的结果。针对我的健康检查探针添加条件标头用户代理似乎可以解决问题,但随后我得到了没有提供令牌仍然通过的净效果
没有令牌通过,因为这是您配置 AuthorizationPolicy 的方式,这就是 source: requestPrincipals: ["*"] 的工作方式。看看这个example。
RequestAuthentication 定义工作负载支持的请求身份验证方法。如果请求包含无效的身份验证信息,If 将根据配置的身份验证规则拒绝请求。 将接受不包含任何身份验证凭据的请求,但不会具有任何经过身份验证的身份。要限制仅对经过身份验证的请求的访问,这应该伴随着授权规则。例子:
对带有标签 app:httpbin 的工作负载的所有请求都需要 JWT
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: httpbin
namespace: foo
spec:
selector:
matchLabels:
app: httpbin
jwtRules:
- issuer: "issuer-foo"
jwksUri: https://example.com/.well-known/jwks.json
---
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: httpbin
namespace: foo
spec:
selector:
matchLabels:
app: httpbin
rules:
- from:
- source:
requestPrincipals: ["*"]
使用requestPrincipals: ["testing@secure.istio.io/testing@secure.istio.io"]代替here,那么它将只接受带有令牌的请求。
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: frontend
namespace: default
spec:
selector:
matchLabels:
app: frontend
jwtRules:
- issuer: "testing@secure.istio.io"
jwksUri: "https://raw.githubusercontent.com/istio/istio/release-1.5/security/tools/jwt/samples/jwks.json"
第二个资源是 AuthorizationPolicy,它确保所有请求都有 JWT - 并拒绝没有 JWT 的请求,返回 403 错误。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: require-jwt
namespace: default
spec:
selector:
matchLabels:
app: frontend
action: ALLOW
rules:
- from:
- source:
requestPrincipals: ["testing@secure.istio.io/testing@secure.istio.io"]
应用这些资源后,我们可以在没有 JWT 的情况下 curl Istio 入口网关,并看到 AuthorizationPolicy 拒绝我们的请求,因为我们没有提供令牌:
$ curl ${INGRESS_IP}
RBAC: access denied
最后,如果我们使用有效的 JWT curl,我们可以通过 IngressGateway 成功到达前端:
$ curl --header "Authorization: Bearer ${VALID_JWT}" ${INGRESS_IP}
Hello World! /