我有一个启用了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中的组一起使用?另外,是否可以在解决授权阶段的同时对混合器进行日志/调试,以查看对其进行了精确评估?
答案 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"
感谢您将此问题引起我们的注意,我们计划使 改进以在将来的版本中支持此类用例。