是否可以将 RequestAuthentication 和 AuthenticationPolicy 用于微服务到微服务的通信

Is it possible to use RequestAuthentication and AuthenticationPolicy for microservice to microservice communication

我们最近在我们的 kubernetes 集群上设置了 istio,并试图看看我们是否可以使用 RequestAuthentication 和 AuthenticationPolicy 来让我们只允许命名空间 x 中的 pod 与命名空间 y 中的 pod 通信,当它具有有效的jwt 令牌。

我在网上看到的所有示例似乎都只通过网关申请最终用户身份验证,而不是内部 pod 到 pod 通信。

我们尝试了几种不同的选择,但还没有成功。

我们可以使用“from”让 AuthenticationPolicy 为 pod 到 pod 的流量工作,源是命名空间 x:

中 pod 的 IP 地址
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
 name: "request-jwt"
 namespace: y
spec:
  jwtRules:
  - issuer: "https://keycloak.example.com/auth/realms/istio"
    jwksUri: "https://keycloak.example.com/auth/realms/istio/protocol/openid-connect/certs"
---
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "jwt-auth"
  namespace: y
spec:
  action: ALLOW
  rules:
  - from:
    - source:
        ipBlocks: ["10.43.5.175"]

当我们为 jwt 添加 when 块时它不起作用:

apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
 name: "request-jwt"
 namespace: y
spec:
  jwtRules:
  - issuer: "https://keycloak.example.com/auth/realms/istio"
    jwksUri: "https://keycloak.example.com/auth/realms/istio/protocol/openid-connect/certs"
---
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "jwt-auth"
  namespace: y
spec:
  action: ALLOW
  rules:
  - from:
    - source:
        ipBlocks: ["10.43.5.175"]
    when:
     - key: request.auth.claims[iss]
       values: ["https://keycloak.example.com/auth/realms/istio"]

也尝试过这个但似乎也不起作用:

apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
 name: "request-jwt"
 namespace: y
spec:
  jwtRules:
  - issuer: "https://keycloak.example.com/auth/realms/istio"
    jwksUri: "https://keycloak.example.com/auth/realms/istio/protocol/openid-connect/certs"
---
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "deny-invalid-jwt"
  namespace: y
spec:
  action: DENY
  rules:
  - from:
    - source:
        notRequestPrincipals: ["*"]

提前致谢!

是的,可以同时使用授权策略和请求身份验证。

但是调试还是比较困难的,因为很多是基于你的环境和使用的JWT等等。

为了解决这类问题,我首先将 rbac 范围的日志设置为调试服务特使代理。 在 rbac 调试日志中,您将看到从 JWT 提取并存储到过滤器元数据中的数据。 您经常会发现:

  • 过滤器元数据中的颁发者可能与 RequestAuthentication 资源等中的颁发者不匹配

在此处了解有关日志记录范围的更多信息https://istio.io/v1.12/docs/ops/diagnostic-tools/component-logging/#logging-scopes