自定义角色和授权编辑

如果您需要从 Elasticsearch 安全功能未默认支持的系统中检索用户角色,或者提供的授权系统无法满足您的需求,则可以实现加载 SPI 的安全扩展来定制角色检索和/或授权系统。加载 SPI 的安全扩展是普通 Elasticsearch 插件的一部分。

实现自定义角色提供程序编辑

要创建自定义角色提供程序,请执行以下操作:

  1. 实现接口 BiConsumer<Set<String>, ActionListener<Set<RoleDescriptor>>>。也就是说,该实现包含一个方法,该方法接受一组字符串(即要解析的角色名称)和一个 ActionListener,解析后的角色描述符集将作为响应传递给该 ActionListener。
  2. 自定义角色提供程序实现必须特别注意不要阻塞任何 I/O 操作。该实现负责确保异步行为和非阻塞调用,这可以通过在解析角色并准备好响应时发送响应的 ActionListener 来简化。

要将自定义角色提供程序打包为插件,请执行以下操作:

  1. 为您的角色提供程序实现一个扩展类,该类实现 org.elasticsearch.xpack.core.security.SecurityExtension。您需要在其中重写以下一个或多个方法:

    @Override
    public List<BiConsumer<Set<String>, ActionListener<Set<RoleDescriptor>>>>
    getRolesProviders(Settings settings, ResourceWatcherService resourceWatcherService) {
        ...
    }

    getRolesProviders 方法用于提供自定义角色提供程序列表,如果无法通过保留角色或本机角色存储解析角色名称,则将使用这些提供程序来解析角色名称。应按照调用自定义角色提供程序来解析角色的顺序返回列表。例如,如果 getRolesProviders 返回两个角色提供程序实例,并且它们都能解析角色 A,则将使用列表中第一个角色提供程序解析的角色描述符作为角色 A 的解析角色描述符。

实现授权引擎编辑

要创建授权引擎,您需要执行以下操作:

  1. 在具有所需授权行为的类中实现 org.elasticsearch.xpack.core.security.authz.AuthorizationEngine 接口。
  2. 在包含授权请求所需信息的类中实现 org.elasticsearch.xpack.core.security.authz.Authorization.AuthorizationInfo 接口。

要将授权引擎打包为插件,请执行以下操作:

  1. 为您的授权引擎实现一个扩展类,该类扩展 org.elasticsearch.xpack.core.security.SecurityExtension。您需要在其中重写以下方法:

    @Override
    public AuthorizationEngine getAuthorizationEngine(Settings settings) {
        ...
    }

    getAuthorizationEngine 方法用于提供授权引擎实现。

GitHub 上的 elasticsearch 存储库中提供了说明自定义授权引擎的结构和实现的示例代码。您可以将此代码用作创建自己的授权引擎的起点。

实现 Elasticsearch 插件编辑

为了注册自定义角色提供程序或授权引擎的安全扩展,您还需要实现一个包含该扩展的 Elasticsearch 插件。

  1. 实现一个扩展 org.elasticsearch.plugins.Plugin 的插件类。
  2. 为插件创建一个构建配置文件;我们建议使用 Gradle。
  3. 按照 插件作者帮助 中的说明创建一个 plugin-descriptor.properties 文件。
  4. 为包含 org.elasticsearch.xpack.core.security.SecurityExtension 实现的完全限定类名的扩展创建一个 META-INF/services/org.elasticsearch.xpack.core.security.SecurityExtension 描述符文件。
  5. 将所有内容捆绑在一个 zip 文件中。

使用安全扩展编辑

要使用安全扩展,请执行以下操作:

  1. 在集群中的每个节点上安装带有扩展的插件。您可以运行带有 install 子命令的 bin/elasticsearch-plugin,并指定指向包含扩展的 zip 文件的 URL。例如:

    bin/elasticsearch-plugin install file:///<path>/my-extension-plugin-1.0.zip
  2. 将扩展中实现的任何配置参数添加到 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 接口中的方法。

  3. 重启 Elasticsearch。