基本身份验证插件

Solr 可以使用 BasicAuthPlugin 支持用户的基本身份验证。

此插件仅提供用户身份验证。要控制用户权限,您可能需要配置授权插件,如 基于规则的授权插件 部分所述。

启用基本身份验证

要使用基本身份验证,您必须首先创建一个 security.json 文件。此文件以及将其放置在何处在 配置 security.json 部分中详细描述。

如果在云模式下运行,您可以使用 bin/solr auth 命令行实用程序为新安装启用安全性,请参阅:bin/solr auth --help 获取更多详细信息。

对于基本身份验证,security.json 必须有一个 authentication 块,用于定义用于身份验证的类。用户名和密码(格式:base64(sha256(sha256(salt+password))) base64(salt))可以在创建文件时添加,也可以稍后使用身份验证 API 添加,如下所述。

下面显示了一个示例 security.json,其中显示了 authenticationauthorization 块,以展示身份验证和授权插件如何协同工作。

{
"authentication":{ (1)
   "blockUnknown": true, (2)
   "class":"solr.BasicAuthPlugin",
   "credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}, (3)
   "realm":"My Solr users", (4)
   "forwardCredentials": false (5)
},
"authorization":{
   "class":"solr.RuleBasedAuthorizationPlugin",
   "permissions":[{"name":"security-edit",
      "role":"admin"}],
   "user-role":{"solr":"admin"}
}}

此示例中定义了几个选项

1 第一个块定义要使用的身份验证插件及其参数。
2 参数 "blockUnknown":true 表示不允许未经身份验证的请求通过。
3 已定义一个名为 “solr” 的用户,密码为 'SolrRocks',采用上述详细说明的编码格式。
4 我们覆盖了 realm 属性,以在登录提示符上显示其他文本。
5 参数 "forwardCredentials":false 表示我们让 Solr 的 PKI 身份验证处理分布式请求,而不是转发基本身份验证标头。

将您的设置保存到本地名为 security.json 的文件中。如果您在单节点安装中使用 Solr,则应将此文件放在 $SOLR_HOME 中。

如果 blockUnknown 未在 security.json 文件中定义,则它将默认为 true。这将产生需要对 Solr 的 HTTP 访问进行身份验证的效果。在某些情况下,您可能不希望在启用插件后进行身份验证;例如,如果您想使用 security.json 但尚未准备好启用身份验证。但是,您需要确保将 blockUnknown 设置为 true 或完全省略,以便对系统的所有请求强制执行身份验证。

如果您将 blockUnknown 设置为 false,则任何未被权限显式保护的请求都将可供匿名用户访问!因此,您应该为每个想要保护的预定义权限定义角色绑定。您可以为希望允许匿名用户访问的请求分配特殊的 role: null 绑定。要保护除具有 role:null 的端点之外的所有端点,您可以为 all 权限添加角色绑定,并将其放置在 security.json 中的最后一个位置。

如果未定义 realm,则它将默认为 solr

如果您使用的是 SolrCloud,则必须将 security.json 上传到 ZooKeeper。有关保护设置的示例命令和更多信息,请参阅 SolrCloud 集群中的身份验证和授权插件

注意事项

使用基本身份验证插件时,需要注意以下几点。

  • 默认情况下,凭据以纯文本形式发送。建议在启用基本身份验证时使用 SSL 进行通信,如 启用 SSL 部分所述。

  • 拥有security.json写入权限的用户可以修改所有权限和用户权限分配。应特别注意,只向合适的授权用户授予编辑安全性的权限。

  • 当然,您的网络应该安全。即使启用了基本身份验证,您也不应该不必要地将 Solr 暴露给外部世界。

将基本身份验证与其他方案结合使用

当使用其他身份验证方案(例如JWT 身份验证插件)时,您可能仍然希望为少量面向“服务帐户”的客户端应用程序使用基本身份验证。Solr 提供了 MultiAuthPlugin 来支持多种身份验证方案。例如,您可能希望将 Solr 与 OIDC 提供程序集成以用于用户帐户,但也希望使用 Basic 来验证来自 Prometheus 指标导出器的请求。MultiAuthPlugin 使用 Authorization 标头的方案来确定哪个插件应处理每个请求。当在 Kubernetes 上运行 Solr 时,MultiAuthPlugin 非常有用,因为您可以将用户管理和身份验证委托给 OIDC 提供程序以供最终用户使用,还可以使用 Basic 身份验证来保护活动性和就绪性端点,因为您不希望 Kubernetes 在测试探测端点时使用 OIDC。

