如何基于JWT声明中的组设置Istio RBAC?

时间:2018-07-10 10:53:49

标签: istio

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

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

我将Authorization上下文设置如下:

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的主题设置为一个特定的组,称为“管理员”:

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": [
    "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时,它没有提到token上的request.auth属性,我也没有在代码中找到它。但是,我正在尝试使用request.auth.claims

如何与RBAC一起设置身份验证策略,使其与JWT中的组一起使用?另外,是否可以在解决授权阶段的同时对混合器进行日志/调试,以查看对其进行了精确评估?

1 个答案:

答案 0 :(得分:1)

在评论中得到Piotr Mścichowski的答复:

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

  

朱杨民

     

如果您正在,我们正在努力在Istio 1.0中添加更多文档   使用最新的每日发行版,您可以尝试使用   完成以下步骤:

     

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

     

2)我们对ServiceRole进行了一些更改。约束和   ServiceRoleBinding.Properties关于支持哪些键。看到   PR中有关受支持键的概述。关于你   ServiceRoleBinding,您可以使用以下配置进行检查   针对JWT的声明(注意:未使用组字段,并且   不支持,而是可以在属性中指定它):

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一起使用。

     

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

     

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

"group": "admin"
     

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

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

感谢您将此问题引起我们的注意,我们计划使   改进以在将来的版本中支持此类用例。