自定义 Realm
如果您正在使用 Elasticsearch 安全功能未原生支持的身份验证系统,您可以创建一个自定义域来与它交互以对用户进行身份验证。您可以将自定义域实现为作为普通 elasticsearch 插件一部分的 SPI 加载的安全扩展。
GitHub 上的 elasticsearch 仓库中提供了阐述自定义域结构和实现的示例代码。您可以使用此代码作为创建您自己的域的起点。
要创建自定义域,您需要执行以下操作
- 扩展
org.elasticsearch.xpack.security.authc.Realm以与您的身份验证系统通信来对用户进行身份验证。 - 在将用于创建自定义域的类中实现
org.elasticsearch.xpack.security.authc.Realm.Factory接口。 - 扩展
org.elasticsearch.xpack.security.authc.DefaultAuthenticationFailureHandler以在使用您的自定义域时处理身份验证失败。
要将您的自定义域打包为插件
为您的域实现一个扩展类,该类扩展
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 插件主类的一部分提供。为插件创建构建配置文件;我们推荐使用 Gradle。
为扩展创建一个
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-realm-1.0.zip如果您使用的是 Elastic Cloud 托管版,请参考 上传自定义插件和捆绑包。
如果您使用的是 Elastic Cloud Enterprise,请参考 向您的部署中添加自定义捆绑包和插件。
如果您使用的是 Elastic Cloud on Kubernetes,请参考 自定义配置文件和插件。
将适当域类型的域配置添加到
elasticsearch.yml中的xpack.security.authc.realms命名空间下。您必须在与扩展定义的类型相匹配的命名空间内定义您的域。您可以设置的选项取决于自定义域公开的设置。至少,您必须显式设置order属性,以控制在身份验证期间查询域的顺序。您还必须确保每个配置的域具有不同的order设置。如果有两个或多个域具有相同的order,则节点将无法启动。重要提示当您在
elasticsearch.yml中配置领域时,仅使用您指定的领域进行身份验证。如果您还想使用native或file领域,则必须将它们包含在领域链中。重启 Elasticsearch。