以下示例说明了如何配置 MultiAuthPlugin 以支持 BasicBearer 方案。

{
  "authentication": {
    "class": "solr.MultiAuthPlugin",
    "schemes": [{
      "scheme": "bearer",
      "blockUnknown": true,
      "class": "solr.JWTAuthPlugin",
      "wellKnownUrl": "https://OIDC_PROVIDER_URL/.well-known/openid-configuration",
      "clientId": "solr",
      "redirectUris": "https://127.0.0.1:8983/solr/",
      "rolesClaim": "groups"
    },{
      "scheme": "basic",
      "blockUnknown": true,
      "class": "solr.BasicAuthPlugin",
      "credentials": {
        "k8s-oper": "PASSWORD SALT & HASH"
      },
      "forwardCredentials": false
    }]
  }
}

对于来自 Solr 管理 UI 的未经身份验证的 AJAX 请求(即,没有 Authorization 标头的请求),MultiAuthPlugin 会将请求转发到 schemes 列表中列出的第一个插件。在上面的示例中,用户需要向 OIDC 提供程序进行身份验证才能登录到管理 UI。

编辑基本身份验证插件配置

身份验证 API 允许修改用户 ID 和密码。该 API 提供了一个端点,其中包含用于设置用户详细信息或删除用户的特定命令。

API 入口点

  • v1:https://127.0.0.1:8983/solr/admin/authentication

  • v2:https://127.0.0.1:8983/api/cluster/security/authentication

此端点不是特定于集合的,因此用户是为整个 Solr 集群创建的。如果需要将用户限制为特定集合,则可以使用授权规则来实现。

添加用户或编辑密码

set-user 命令允许您添加用户并更改其密码。例如,以下定义了两个用户及其密码

  • V1 API

  • V2 API

curl --user solr:SolrRocks https://127.0.0.1:8983/solr/admin/authentication -H 'Content-type:application/json' -d '{"set-user": {"tom":"TomIsCool", "harry":"HarrysSecret"}}'
curl --user solr:SolrRocks https://127.0.0.1:8983/api/cluster/security/authentication -H 'Content-type:application/json' -d '{"set-user": {"tom":"TomIsCool", "harry":"HarrysSecret"}}'

删除用户

delete-user 命令允许您删除用户。无需发送用户密码即可删除用户。在以下示例中,我们要求从系统中删除用户 ID 'tom' 和 'harry'。

  • V1 API

  • V2 API

curl --user solr:SolrRocks https://127.0.0.1:8983/solr/admin/authentication -H 'Content-type:application/json' -d  '{"delete-user": ["tom", "harry"]}'
curl --user solr:SolrRocks https://127.0.0.1:8983/api/cluster/security/authentication -H 'Content-type:application/json' -d  '{"delete-user": ["tom", "harry"]}'

设置属性

设置身份验证插件的属性。目前,基本身份验证插件支持的属性包括 blockUnknownrealmforwardCredentials

  • V1 API

  • V2 API

curl --user solr:SolrRocks https://127.0.0.1:8983/solr/admin/authentication -H 'Content-type:application/json' -d  '{"set-property": {"blockUnknown":false}}'
curl --user solr:SolrRocks https://127.0.0.1:8983/api/cluster/security/authentication -H 'Content-type:application/json' -d  '{"set-property": {"blockUnknown":false}}'

身份验证领域默认为 solr,并显示在 WWW-Authenticate HTTP 标头和管理 UI 登录页面中。要更改领域,请设置 realm 属性

  • V1 API

  • V2 API

curl --user solr:SolrRocks https://127.0.0.1:8983/solr/admin/authentication -H 'Content-type:application/json' -d  '{"set-property": {"realm":"My Solr users"}}'
curl --user solr:SolrRocks https://127.0.0.1:8983/api/cluster/security/authentication -H 'Content-type:application/json' -d  '{"set-property": {"realm":"My Solr users"}}'

