自定义角色和授权
编辑自定义角色和授权编辑
如果您需要从 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
文件。 - 为包含
org.elasticsearch.xpack.core.security.SecurityExtension
实现的完全限定类名的扩展创建一个META-INF/services/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。