自定义角色和授权
编辑自定义角色和授权
编辑如果您需要从非开箱即用的系统检索用户角色,或者 Elasticsearch 安全功能提供的授权系统不符合您的需求,则可以实现一个 SPI 加载的安全扩展,以自定义角色检索和/或授权系统。SPI 加载的安全扩展是普通 Elasticsearch 插件的一部分。
实现自定义角色提供程序
编辑要创建自定义角色提供程序
- 实现接口
BiConsumer<Set<String>, ActionListener<Set<RoleDescriptor>>>
。也就是说,实现包含一个方法,该方法接收一组字符串(即要解析的角色名称)和一个 ActionListener,解析的角色描述符集将作为响应传递给该 ActionListener。 - 自定义角色提供程序实现必须特别注意不要阻塞任何 I/O 操作。实现有责任确保异步行为和非阻塞调用,这可以通过以下事实来简化,即提供了一个
ActionListener
,当角色已解析且响应准备就绪时,可以在其上发送响应。
要将自定义角色提供程序打包为插件
-
为您的角色提供程序实现一个扩展类,该类实现
org.elasticsearch.xpack.core.security.SecurityExtension
。您需要在其中覆盖以下一个或多个方法@Override public List<BiConsumer<Set<String>, ActionListener<Set<RoleDescriptor>>>> getRolesProviders(Settings settings, ResourceWatcherService resourceWatcherService) { ... }
如果保留角色或本地角色存储无法解析角色名称,则
getRolesProviders
方法用于提供将用于解析角色名称的自定义角色提供程序列表。该列表应按调用自定义角色提供程序解析角色的顺序返回。例如,如果getRolesProviders
返回两个角色提供程序的实例,并且它们都能够解析角色A
,则将用于角色A
的已解析角色描述符将是列表中第一个角色提供程序解析的角色描述符。
实现授权引擎
编辑要创建授权引擎,您需要
- 在具有所需授权行为的类中实现
org.elasticsearch.xpack.core.security.authz.AuthorizationEngine
接口。 - 在包含授权请求所需信息的类中实现
org.elasticsearch.xpack.core.security.authz.Authorization.AuthorizationInfo
接口。
要将您的授权引擎打包为插件
-
为您的授权引擎实现一个扩展类,该类扩展
org.elasticsearch.xpack.core.security.SecurityExtension
。您需要在其中覆盖以下方法@Override public AuthorizationEngine getAuthorizationEngine(Settings settings) { ... }
getAuthorizationEngine
方法用于提供授权引擎实现。
GitHub 上 elasticsearch 存储库中提供了说明自定义授权引擎的结构和实现的示例代码。您可以使用此代码作为创建自己的授权引擎的起点。
实现 Elasticsearch 插件
编辑为了注册自定义角色提供程序或授权引擎的安全扩展,您还需要实现一个包含该扩展的 Elasticsearch 插件
- 实现一个扩展
org.elasticsearch.plugins.Plugin
的插件类 - 为该插件创建一个构建配置文件;我们推荐使用 Gradle。
- 创建一个
plugin-descriptor.properties
文件,如 插件作者帮助 中所述。 - 为扩展创建一个
META-INF/services/org.elasticsearch.xpack.core.security.SecurityExtension
描述符文件,其中包含您的org.elasticsearch.xpack.core.security.SecurityExtension
实现的完全限定类名 - 将所有内容捆绑到一个 zip 文件中。
使用安全扩展
编辑要使用安全扩展
-
在集群中的每个节点上安装带有扩展的插件。您可以使用
install
子命令运行bin/elasticsearch-plugin
,并指定指向包含扩展的 zip 文件的 URL。例如bin/elasticsearch-plugin install file:///<path>/my-extension-plugin-1.0.zip
-
将扩展中实现的任何配置参数添加到
elasticsearch.yml
文件。这些设置没有命名空间,您可以在构造扩展时访问任何设置,尽管建议对扩展使用命名空间约定,以使您的elasticsearch.yml
配置易于理解。例如,如果您有一个自定义角色提供程序,该提供程序通过读取 AWS 上 S3 存储桶中的 blob 来解析角色,那么您将在
elasticsearch.yml
中指定如下设置custom_roles_provider.s3_roles_provider.bucket: roles custom_roles_provider.s3_roles_provider.region: us-east-1 custom_roles_provider.s3_roles_provider.secret_key: xxx custom_roles_provider.s3_roles_provider.access_key: xxx
这些设置作为参数传递给
SecurityExtension
接口中的方法。 - 重新启动 Elasticsearch。