【问题标题】:How to set up Istio RBAC based on groups from JWT claims?如何根据来自 JWT 声明的组设置 Istio RBAC?
【发布时间】:2018-07-13 16:40:22
【问题描述】:

我有一个启用了 AuthenticationPolicy 和 Istio RBAC 的服务(授权上下文设置为使用来自 JWT 声明的组)但是,似乎 istio 在进行调用时没有考虑来自 JWT 声明的组属性。

作为 IDP,我使用 dex 并为其设置了相应的 AuthnPolicy。

我已将授权上下文设置如下:

apiVersion: "config.istio.io/v1alpha2"
kind: authorization
metadata:
  name: requestcontext
  namespace: istio-system
spec:
  subject:
    user: source.user | request.auth.claims["email"] | ""
    groups: request.auth.claims["groups"]  | ""
    properties:
      namespace: source.namespace | ""
      service: source.service | ""
      iss: request.auth.claims["iss"] | ""
      sub: request.auth.claims["sub"] | ""      

  action:
    namespace: destination.namespace | ""
    service: destination.service | ""
    method: request.method | ""
    path: request.path | ""
    properties:
      version: request.headers["version"] | ""

我已启用 RBAC 并创建了 ServiceRole。我已将 ServiceRoleBinding 添加到一个名为“admins”的特定组中:

apiVersion: "config.istio.io/v1alpha2"
kind: ServiceRoleBinding
metadata:
  name: service-admin-binding
spec:
  subjects:
  - group: "admins"
  roleRef:
    kind: ServiceRole
    name: "service-admin"

当在没有令牌的情况下进行调用时,AuthnPolicy 有效,将返回带有正确消息的 401。由于组不匹配,使用有效 JWT 调用会导致 403 权限被拒绝。当我将主题更改为“所有”用户而不是组时,它工作正常(- user: "*"

解码后获取的 JWT 中的 Groups 声明只是一个字符串数组:

 "groups": [
    "admins"
  ]

如果我在授权上下文中添加第一个非空运算符,其硬编码值为“admins”-groups: request.auth.claims["groups"] | "admins") 它可以正常工作,但表示在混合器适配器解析阶段组为空?

如果我在授权上下文组中设置要从 request.auth.token["groups"] 获取,就像在 docu 中提到的那样 混合器失败并出现错误:

(...)'requestcontext.authorization.istio-system': failed to evaluate expression for field 'Subject'; failed to evaluate expression for field 'Subject.Groups': unknown attribute request.auth.token'.

当我查看attribute vocabulary docu 时,它并没有提到request.auth 上的token 属性,我也无法在代码中找到它。但是,我正在尝试使用 request.auth.claims

如何将身份验证策略与 RBAC 一起设置以使其与来自 JWT 的组一起使用?此外,是否可以在解决授权阶段时记录/调试混音器,以查看准确评估的内容?

【问题讨论】:

  • 你使用的是什么版本的 istio?
  • 0.8。我在 google groups 上收到了回复,提到尚不支持作为字符串数组的组以及角色绑定主题中的组(可以通过属性解决)

标签: istio


【解决方案1】:

Piotr Mścichowski 在 cmets 中回答:

我收到了关于 google groups 的回复,其中提到尚不支持作为字符串数组的组以及角色绑定主题中的组(可以通过属性解决): p>

朱阳敏

我们目前正在努力在Istio 1.0 中添加更多文档,如果您愿意的话 使用最新的每日版本,您可以尝试使用 以下步骤:

1) 我们引入了一个新的全局自定义资源来控制 RBAC 网格中的行为:RbacConfig。你可以申请一个像 this 为“默认”命名空间启用 RBAC,

2) 我们对ServiceRole.Constraints 和 ServiceRoleBinding.Properties 支持哪些键。看 此PR 了解受支持键的概述。关于你的 ServiceRoleBinding,您可以使用以下配置检查 反对来自 JWT 的声明(注意:未使用 group 字段,并且 不支持,您可以在属性中指定):

apiVersion: "config.istio.io/v1alpha2"
kind: ServiceRoleBinding
metadata:
  name: service-admin-binding
spec:
  subjects:

  - properties:
      request.auth.claims[groups]: "admins"
  roleRef:
    kind: ServiceRole
    name: "service-admin"

我认为您不需要特殊设置来进行身份验证 与 RBAC 合作,如果您能成功完成这项工作 task,它应该自动与 RBAC 一起工作。

您可以打开您的 envoy 代理的调试日志记录 服务。对于 rbac,有一个名为“rbac”的特定日志记录组 envoy,您可以在本地访问 enovy 管理页面(默认为 http://127.0.0.1:15000/logging)。

王利民:
我们目前不支持非字符串的 JWT 声明。如果您的 JWT 组声明设置为单个字符串 (而不是数组),它将正常工作。

"group": "admin"

目前不支持“主题”下的“组”。但是作为 Yangmin 建议,您可以改用自定义“属性”。

 subjects:
  - properties:
      request.auth.claims[groups]: "admins"

感谢您提请我们注意此问题,我们计划 改进以在未来版本中支持此类用例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-31
    • 2019-04-15
    • 2018-02-08
    • 2020-12-05
    • 2020-01-05
    • 1970-01-01
    • 2021-09-24
    • 2019-02-26
    相关资源
    最近更新 更多