配置身份验证和授权

Solr 具有用于支持用户身份验证、授权和审计的安全框架。这允许验证用户的身份并限制对 Solr 集群中资源的访问。

Solr 包含一些开箱即用的插件,还可以使用下面描述的身份验证、授权和审计日志框架开发其他插件。

所有身份验证、授权和审计日志插件都可以与 Solr 一起工作,无论它作为集群还是单节点安装运行。所有相关配置,包括用户和权限规则,都存储在名为 security.json 的文件中。当使用 SolrCloud 时,此文件必须位于 ZooKeeper 结构的 chroot 中。如果没有给出 chroot,则它必须位于根目录中。在独立模式下(没有 ZooKeeper)运行 Solr 时,此文件必须位于 $SOLR_HOME 目录中。当从提取的存档手动运行 Solr 时,这很可能为 server/solr。如果使用服务安装程序脚本,其默认位置将为 /var/solr/data,可以使用提供给服务安装程序的选项进行更改。

配置 security.json

初始化安全插件所需的所有信息都存储在 security.json 文件中。此文件包含 3 个部分,每个部分分别用于身份验证、授权和审计日志记录。

security.json 示例
{
  "authentication" : {
    "class": "class.that.implements.authentication"
  },
  "authorization": {
    "class": "class.that.implements.authorization"
  },
  "auditlogging": {
    "class": "class.that.implements.auditlogging"
  }
}

/security.json 文件需要在 Solr 实例启动之前位于正确的位置,以便 Solr 启动时启用安全插件。请参阅下面的 将 security.json 与 Solr 一起使用 部分,以获取有关如何执行此操作的信息。

根据所使用的插件,其他信息将存储在 security.json 中,例如用户信息或创建角色和权限的规则。这些信息通过 Solr 提供的每个插件的 API 添加,或者,在自定义插件的情况下,通过您设计的方法添加。

这是一个更详细的 security.json 示例。在这个示例中,启用了基本身份验证和基于规则的授权插件,并且添加了一些数据。

{
"authentication":{
   "class":"solr.BasicAuthPlugin",
   "credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}
},
"authorization":{
   "class":"solr.RuleBasedAuthorizationPlugin",
   "permissions":[{"name":"security-edit",
      "role":"admin"}],
   "user-role":{"solr":"admin"}
}}

在 Solr 中使用 security.json

在 SolrCloud 集群中

在配置 Solr 以使用身份验证或授权插件时,您需要将 security.json 文件上传到 ZooKeeper。

创建文件 security.json,内容如下:

{"authentication": {"class": "solr.KerberosPlugin"}}

请注意,此示例定义了用于身份验证的 KerberosPlugin。 您需要根据您使用的插件修改此部分。

然后使用 bin/solr zk 命令上传文件

>bin/solr zk cp ./security.json zk:security.json -z localhost:2181
如果您在 solr.in.sh/solr.in.cmd 中定义了 ZK_HOST(请参阅更新 Solr 包含文件),则可以从上述命令中省略 -z <zk 主机字符串>

每当您使用任何安全插件并在 ZooKeeper 中存储 security.json 时,我们强烈建议您在 ZooKeeper 节点中实施访问控制。有关如何启用此功能的信息,请参阅ZooKeeper 访问控制部分。

一旦 security.json 上传到 ZooKeeper,您应该使用所使用插件的相应 API 来更新它。您可以手动编辑它,但您必须注意删除任何版本数据,以便它可以在所有 ZooKeeper 节点上正确更新。版本数据位于 security.json 文件的末尾,并将显示为字母 “v” 后跟一个数字,例如 {"v":138}

在用户管理的集群或单节点安装中

在用户管理的集群或单节点安装中运行 Solr 时,您需要创建 security.json 文件并将其放在安装的 $SOLR_HOME 目录中(这与您放置 solr.xml 的位置相同,通常为 server/solr)。

对于用户管理的集群,您需要在集群的每个节点上放置 security.json

您可以使用身份验证和授权 API,但在用户管理的集群中,您需要对每个节点分别进行相同的 API 请求。如果您愿意,也可以手动编辑 security.json

配置身份验证

身份验证插件通过对传入请求进行身份验证,有助于保护 Solr 的端点。可以通过扩展 AuthenticationPlugin 类来实现自定义插件。

身份验证插件由两部分组成

  1. 服务器端组件,它使用插件中定义的机制(例如 Kerberos、基本身份验证或其他机制)拦截和验证传入 Solr 的请求。

  2. 客户端组件,即 HttpClientConfigurer 的扩展,它使 SolrJ 客户端能够使用服务器理解的身份验证机制向安全的 Solr 实例发出请求。