使用 MultiAuthPlugin 编辑插件配置

使用 MultiAuthPlugin 时,您需要使用标识 scheme 的单键对象来包装命令数据。例如,Basic 插件的 set-user 命令将是

{
  "set-user": {
    "basic": {"tom":"TomIsCool", "harry":"HarrysSecret"}
  }
}

在使用 MultiAuthPlugin 时,在 Basic 插件上设置属性

{
  "set-property": {
    "basic": {"realm":"My Solr users"}
  }
}

将基本身份验证与 SolrJ 结合使用

有两种主要方法可以将 SolrJ 与受基本身份验证保护的 Solr 服务器一起使用:可以在每个单独的请求上设置权限,或者可以配置底层 http 客户端以将凭据添加到它发送的所有请求中。

每个请求的基本身份验证凭据

在 SolrJ 中设置基本身份验证的最简单方法是在每个请求上使用 setBasicAuthCredentials 方法,如本例所示

SolrRequest req ;//create a new request object
req.setBasicAuthCredentials(userName, password);
solrClient.request(req);

查询示例

QueryRequest req = new QueryRequest(new SolrQuery("*:*"));
req.setBasicAuthCredentials(userName, password);
QueryResponse rsp = req.process(solrClient);

虽然这种方法很简单,但要确保在需要凭据的所有位置都提供凭据通常很不方便。它也不适用于许多不使用 SolrRequest 对象的 SolrClient 方法。

每个客户端的凭据

Http2SolrClient 支持在构建时在客户端级别设置凭据。这将确保使用此特定客户端发出的所有请求都设置了基本身份验证标头。

Http2SolrClient client = new Http2SolrClient.Builder(solrUrl)
        .withBasicAuthCredentials(userName, password).build();
QueryResponse rsp = req.process(client);

CloudHttp2SolrClient 支持接收 Http2SolrClient.Builder 实例以创建其内部客户端,因此要在客户端级别设置凭据,可以使用如下代码

Http2SolrClient.Builder http2ClientBuilder = Http2SolrClient.Builder().withBasicAuthCredentials(userName, password);
CloudHttp2SolrClient client = new CloudHttp2SolrClient.Builder(zkHostList, chroot)
            .withInternalClientBuilder(http2ClientBuilder).build();
QueryResponse rsp = req.process(client);

全局 (JVM) 基本身份验证凭据

或者,用户可以使用 SolrJ 的 PreemptiveBasicAuthClientBuilderFactory 自动将基本身份验证凭据添加到所有请求。要启用此功能,用户应设置以下系统属性 -Dsolr.httpclient.builder.factory=org.apache.solr.client.solrj.impl.PreemptiveBasicAuthClientBuilderFactoryPreemptiveBasicAuthClientBuilderFactory 允许应用程序以两种不同的方式提供凭据

  1. 可以传递 basicauth 系统属性,其中直接包含凭据(例如,-Dbasicauth=username:password)。此选项很简单,但可能会在命令行中公开凭据,具体取决于它们的设置方式。

  2. 可以传递 solr.httpclient.config 系统属性,其中包含保存凭据的属性文件的路径。在此文件中,可以将用户名和密码分别指定为 httpBasicAuthUserhttpBasicAuthPassword

    httpBasicAuthUser=my_username
    httpBasicAuthPassword=secretPassword

将 Solr 控制脚本与基本身份验证结合使用

启用基本身份验证后,对 Solr 控制脚本 (bin/solr) 的所有请求都必须包含用户凭据。为确保这一点,请将以下行添加到 solr.in.shsolr.in.cmd 文件中。

此示例告诉 bin/solr 命令行使用“basic”作为身份验证类型,并传递用户名“solr”和密码“SolrRocks”的凭据

SOLR_AUTH_TYPE="basic"
SOLR_AUTHENTICATION_OPTS="-Dbasicauth=solr:SolrRocks"

或者,SOLR_AUTHENTICATION_OPTS 可以接受文件的路径,如

SOLR_AUTH_TYPE="basic"
SOLR_AUTHENTICATION_OPTS="-Dsolr.httpclient.config=/path/to/solr-9.7.0/server/solr/basicAuth.conf"