【问题标题】:502 Bad Gateway Error After Instituting AuthorizationPolicy from Istio Documentation从 Istio 文档中设置 AuthorizationPolicy 后出现 502 Bad Gateway 错误
【发布时间】:2020-07-01 16:31:50
【问题描述】:

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

【问题讨论】:

  • 我发现 502 是由于应用了 AuthorizationPolicy 而导致负载均衡器运行状况检查失败的结果。针对我的健康检查探针添加条件标头用户代理似乎可以解决问题,但随后我得到了没有提供令牌仍然通过的净效果。

标签: authorization istio


【解决方案1】:

我发现 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! /

【讨论】:

  • jt,这个例子和方法的问题是网格内所有需要访问前端的服务都需要 JWT。我的用例是这样的。 namespace = istio-test service1 = elasticsearch service2 = kibana 要求 - 将 elasticsearch 应用程序 REST API 暴露给需要 JWT 身份验证的外部应用程序。在不使用 JWT 的情况下授权 kibana 访问 elasticsearch。
  • 看看thisthis istio 讨论帖。
  • 我尝试了相同的方法,但安全性被忽略了,可能是什么?这是 repo github.com/jamesmedice/Istio-Rbac-Policy-Mesh 和安全应用程序 github.com/jamesmedice/Istio-Security-VS-Mesh
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 2010-09-15
  • 2014-06-28
  • 2018-11-12
  • 2018-04-23
  • 1970-01-01
  • 2021-03-31
相关资源
最近更新 更多