配置身份验证和授权

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

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

所有验证、授权和审计日志记录插件都可以与 Solr 配合使用,无论它以集群还是单节点安装运行。所有相关配置(包括用户和权限规则)都存储在名为 security.json 的文件中。使用 SolrCloud 时,此文件必须位于 ZooKeeper 结构的 chroot 中。如果没有给出 chroot,则它必须位于根目录中。在独立模式下运行 Solr(不使用 ZooKeeper)时,此文件必须位于 $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"
  }
}

在 Solr 实例启动之前,/security.json 文件需要位于正确的位置,以便 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"}
}}

将 security.json 与 Solr 配合使用

在 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 Include 文件),则可以从上述命令中省略 -z <zk host string>

每当您使用任何安全插件并将 security.json 存储在 ZooKeeper 中时,我们强烈建议您在 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 块中的所有内容将在初始化期间作为映射传递给插件。

还可以在单节点 Solr 实例中使用身份验证插件,方法是在启动期间传入 -DauthenticationPlugin=<plugin class name>

当前可用的身份验证插件为

基本身份验证插件

Kerberos 身份验证插件

JWT 身份验证插件

证书身份验证插件

Hadoop 身份验证插件

授权

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

启用授权插件

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

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

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

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

当前可用的授权插件有

基于规则的授权插件

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

在管理 UI 中进行身份验证

只要启用身份验证插件,管理 UI 中的所有或某些操作都需要进行身份验证。管理 UI 是在浏览器中运行的 AngularJS 应用程序,Solr 将其视为任何其他外部客户端。

当需要进行身份验证时,管理 UI 会向您显示登录对话框。管理 UI 当前支持的身份验证插件有

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

保护节点间请求

有许多请求来自 Solr 节点本身。例如,从监督者到节点、恢复线程等的请求。我们称之为“节点间”请求。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' 启动每个节点。