启用身份验证插件

/security.json 中指定身份验证插件,如下例所示:

{
  "authentication": {
    "class": "class.that.implements.authentication",
    "other_data" : "..."}
}

security.jsonauthentication 块中的所有内容将在初始化期间作为映射传递给插件。

也可以在启动期间传入 -DauthenticationPlugin=<plugin 类名>,将身份验证插件与单节点 Solr 实例一起使用。

当前可用的身份验证插件有:

基本身份验证插件

Kerberos 身份验证插件

JWT 身份验证插件

证书身份验证插件

Hadoop 身份验证插件

配置授权

可以通过扩展 AuthorizationPlugin 接口来为 Solr 编写授权插件。

启用授权插件

插件实现必须在类路径中。然后可以通过在 security.json 中以以下方式指定插件来初始化插件:

{
  "authorization": {
    "class": "org.apache.solr.security.MockAuthorizationPlugin",
    "other_data" : "..."}
}

security.jsonauthorization 块中的所有内容将在初始化期间作为映射传递给插件。

尚不支持重新加载插件,并且需要重新启动 Solr 安装(这意味着,应该重新启动 JVM,而不仅仅是重新加载核心)。

当前可用的授权插件有:

基于规则的授权插件

外部角色基于规则的授权插件

在 Admin UI 中进行身份验证

启用身份验证插件后,Admin UI 中的所有或部分操作也需要身份验证。Admin UI 是一个在您的浏览器中运行的 AngularJS 应用程序,并且被 Solr 视为任何其他外部客户端。

当需要身份验证时,Admin UI 将向您呈现一个登录对话框。Admin UI 当前支持的身份验证插件有:

如果您选择的插件不受支持,Admin UI 仍然允许您执行不受限制的操作,而对于受限制的操作,您需要通过发送 HTTP 请求而不是通过 Admin UI 的图形用户界面与 Solr 交互。Admin UI 支持的所有操作都可以通过 Solr 的 API 执行。

保护节点间请求

有很多请求源自 Solr 节点本身。例如,来自 overseer 的节点请求、恢复线程等等。我们称这些请求为“节点间”请求。Solr 具有内置的 PKIAuthenticationPlugin(如下所述),始终可用于保护节点间流量。

每个身份验证插件也可以自行决定保护节点间请求。它们可以通过所谓的 HttpClientBuilder 机制来实现这一点,或者它们可以选择在每个请求的基础上通过覆盖基类中的 interceptInternodeRequest() 方法来决定是否委派给 PKI,在该方法中可以设置任何 HTTP 标头。

PKIAuthenticationPlugin

PKIAuthenticationPlugin 提供了一种内置的身份验证机制,其中每个 Solr 节点都是超级用户,并且通过使用公钥基础设施 (PKI) 完全受到其他 Solr 节点的信任。每个身份验证插件可以选择将所有或部分节点间流量委派给 PKI 插件。

目前,Solr 中有两种版本的 PKI 身份验证协议可用。对于每个传出请求,PKIAuthenticationPlugin 会添加一个特殊标头,其中包含请求时间戳和用户主体。当节点收到带有此特殊标头的请求时,它将使用相应源节点的公钥来验证消息。仅尝试对来自 ZooKeeper 中注册的其他 Solr 节点的传入流量进行消息验证。如果请求通过 PKI 验证,并且时间戳早于 5 秒,则该请求将被信任。

注意:由于 PKI 身份验证插件依赖于相对较短的时间戳过期来验证请求,因此集群中各个节点上的时钟必须同步。

协议版本 2 是默认版本。在此版本中,SolrAuthV2 标头包含:源节点名称、用户主体、请求时间戳和 base64 编码的 RSA 签名。所有节点都将首先尝试验证此标头。

为了支持从旧版本进行滚动重启,可以将 Solr 配置为使用协议 v1 接受和验证 PKI 身份验证。可以通过设置系统属性 solr.pki.sendVersion=v1solr.pki.acceptVersions=v1,v2 来启用此功能。启用后,请求将包含一个 SolrAuth 标头,该标头将包含使用发送者的私钥加密的用户主体和时间戳。

如果 SolrAuthV2 标头存在但验证失败,则 Solr 将不会回退到检查 SolrAuth。只有在不存在最新标头时,才会查阅旧的身份验证标头。

solr.pki.acceptVersion 的未知值将发出警告日志消息,但不会导致错误,以便更顺利地支持未来的协议修订。

超时可以通过名为 pkiauth.ttl 的系统属性进行配置。例如,如果您希望将生存时间增加到 10 秒(10,000 毫秒),请使用属性 '-Dpkiauth.ttl=10000' 启动每个节点。