规划您的 RBAC 推行策略
注意
可用版本
RBAC 推行策略有助于您在将 RBAC 角色分配给用户和团队之前,确定您希望*如何*实施 RBAC。
您的推行策略应帮助您回答以下问题:
- 我应该向用户分配基本角色,还是应该向用户分配固定角色或自定义角色?
- 我何时应该创建自定义角色?
- 我应该将固定角色和自定义角色应用于哪些实体?是应用于用户、团队?还是应该修改基本角色的权限?
- 我如何以易于管理的方式推行权限?
- 在分配角色时,我应该使用哪种方法?是使用 Grafana UI、置备还是 API?
查看基本角色和固定角色定义
确定权限推行策略的第一步,我们建议您熟悉基本角色和固定角色定义。除了向任何用户和团队分配固定角色外,您还可以修改基本角色的权限,这会改变 Viewer、Editor 或 Admin 的操作能力。这种灵活性意味着您可以考虑多种角色分配组合。如果您有大量的 Grafana 用户和团队,我们建议您列出可能要使用的固定角色。请记住,No Basic Role
是一个没有权限的角色,无法修改或更新。
要了解有关基本角色和固定角色的更多信息,请参阅以下文档:
用户和团队注意事项
RBAC 是一个灵活而强大的功能,提供了许多可能的权限分配组合。在为用户和团队分配权限时,请考虑以下指南:
当您遇到少量用户需要访问资源或希望分配临时访问权限的一次性场景时,请**向用户分配角色**。如果用户数量众多,随着您使用 Grafana 的规模扩大,这种方法可能难以管理。例如,您的 IT 部门成员可能需要
fixed:licensing:reader
和fixed:licensing:writer
角色,以便他们可以管理您的 Grafana Enterprise 许可证。当您有一部分用户与您的组织结构相符,并且希望团队所有成员具有相同的访问级别时,请**向团队分配角色**。例如,某个工程团队的所有成员可能需要
fixed:reports:reader
和fixed:reports:writer
角色才能管理报告。当您将其他用户分配给团队时,系统会自动为这些用户分配权限。
身份验证提供程序注意事项
您可以利用当前的身份验证提供程序来管理 Grafana 中的用户和团队权限。当您将用户和团队映射到 SAML 和 LDAP 组时,您可以将这些分配与 Grafana 同步。
例如:
将 SAML、LDAP 或 Oauth 角色映射到 Grafana 基本角色(viewer、editor 或 admin)。
使用 Grafana Enterprise 团队同步功能将团队从您的 SAML、LDAP 或 Oauth 提供程序同步到 Grafana。有关团队同步的更多信息,请参阅团队同步。
在 Grafana 内部,向用户和团队分配 RBAC 权限。
何时修改基本角色或创建自定义角色
在确定是否应修改基本角色或创建自定义角色时,请考虑以下指南:
当 Grafana 对 viewer、editor 和 admin 角色的定义与您对这些角色的定义不符时,请**修改基本角色**。您可以从任何基本角色添加或移除权限。
注意
您对基本角色所做的更改会影响 Grafana 实例中所有
组织的角色定义。例如,当您将
fixed:users:writer
角色的权限添加到 viewer 基本角色时,Grafana 实例中任何组织的所有 viewer 都可以创建该组织内的用户。注意
您无法修改
No Basic Role
的权限。当固定角色定义不符合您的权限要求时,请**创建自定义角色**。例如,
fixed:dashboards:writer
角色允许用户删除面板。如果您希望某些用户或团队能够创建和更新面板但不能删除,您可以创建一个自定义角色,名称类似custom:dashboards:creator
,该角色缺少dashboards:delete
权限。
如何分配 RBAC 角色
使用以下任何方法向用户和团队分配 RBAC 角色:
- Grafana UI:当您想为少量用户和团队分配 RBAC 角色时,请使用 Grafana UI。UI 中包含一个角色选择器,您可以使用它来选择角色。
- Grafana HTTP API:如果您想自动化角色分配,请使用 Grafana HTTP API。
- Terraform:如果您使用 Terraform 进行置备,请使用 Terraform 来分配和管理用户和团队的角色分配。
- Grafana 置备:Grafana 置备提供了一种强大的方法来分配、移除和删除角色。您可以在一个 YAML 文件中包含多个角色分配和移除条目。
权限场景
我们根据当前的 Grafana 实现,整理了以下权限推行场景:
注意
如果您有希望分享的用例,请随时为本文档页面贡献内容。我们期待您的分享!
允许内部 viewer 员工使用 Explore,但阻止外部 viewer 承包商使用 Explore
- 在 Grafana 中,创建一个名为
Internal employees
的团队。 - 将
fixed:datasources:explorer
角色分配给Internal employees
团队。 - 将内部员工添加到
Internal employees
团队,或使用 团队同步从 SAML、LDAP 或 Oauth 团队映射他们。 - 将 viewer 角色分配给内部员工和承包商。
限制 viewer、editor 或 admin 权限
- 查看与基本角色相关的权限列表。
- 更改基本角色的权限.
只允许一个团队的成员管理告警
- 创建一个名为
Alert Managers
的团队,并将所有适用的告警固定角色分配给该团队。 - 将用户添加到
Alert Managers
团队。 - 从 Viewer、Editor 和 Admin 基本角色中移除所有前缀为
alert.
的权限。
为两个或更多地理位置的用户提供面板
- 为每个地理位置创建一个文件夹,例如,创建一个
US
文件夹和一个EU
文件夹。 - 向每个文件夹添加面板。
- 使用文件夹权限将美国用户添加为
US
文件夹的 Editors,并将欧盟用户分配为EU
文件夹的 Editors。
为用户分配特定角色集
- 创建一个用户,并在组织角色下选择
No Basic Role
。 - 为用户分配一组满足您要求的固定角色。
创建自定义角色以访问特定文件夹中的告警
要在 Grafana 中查看告警规则,用户必须对存储告警规则的文件夹具有读取权限,对该文件夹中的告警具有读取权限,以及对该规则使用的所有数据源具有查询权限。
此示例中的 API 命令基于以下内容:
- ID 为
92
的Test-Folder
- 两个数据源:UID 为
_oAfGYUnk
的DS1
,和 UID 为YYcBGYUnk
的DS2
- 存储在
Test-Folder
中并查询这两个数据源的告警规则。
以下请求创建一个包含访问告警规则权限的自定义角色:
curl --location --request POST '<grafana_url>/api/access-control/roles/' \
--header 'Authorization: Bearer glsa_kcVxDhZtu5ISOZIEt' \
--header 'Content-Type: application/json' \
--data-raw '{
"version": 1,
"name": "custom:alerts.reader.in.folder.123",
"displayName": "Read-only access to alerts in folder Test-Folder",
"description": "Let user query DS1 and DS2, and read alerts in folder Test-Folders",
"group":"Custom",
"global": false,
"permissions": [
{
"action": "folders:read",
"scope": "folders:uid:YEcBGYU22"
},
{
"action": "alert.rules:read",
"scope": "folders:uid:YEcBGYU22"
},
{
"action": "datasources:query",
"scope": "datasources:uid:_oAfGYUnk"
},
{
"action": "datasources:query",
"scope": "datasources:uid:YYcBGYUnk"
}
]
}'
允许 editor 创建自定义角色
默认情况下,只有 Grafana 服务器管理员可以创建和管理自定义角色。如果您希望 Editors
也这样做,请更新 Editor
基本角色的权限。有两种方法可以实现此目的:
使用置备或 RBAC HTTP API,将以下权限添加到
basic:editor
角色:action scope roles:read
roles:*
roles:write
permissions:type:delegate
roles:delete
permissions:type:delegate
例如,这里有一个小的 bash 脚本,它获取角色,使用
jq
修改它并更新它:# Fetch the role, modify it to add the desired permissions and increment its version curl -H 'Authorization: Bearer glsa_kcVxDhZtu5ISOZIEt' \ -X GET '<grafana_url>/api/access-control/roles/basic_editor' | \ jq 'del(.created)| del(.updated) | del(.permissions[].created) | del(.permissions[].updated) | .version += 1' | \ jq '.permissions += [{"action": "roles:read", "scope": "roles:*"}, {"action": "roles:write", "scope": "permissions:type:delegate"}, {"action": "roles:delete", "scope": "permissions:type:delegate"}]' > /tmp/basic_editor.json # Update the role curl -H 'Authorization: Bearer glsa_kcVxDhZtu5ISOZIEt' -H 'Content-Type: application/json' \ -X PUT-d @/tmp/basic_editor.json '<grafana_url>/api/access-control/roles/basic_editor'
或者,使用置备文件的
role > from
列表将fixed:roles:writer
角色权限添加到basic:editor
角色:apiVersion: 2 roles: - name: 'basic:editor' global: true version: 3 from: - name: 'basic:editor' global: true - name: 'fixed:roles:writer' global: true
注意:任何具有修改角色能力的用户或服务帐户只能创建、更新或删除其已获授权的权限的角色。例如,具有
Editor
角色的用户只能创建和管理他们拥有的权限或其子集的角色。
允许 viewer 创建报告
如果您希望 Viewers
创建报告,请更新 Viewer
基本角色的权限。有两种方法可以实现此目的:
使用置备或 RBAC HTTP API,将以下权限添加到
basic:viewer
角色:Action Scope reports:create
不适用 reports:write
reports:*
reports:id:*
reports:read
reports:*
reports:send
reports:*
例如,这里有一个小的 bash 脚本,它获取角色,使用
jq
修改它并更新它:# Fetch the role, modify it to add the desired permissions and increment its version curl -H 'Authorization: Bearer glsa_kcVxDhZtu5ISOZIEt' \ -X GET '<grafana_url>/api/access-control/roles/basic_viewer' | \ jq 'del(.created)| del(.updated) | del(.permissions[].created) | del(.permissions[].updated) | .version += 1' | \ jq '.permissions += [{"action": "reports:create"}, {"action": "reports:read", "scope": "reports:*"}, {"action": "reports:write", "scope": "reports:*"}, {"action": "reports:send", "scope": "reports:*"}]' > /tmp/basic_viewer.json # Update the role curl -H 'Authorization: Bearer glsa_kcVxDhZtu5ISOZIEt' -H 'Content-Type: application/json' \ -X PUT-d @/tmp/basic_viewer.json '<grafana_url>/api/access-control/roles/basic_viewer'
或者,使用置备文件的
role > from
列表将fixed:reports:writer
角色权限添加到basic:viewer
角色:apiVersion: 2 roles: - name: 'basic:viewer' global: true version: 3 from: - name: 'basic:viewer' global: true - name: 'fixed:reports:writer' global: true
注意:
fixed:reports:writer
角色分配的权限不仅仅是创建报告。有关固定角色权限分配的更多信息,请参阅固定角色定义。
阻止 Grafana Admin 创建和邀请用户
要阻止 Grafana Admin 创建用户并邀请他们加入组织,您必须更新基本角色权限。要移除的权限是:
Action | Scope |
---|---|
users:create | |
org.users:add | users:* |
有两种方法可以实现此目的:
使用 RBAC HTTP API。
例如,这里有一个小的 bash 脚本,它获取角色,使用
jq
修改它并更新它:# Fetch the role, modify it to remove the undesired permissions and increment its version curl -H 'Authorization: Bearer glsa_kcVxDhZtu5ISOZIEt' \ -X GET '<grafana_url>/api/access-control/roles/basic_grafana_admin' | \ jq 'del(.created)| del(.updated) | del(.permissions[].created) | del(.permissions[].updated) | .version += 1' | \ jq 'del(.permissions[] | select (.action == "users:create")) | del(.permissions[] | select (.action == "org.users:add" and .scope == "users:*"))' > /tmp/basic_grafana_admin.json # Update the role curl -H 'Authorization: Bearer glsa_kcVxDhZtu5ISOZIEt' -H 'Content-Type: application/json' \ -X PUT-d @/tmp/basic_grafana_admin.json '<grafana_url>/api/access-control/roles/basic_grafana_admin'
或者,使用置备文件的
role > from
列表和permission > state
选项:apiVersion: 2 roles: - name: 'basic:grafana_admin' global: true version: 3 from: - name: 'basic:grafana_admin' global: true permissions: - action: 'users:create' state: 'absent' - action: 'org.users:add' scope: 'users:*' state: 'absent'
阻止 Viewers 访问应用插件
默认情况下,Viewers、Editors 和 Admins 可以访问其组织角色允许访问的所有应用插件。要更改此默认行为并阻止 Viewers 访问应用插件,您必须更新基本角色的权限。
在此示例中,已安装并启用了三个应用插件:
名称 | ID | 所需组织角色 |
---|---|---|
On Call | grafana-oncall-app | Viewer |
Kentik Connect Pro | kentik-connect-app | Viewer |
Enterprise logs | grafana-enterprise-logs-app | Admin |
默认情况下,Viewers 因此将能够看到 On Call 和 Kentik Connect Pro 应用插件。如果您想撤销他们对 On Call 应用插件的访问权限,您需要:
- 移除访问所有应用插件的权限
Action Scope plugins.app:access
plugins:*
- 仅授予访问 Kentik Connect Pro 应用插件的权限
Action Scope plugins.app:access
plugins:id:kentik-connect-app
有两种方法可以实现此目的:
使用 RBAC HTTP API。
例如,这里有一个小的 bash 脚本,它获取角色,使用
jq
修改它并更新它:# Fetch the role, modify it to remove the undesired permissions, add the new permission and increment its version curl -H 'Authorization: Bearer glsa_kcVxDhZtu5ISOZIEt' \ -X GET '<grafana_url>/api/access-control/roles/basic_viewer' | \ jq 'del(.created)| del(.updated) | del(.permissions[].created) | del(.permissions[].updated) | .version += 1' | \ jq 'del(.permissions[] | select (.action == "plugins.app:access" and .scope == "plugins:*"))' | \ jq '.permissions += [{"action": "plugins.app:access", "scope": "plugins:id:kentik-connect-app"}]' > /tmp/basic_viewer.json # Update the role curl -H 'Authorization: Bearer glsa_kcVxDhZtu5ISOZIEt' -H 'Content-Type: application/json' \ -X PUT -d @/tmp/basic_viewer.json '<grafana_url>/api/access-control/roles/basic_viewer'
此请求中使用的令牌是服务帐户令牌。
或者,使用置备文件的
role > from
列表和permission > state
选项:--- apiVersion: 2 roles: - name: 'basic:viewer' version: 8 global: true from: - name: 'basic:viewer' global: true permissions: - action: 'plugins.app:access' scope: 'plugins:*' state: 'absent' - action: 'plugins.app:access' scope: 'plugins:id:kentik-connect-app' state: 'present'
如果您的目标是移除对某个应用的访问权限,则应从角色中移除该权限并更新角色。例如:
# Fetch the role, modify it to remove permissions to kentik-connect-app and increment role version curl -H 'Authorization: Bearer glsa_kcVxDhZtu5ISOZIEt' \ -X GET '<grafana_url>/api/access-control/roles/basic_viewer' | \ jq 'del(.created)| del(.updated) | del(.permissions[].created) | del(.permissions[].updated) | .version += 1' | \ jq 'del(.permissions[] | select (.action == "plugins.app:access" and .scope == "plugins:id:kentik-connect-app"))' # Update the role curl -H 'Authorization: Bearer glsa_kcVxDhZtu5ISOZIEt' -H 'Content-Type: application/json' \ -X PUT -d @/tmp/basic_viewer.json '<grafana_url>/api/access-control/roles/basic_viewer'
通过团队管理用户权限
在您希望用户通过其所属团队获得访问权限的场景中,我们建议将用户角色设置为 No Basic Role
,并由团队分配代替授予角色。
在 Grafana 中,确保启用了以下配置设置:
[users] # Set to true to automatically assign new users to the default organization (id 1) auto_assign_org = true # Set this value to automatically add new users to the provided organization (if auto_assign_org above is set to true) auto_assign_org_id = <org_id> # Default role new users will be automatically assigned (if auto_assign_org above is set to true) auto_assign_org_role = None
重启 Grafana 实例。
创建一个具有所需名称的团队。
为团队分配固定角色。
向团队添加用户。
用户将自动添加到默认组织,但在分配给团队之前不会有任何权限。
缩小服务帐户的范围
使用服务帐户是促进 M2M 通信的有效方式。但是,如果范围设置不当,它们可能构成安全威胁。要限制服务帐户的范围,可以先创建一个具有 No Basic Role
的服务帐户,然后分配该帐户所需的权限。
- 请参阅服务帐户并添加新的服务帐户。
- 将基本角色设置为
No Basic Role
。 - 设置服务帐户所需的固定角色。
这将减少服务帐户所需的权限,并最大限度地降低泄露风险。