配置身份验证和授权
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 个部分,每个部分分别用于身份验证、授权和审计日志记录。
{
"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,您应该使用所使用插件的相应 API 来更新它。您可以手动编辑它,但您必须注意删除任何版本数据,以便它可以在所有 ZooKeeper 节点上正确更新。版本数据位于 security.json
文件的末尾,并将显示为字母 “v” 后跟一个数字,例如 {"v":138}
。
配置身份验证
身份验证插件通过对传入请求进行身份验证,有助于保护 Solr 的端点。可以通过扩展 AuthenticationPlugin 类来实现自定义插件。
身份验证插件由两部分组成
-
服务器端组件,它使用插件中定义的机制(例如 Kerberos、基本身份验证或其他机制)拦截和验证传入 Solr 的请求。
-
客户端组件,即
HttpClientConfigurer
的扩展,它使 SolrJ 客户端能够使用服务器理解的身份验证机制向安全的 Solr 实例发出请求。
配置授权
可以通过扩展 AuthorizationPlugin 接口来为 Solr 编写授权插件。
在 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=v1
和 solr.pki.acceptVersions=v1,v2
来启用此功能。启用后,请求将包含一个 SolrAuth
标头,该标头将包含使用发送者的私钥加密的用户主体和时间戳。
如果 SolrAuthV2
标头存在但验证失败,则 Solr 将不会回退到检查 SolrAuth
。只有在不存在最新标头时,才会查阅旧的身份验证标头。
solr.pki.acceptVersion
的未知值将发出警告日志消息,但不会导致错误,以便更顺利地支持未来的协议修订。
超时可以通过名为 pkiauth.ttl
的系统属性进行配置。例如,如果您希望将生存时间增加到 10 秒(10,000 毫秒),请使用属性 '-Dpkiauth.ttl=10000'
启动每个节点。