Solr部署:认证和授权插件配置

Solr部署:认证和授权插件配置

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

1
2
3
4
5
6
7
8
9
10
11
{
"authentication" : {
"class": "class.that.implements.authentication"
},
"authorization": {
"class": "class.that.implements.authorization"
},
"auditlogging": {
"class": "class.that.implements.auditlogging"
}
}

/security.json文件需要在Solr实例启动之前就在正确的位置,这样Solr启动时安全插件就已启用。
有关如何执行此操作的信息,请参见下面的《与Solr一起使用security.json》部分。

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

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

1
2
3
4
5
6
7
8
9
10
11
{
"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

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

注意此示例为认证定义了KerberosPlugin
您将希望根据您使用的插件适当修改此部分。

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

1
>bin/solr zk cp ./security.json zk:security.json -z localhost:2181

注意: 如果您在solr.in.sh/solr.in.cmd中定义了ZK_HOST(参见更新Solr包含文件),您可以从上述命令中省略-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的传入请求来帮助保护Solr的端点。
可以通过扩展AuthenticationPlugin类来实现自定义插件。

认证插件由两部分组成:

  1. 服务器端组件,它使用插件中定义的机制(如Kerberos、基本认证或其他)拦截和认证对Solr的传入请求。
  2. 客户端组件,即HttpClientConfigurer的扩展,它使SolrJ客户端能够使用服务器理解的认证机制向安全的Solr实例发出请求。

启用认证插件

/security.json中指定认证插件,如此示例:

1
2
3
4
5
{
"authentication": {
"class": "class.that.implements.authentication",
"other_data" : "..."}
}

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

认证插件也可以通过在启动期间传入-DauthenticationPlugin=<plugin class name>与单节点Solr实例一起使用。

当前可用的认证插件有:

  • 基本认证插件
  • JWT认证插件
  • Kerberos认证插件
  • Cert认证插件
  • Hadoop认证插件

授权

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

启用授权插件

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

1
2
3
4
5
{
"authorization": {
"class": "org.apache.solr.security.MockAuthorizationPlugin",
"other_data" : "..."}
}

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

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

当前可用的授权插件有:

  • 基于规则的授权插件

在管理UI中认证

每当启用认证插件时,管理UI中的所有或某些操作也需要认证。
管理UI是在您浏览器内运行的AngularJS应用程序,被Solr视为任何其他外部客户端。

需要认证时,管理UI将向您显示登录对话框。
管理UI当前支持的认证插件是:

  • 基本认证插件
  • JWT认证插件

如果您选择的插件不受支持,管理UI仍将允许您执行不受限制的操作,而对于受限制的操作,您需要通过发送HTTP请求而不是通过管理UI的图形用户界面与Solr交互。
管理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'启动每个节点。

© 2025 Solr Community of China All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero