基本身份验证插件

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

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

启用基本身份验证

要使用基本身份验证,您必须首先创建一个 security.json 文件。此文件及其存放位置在 配置 security.json 一节中有详细说明。

如果在云模式下运行,可以使用 bin/solr auth 命令行实用程序为新安装启用安全性,请参见:bin/solr auth --help 了解更多详情。

对于基本身份验证,security.json 必须有一个 authentication 块,用于定义用于身份验证的类。创建文件时可以添加用户名和密码(作为 sha256(password+salt) 哈希),或者稍后可以使用下面描述的身份验证 API 添加。

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

{
"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 中。

如果 security.json 文件中未定义 blockUnknown,它将默认为 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 提供程序集成以用于用户帐户,但也可以使用基本身份验证来验证来自 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": "http://localhost:8983/solr/",
      "rolesClaim": "groups"
    },{
      "scheme": "basic",
      "blockUnknown": true,
      "class": "solr.BasicAuthPlugin",
      "credentials": {
        "k8s-oper": "PASSWORD SALT & HASH"
      },
      "forwardCredentials": false
    }]
  }
}

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

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

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

API 入口点

  • v1: http://localhost:8983/solr/admin/authentication

  • v2: http://localhost:8983/api/cluster/security/authentication

此端点与集合无关,因此用户是为整个 Solr 集群创建的。如果需要将用户限制在特定集合中,则可以使用授权规则来完成。

添加用户或编辑密码

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

V1 API

curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H 'Content-type:application/json' -d '{"set-user": {"tom":"TomIsCool", "harry":"HarrysSecret"}}'

V2 API

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

删除用户

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

V1 API

curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H 'Content-type:application/json' -d  '{"delete-user": ["tom", "harry"]}'

V2 API

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

设置属性

为身份验证插件设置属性。基本身份验证插件当前支持的属性为 blockUnknownrealmforwardCredentials

V1 API

curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H 'Content-type:application/json' -d  '{"set-property": {"blockUnknown":false}}'

V2 API

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

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

V1 API

curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H 'Content-type:application/json' -d  '{"set-property": {"realm":"My Solr users"}}'

V2 API

curl --user solr:SolrRocks http://localhost: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 Control 脚本与基本身份验证配合使用

启用基本身份验证后,对 Solr Control 脚本(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.5.0/server/solr/basicAuth.conf"