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 | { |
/security.json
文件需要在Solr实例启动之前就在正确的位置,这样Solr启动时安全插件就已启用。
有关如何执行此操作的信息,请参见下面的《与Solr一起使用security.json》部分。
根据使用的插件,其他信息将存储在security.json
中,例如用户信息或创建角色和权限的规则。
此信息通过Solr提供的每个插件的API添加,或者在自定义插件的情况下,通过您设计的方法添加。
这是一个更详细的security.json
示例。
在这个示例中,启用了基本认证和基于规则的授权插件,并添加了一些数据:
1 | { |
与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类来实现自定义插件。
认证插件由两部分组成:
- 服务器端组件,它使用插件中定义的机制(如Kerberos、基本认证或其他)拦截和认证对Solr的传入请求。
- 客户端组件,即
HttpClientConfigurer
的扩展,它使SolrJ客户端能够使用服务器理解的认证机制向安全的Solr实例发出请求。
启用认证插件
在/security.json
中指定认证插件,如此示例:
1 | { |
security.json
的authentication
块中的所有内容都将在初始化期间作为映射传递给插件。
认证插件也可以通过在启动期间传入-DauthenticationPlugin=<plugin class name>
与单节点Solr实例一起使用。
当前可用的认证插件有:
- 基本认证插件
- JWT认证插件
- Kerberos认证插件
- Cert认证插件
- Hadoop认证插件
授权
可以通过扩展AuthorizationPlugin接口为Solr编写授权插件。
启用授权插件
插件实现必须在类路径中。
然后可以通过在security.json
中以以下方式指定来初始化插件:
1 | { |
security.json
的authorization
块中的所有内容都将在初始化期间作为映射传递给插件。
重要: 尚不支持重新加载插件,需要重新启动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=v1
和solr.pki.acceptVersions=v1,v2
启用此功能。启用时,请求将包含一个SolrAuth
标头,其中包含使用发送方私钥加密的用户主体和时间戳。
如果SolrAuthV2
标头存在但验证失败,那么Solr将不会回退到检查SolrAuth
。只有当最新标头不存在时,才会查询传统认证标头。
solr.pki.acceptVersion
的未知值将发出警告日志消息,但不会导致错误,以更顺利地支持未来的协议修订。
超时可通过名为pkiauth.ttl
的系统属性配置。
例如,如果您希望将生存时间增加到10秒(10,000毫秒),请使用属性'-Dpkiauth.ttl=10000'
启动每个节点。