与其他身份验证系统集成

编辑

如果您使用的身份验证系统不是 Elasticsearch 安全功能开箱即用的支持系统,您可以创建一个自定义领域与其交互以验证用户身份。您可以将自定义领域实现为作为普通 Elasticsearch 插件一部分加载的 SPI 安全扩展。

实现自定义领域

编辑

https://github.com/elastic/elasticsearch/tree/8.17/x-pack/qa/security-example-spi-extension 中提供了演示自定义领域结构和实现的示例代码。您可以将此代码用作创建您自己的领域的起点。

要创建自定义领域,您需要:

  1. 扩展 org.elasticsearch.xpack.security.authc.Realm 以与您的身份验证系统通信,从而验证用户身份。
  2. 在用于创建自定义领域的类中实现 org.elasticsearch.xpack.security.authc.Realm.Factory 接口。
  3. 扩展 org.elasticsearch.xpack.security.authc.DefaultAuthenticationFailureHandler,以处理使用自定义领域时的身份验证失败。

要将您的自定义领域打包为插件:

  1. 为您的领域实现一个扩展类,该类扩展 org.elasticsearch.xpack.core.security.SecurityExtension。您需要在其中覆盖以下一个或多个方法:

    @Override
    public Map<String, Factory> getRealms() {
        ...
    }

    getRealms 方法用于提供类型名称到将用于创建领域的 Factory 的映射。

    @Override
    public AuthenticationFailureHandler getAuthenticationFailureHandler() {
        ...
    }

    getAuthenticationFailureHandler 方法用于选择性地提供自定义的 AuthenticationFailureHandler,该处理程序将控制 Elasticsearch 安全功能在某些身份验证失败事件中的响应方式。

    @Override
    public List<String> getSettingsFilter() {
        ...
    }

    Plugin#getSettingsFilter 方法返回一个设置名称列表,这些名称应从设置 API 中过滤掉,因为它们可能包含敏感凭据。请注意,此方法不是 SecurityExtension 接口的一部分,它作为 Elasticsearch 插件主类的一部分可用。

  2. 为插件创建构建配置文件;我们推荐使用 Gradle。
  3. 为扩展创建 META-INF/services/org.elasticsearch.xpack.core.security.SecurityExtension 描述符文件,其中包含 org.elasticsearch.xpack.core.security.SecurityExtension 实现的完全限定类名。
  4. 将所有内容捆绑到一个 zip 文件中。

使用自定义领域验证用户身份

编辑

要使用自定义领域:

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

    bin/elasticsearch-plugin install file:///<path>/my-realm-1.0.zip
  2. xpack.security.authc.realms 命名空间下的 elasticsearch.yml 中添加相应领域类型的领域配置。您必须在与扩展定义的类型匹配的命名空间中定义您的领域。您可以设置的选项取决于自定义领域公开的设置。至少,您必须显式设置 order 属性以控制在身份验证期间查询领域的顺序。您还必须确保每个配置的领域都有一个不同的 order 设置。如果两个或多个领域具有相同的 order,则节点将无法启动。

    当您在 elasticsearch.yml 中配置领域时,只有您指定的领域才用于身份验证。如果您还想使用 nativefile 领域,则必须将其包含在领域链中。

  3. 重启 Elasticsearch。