从Istio文档建立AuthorizationPolicy后出现502错误网关错误

时间:2020-06-30 16:44:21

标签: authorization istio

我正在使用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令牌。

authentication/authorization internal service issue

1 个答案:

答案 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! /