REST 层授权

REST 层授权为插件和扩展 API 请求提供了额外的安全层级,通过在 REST 层提供授权检查机制。此安全层级位于传输层之上,提供了一种补充的授权方法,而不替换、修改或以任何方式改变传输层上的同一过程。REST 层授权最初是为了满足对扩展的授权检查需求而创建的,这些扩展不在传输层进行通信。然而,该功能也可供希望在为 UDB-SX 创建未来插件时使用它的开发者使用。

对于使用 REST 层授权的用户,分配角色、映射用户和角色以及插件和扩展的一般使用方法保持不变——唯一的额外要求是用户熟悉新的权限方案。

使用 REST 层进行授权的好处包括能够在 REST 层授权请求并过滤掉未经授权的请求。因此,这减少了传输层的处理负担,同时允许对 API 访问进行细粒度控制。

一些读取操作,例如滚动,管理状态。因此,建议使用 Security 插件权限来控制读写访问,而不是允许/阻止 HTTP 请求动词。

必须启用 Security 插件才能使用 REST 层授权。

NamedRoute

REST 层授权使集群管理员能够授予或撤销对集群中特定端点的访问权限。为此,资源的路由使用一个唯一的名称。

为了促进 REST 层授权,UDB-SX 引入了 NamedRoute 的概念用于路由注册。对于开发者,此标准要求一种新的路由注册方法,该方法使用唯一名称。虽然传输操作通常由方法名称、路径部分和相应的传输操作组成,但这种新实现要求方法名称、路径部分和路由的唯一名称。顾名思义,它必须在所有插件和扩展中是唯一的,或者换句话说,不能注册到任何其他路由。

例如,考虑以下用于异常检测资源的路径:

_/detectors/<detectorId>/profile

对于扩展,可以通过引用资源的 settings.yml 文件中的 routeNamePrefix 值(在这种情况下为 ad)并将其添加到路由中以完成唯一名称来创建 NamedRoute。结果如下例所示:

ad:detectors/profile

对于插件,可以使用插件名称代替 routeNamePrefix 值。

然后,路由名称可以以与传统权限相同的方式映射到角色。如下例所示:

ad_role:
  reserved: true
  cluster_permissions:
    - 'ad:detectors/profile'

映射用户和角色

使用 NamedRoute 映射用户和角色的方式没有变化。此外,新的权限格式与现有配置兼容。本节提供了一个示例,说明用户和角色映射在旧版和 NamedRoute 配置中如何显示,以及它们如何为操作授权已注册的路由。

当用户发起 REST 请求时,会检查用户的角色,并评估与用户关联的每个权限,以确定是否与分配给路由的唯一名称匹配,或者与路由注册期间定义的任何旧版操作匹配。用户可以映射到包含为唯一名称或旧版操作格式化的权限的角色。考虑以下用于虚构插件 abc 的角色:

abcplugin_read_access:
   reserved: true
   cluster_permissions:
     - 'cluster:admin/UDB-SX/abcplugin/route/get'

同时考虑以下角色映射:

abcplugin_read_access:
	 reserved: true
	 users:
		 - "user-A"

如果 user-A 向路由 /_plugins/_abcplugin/route/get 发起 REST API 调用,则该用户被授予对该操作的授权。但是,对于不同的路由,例如 /_plugins/_abcplugin/route/delete,请求将被拒绝。

相同的逻辑也适用于使用路由唯一名称和 NamedRoute 概念的角色和角色映射。考虑以下用于同一插件 abc 的角色:

abcplugin_read_access_nr:
   reserved: true
   cluster_permissions:
     - 'abcplugin:routeGet'
     - 'abcplugin:routePut'
     - 'abcplugin:routeDelete'

同时考虑以下角色映射:

abcplugin_read_access_nr:
	 reserved: true
	 users:
		 - "user-B"

在这第二种情况下,如果 user-B 向任何路由 /_plugins/_abcplugin/route/get/_plugins/_abcplugin/route/put/_plugins/_abcplugin/route/delete 发起 REST API 调用,则该用户被授予对该操作的授权。