【发布时间】: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