使用 Azure AD OAuth 的 Grafana 角色分配

Grafana role assignment using Azure AD OAuth

我正在尝试使用 Azure AD OAuth 为某些用户组分配 Grafana 中的管理员角色。

我可以使用此文档使用 Azure AD 凭据成功登录:Set up OAuth2 with Azure Active Directory

根据此页面,我需要在某处包含 role_attribute_path:Role mapping

role_attribute_path = contains(info.groups[*], 'admin') && 'Admin' || contains(info.groups[*], 'editor') && 'Editor' || 'Viewer'

有人有使用 Azure AD 登录的角色分配工作示例吗?

我刚刚得到这个可以与作为我的 OIDC 提供商的 Keycloak 一起使用。这需要捕获来自 UserInfo OAuth2 端点的响应并检查生成的 JSON。只有这样你才能修改 JMESPath 表达式来实现你想要的。

为了捕获响应,我必须进行两次 curl 调用,因此您可能需要为 AzureAD 执行类似的操作。第一个为您提供访问令牌,第二个调用使用它为您提供所需的详细信息 - 即。 groups/roles - 您已选择从 UserInfo 端点公开。 Grafana 文档中描述了此行为。

就 Keycloak 的价值而言,电话是在 Linux/bash:

ACCESS_TOKEN=$(curl \
    -d "client_id=xxxx" \
    -d "client_secret=xxxx" \
    -d "username=xxxx" \
    -d "password=xxxx" \
    -d "grant_type=password" \
    "https://xxx.foo.bar/auth/realms/myrealm/protocol/openid-connect/token" \
        | jq --raw-output .access_token)

curl \
    -X POST \
    -H "Authorization: bearer "$ACCESS_TOKEN \
    "https://xxx.foo.bar/auth/realms/myrealm/protocol/openid-connect/userinfo" \
        | jq

当我设法做到这一点时,我发现我没有正确公开我感兴趣的组,因此需要在 Keycloak 中进行更多配置以启用它。

通过这种修修补补,我最终得到了一个带有组键的 JSON 文档。像这样:

{
  ...
  "groups": [
    "MyGroup"
  ],
  ...
}

此时我可以看到我的 JMESPath 因此应该是:

contains(groups[*], 'MyGroup') && 'Admin'

附录

如果您在 Grafana 中使用多个组织,并且正在从 LDAP 迁移,您可能会发现下一个问题是如何以类似的基于规则的方式将用户映射到 org_id。

从 Grafana 6.5.1 开始,尽管已请求将此功能作为增强功能,但不支持此功能。也不可能同时维护单独的 LDAP 绑定,仅用于组查找和组织映射,除非您使用 Oauth 代理配置(关于使用 Oauth 进行身份验证和使用 LDAP 进行授权的可能性的文档,以及一些示例配置 here.)

随着 Grafana 6.6.0 的推出,现在可以使用 OAuth 和 Azure AD 进行角色分配。

我将以下内容放入配置 ini 文件中,以将管理员角色分配给某个 Azure AD 组中的任何人,其他所有人都将成为查看者:

    [auth.generic_oauth]
    name = Azure AD
    enabled = true
    allow_sign_up = true
    client_id = {{ .azure.client.id }}
    client_secret = {{ .azure.client.secret }}
    scopes = openid email profile
    auth_url = https://login.microsoftonline.com/{{ .azure.tenantid }}/oauth2/authorize
    token_url = https://login.microsoftonline.com/{{ .azure.tenantid }}/oauth2/token
    api_url =
    team_ids =
    allowed_organizations =
    role_attribute_path = contains(groups[*], '{{ .azure.admin_group }}') && 'Admin' || 'Viewer'

其中

{{ .azure.client.id}} 是 Azure AD,应用程序注册,应用程序客户端 ID

{{ .azure.client.secret}} 是与上面注册的应用相关联的客户端密码

{{ .azure.tenantid }} 是 Azure AD 租户 ID

{{ .azure.admin_group }} 是您希望作为管理员角色的 Azure AD 组的 ObjectID