我正在使用Istio 1.5.4并尝试应用此处引用的示例:
https://istio.io/latest/docs/tasks/security/authentication/authn-policy/#end-user-authentication
在定义AuthorizationPolicy之前,一切都会按预期进行,直到我引入该提示时,无论我是否提供有效的JWT令牌,我都会收到502 Bad Gateway错误。
在第二点上,如果我更新了要在自己的服务命名空间级别应用的示例,则能够使AuthorizationPolicy正常工作。然后,RequestAuthentication + AuthorizationPolicy将按预期工作,但是,我遇到了另一个障碍,现在内部服务也需要有效的jwt令牌。
答案 0 :(得分:0)
我发现502是由于应用了AuthorizationPolicy而导致我的负载均衡器运行状况检查失败的结果。对我的健康检查探针添加条件标头User-Agent似乎可以解决问题,但随后我得到了净效果,其中没有提供的令牌仍在通过
没有令牌通过,因为这是您配置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,并拒绝没有请求的请求,并返回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的情况下卷曲Istio入口网关,并看到AuthorizationPolicy因为没有提供令牌而拒绝了我们的请求:
$ curl ${INGRESS_IP}
RBAC: access denied
最后,如果我们使用有效的JWT进行卷曲,则可以通过IngressGateway成功到达前端:
$ curl --header "Authorization: Bearer ${VALID_JWT}" ${INGRESS_IP}
Hello World! /