1

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

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

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

我们可以让 AuthenticationPolicy 使用“from”来处理 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: ["*"]

提前致谢!

4

1 回答 1

2

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

但是调试非常困难,因为很多都基于您的环境和正在使用的 JWT,等等。

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

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

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

于 2021-12-23T15:51:37.163 回答