Solr部署:Kerberos认证插件配置与企业安全集成指南
概述
如果您正在使用Kerberos来保护网络环境,Kerberos认证插件可用于保护Solr集群。该插件允许Solr使用Kerberos服务主体和keytab文件来验证ZooKeeper身份以及Solr集群节点之间的通信。
管理界面用户和所有客户端(如SolrJ)在使用界面或向Solr发送请求之前,也需要拥有有效的票证。
支持范围
Kerberos认证支持以下安装类型:
- SolrCloud集群
- 用户管理的分布式部署
- 单节点安装
与Hadoop集成的特殊说明
如果您正在将Solr与受Kerberos保护的Hadoop集群一起使用,并且打算将Solr索引存储在HDFS中,除了本页说明外,还需要参考”Running Solr on HDFS”部分的额外配置步骤。
重要区别:
- 本页说明适用于Solr本身需要Kerberos保护的场景
- 如果仅需要在Kerberos化的HDFS系统中存储索引,请参考HDFS专门文档
Solr与Kerberos的工作原理
基本概念
设置Solr使用Kerberos时,会配置Solr使用服务主体(Kerberos用户名),该主体在密钥分发中心(KDC)注册以验证请求。配置定义了服务主体名称和包含凭据的keytab文件位置。
配置存储
与所有认证插件一样,Kerberos认证配置存储在security.json
文件中。
服务主体和Keytab文件
服务主体结构
每个Solr节点必须在密钥分发中心(KDC)注册一个服务主体。Kerberos插件使用SPNego协商认证。
服务主体示例:HTTP/host1@YOUR-DOMAIN.ORG
组成部分解释:
HTTP
:表示此服务主体将用于验证的请求类型。**必须使用HTTP/**前缀以支持SPNego与Solr的HTTP请求协作host1
:托管Solr节点的机器主机名YOUR-DOMAIN.ORG
:组织范围的Kerberos域
主体共享规则
同一主机上的多个Solr节点可以使用相同的服务主体,因为主机名是共同的。
Keytab文件要求
每个Solr节点需要一个keytab文件,该文件应包含所用服务主体的凭据。
Keytab文件特点:
- 包含加密凭据以支持无密码登录
- 在从KDC获取Kerberos票证时使用
- 应保存在安全位置
- 不应与集群用户共享
节点间通信
Solr集群需要节点间通信,每个节点都必须能够向其他节点发出启用Kerberos的请求。
默认配置:Solr使用相同的服务主体和keytab作为节点间通信的”客户端主体”
高级配置:可以配置独立的客户端主体,但不推荐且本指南未涵盖
Kerberos化的ZooKeeper
推荐配置
设置Kerberos化的SolrCloud集群时,强烈建议也为ZooKeeper启用Kerberos安全。
统一配置优势
在此设置中,用于ZooKeeper身份验证的客户端主体也可用于节点间通信:
- 好处:无需单独续订票证授予票证(TGT)
- 原因:Solr使用的ZooKeeper客户端负责处理续订
- 实现:单个JAAS配置(应用名为Client)可同时用于Kerberos插件和ZooKeeper客户端
浏览器配置
管理界面访问
启用Kerberos认证后,浏览器必须能够与Kerberos认证器服务协商以允许访问Solr管理界面。
浏览器支持差异
- 每个浏览器支持方式不同
- 某些浏览器(如Chrome)完全不支持
- 配置不当会导致401错误
配置要求
如果在启用Kerberos认证后看到401错误,可能是浏览器未正确配置以知道如何或在何处协商认证请求。
注意:浏览器配置详情超出本文档范围,请联系Kerberos系统管理员获取配置细节。
Kerberos认证配置
配置前的重要警告
咨询管理员:在尝试配置Solr使用Kerberos认证之前,请与本地Kerberos管理员审查每个步骤并就每个细节进行咨询,确保了解每个参数的正确值。小错误可能导致Solr无法启动或正常运行,且很难诊断。
配置步骤概览
Kerberos插件配置包含几个部分:
- 创建服务主体和keytab文件
- ZooKeeper配置
- 创建或更新
/security.json
- 定义
jaas-client.conf
- Solr启动参数
主机名使用说明
要使用主机名而不是IP地址,请在bin/solr.in.sh
中使用SOLR_HOST
配置,或在Solr启动时传递-Dhost=<hostname>
系统参数。
本指南使用IP地址。如果指定主机名,请将指南中的所有IP地址适当替换为Solr主机名。
详细配置步骤
第一步:获取服务主体和Keytab
在配置Solr之前,确保在KDC服务器中为每个Solr主机和ZooKeeper(如果ZooKeeper尚未配置)提供Kerberos服务主体,并生成keytab文件。
示例配置过程
假设主机名为192.168.0.107
,主目录为/home/foo/
:
1 | root@kdc:/# kadmin.local |
文件部署
将keytab文件从KDC服务器的/tmp/107.keytab
位置复制到Solr主机的/keytabs/107.keytab
。
重要:为每个Solr节点重复此步骤。
ZooKeeper主体
如果尚未设置ZooKeeper服务主体和keytab,可能需要采取类似步骤。在这种情况下,可以使用zookeeper/host1
作为其中一个节点的服务主体。
第二步:ZooKeeper配置
跳过条件
如果您使用的ZooKeeper已配置为使用Kerberos,可以跳过此处显示的ZooKeeper相关步骤。
配置要求
ZooKeeper管理SolrCloud集群中节点间的通信,因此也必须能够与集群的每个节点进行身份验证。
配置要求:
- 为ZooKeeper设置服务主体
- 定义JAAS配置文件
- 指示ZooKeeper使用这两项
Java环境配置
在ZooKeeper的conf
目录中创建文件java.env
并添加以下内容:
1 | export JVMFLAGS="-Djava.security.auth.login.config=/etc/zookeeper/conf/jaas-client.conf" |
JAAS配置文件
JAAS配置文件应包含以下参数。确保适当更改principal
和keyTab
路径:
1 | Server { |
ZooKeeper配置更新
将以下行添加到ZooKeeper配置文件zoo.cfg
:
1 | authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider |
启动ZooKeeper
所有部分就绪后,使用以下参数启动ZooKeeper:
1 | $ bin/zkServer.sh start -Djava.security.auth.login.config=/etc/zookeeper/conf/jaas-client.conf |
第三步:创建security.json
基本配置
创建包含以下内容的security.json
文件:
1 | {"authentication": {"class": "solr.KerberosPlugin"}} |
上传到ZooKeeper
使用bin/solr zk
命令上传文件:
1 | $ bin/solr zk cp ./security.json zk:security.json -z localhost:2181 |
单节点安装
如果使用单节点Solr安装,需要创建security.json
文件并将其放在$SOLR_HOME
目录中。
现有配置处理
重要:如果ZooKeeper中已有/security.json
文件,请下载文件,添加或修改authentication部分,然后使用Solr中可用的ZooKeeper实用工具将其重新上传到ZooKeeper。
第四步:定义JAAS配置文件
配置文件用途
JAAS配置文件定义用于身份验证的属性,如服务主体和keytab文件位置。还可以设置其他属性以确保票证缓存和其他功能。
配置文件示例
以下示例可以复制并为您的环境稍作修改。文件位置可以在服务器上的任何位置,但启动Solr时会引用它,因此必须在文件系统上可读。
示例路径:/home/foo/jaas-client.conf
1 | Client { |
配置说明
第一行:定义部分名称,将与solr.kerberos.jaas.appname
参数一起使用。
主要属性:
useKeyTab
:布尔属性,定义是否应使用keytab文件(此处为true
)keyTab
:此JAAS配置文件部分对应的主体的keytab文件位置和名称。路径应用双引号括起来storeKey
:布尔属性,允许将密钥存储在用户的私有凭据中useTicketCache
:布尔属性,允许从票证缓存获取票证debug
:布尔属性,输出调试消息以帮助故障排除principal
:要使用的服务主体名称
多节点注意事项
JAAS文件可以包含不同用户的多个部分,但每个部分必须具有唯一名称,以便在每个应用程序中唯一引用。
重要:客户端principal
与服务主体相同,用于验证节点间请求和对ZooKeeper的请求。
第五步:Solr启动参数
参数配置方式
启动Solr时,需要传递以下特定于主机的参数。这些参数可以:
- 使用
bin/solr
启动命令在命令行传递 - 在
bin/solr.in.sh
或bin/solr.in.cmd
中定义
核心启动参数
solr.kerberos.name.rules
- 是否必需:可选
- 默认值:
DEFAULT
- 功能:用于将Kerberos主体映射到短名称
- 示例:
RULE:[1:$1@$0](.*EXAMPLE.COM)s/@.*//
solr.kerberos.name.rules.mechanism
- 是否必需:可选
- 默认值:
hadoop
- 功能:将Kerberos主体映射到短名称的机制
- 选项:
hadoop
或mit
solr.kerberos.cookie.domain
- 是否必需:必需
- 默认值:无
- 功能:用于发出cookie,应包含Solr节点的主机名
solr.kerberos.cookie.portaware
- 是否必需:可选
- 默认值:
false
- 功能:控制cookie是否感知端口
实际部署示例
完整启动脚本
1 |
|
solr.in.sh配置示例
1 | # Kerberos认证配置 |
客户端使用和管理
SolrJ客户端
1 | // 使用Kerberos认证的SolrJ客户端配置示例 |
cURL客户端
使用Kerberos票证进行认证:
1 | # 获取票证 |
管理界面访问
- 浏览器配置:确保浏览器支持Kerberos/SPNEGO
- 票证获取:在访问前获取有效的Kerberos票证
- 域配置:浏览器必须配置为信任Solr域
故障排除
常见问题和解决方案
1. 认证失败
症状:401 Unauthorized错误
可能原因和解决方案:
- 票证过期:使用
kinit
重新获取票证 - 主体配置错误:检查JAAS配置中的主体名称
- Keytab文件问题:验证keytab文件路径和权限
2. 节点间通信失败
症状:SolrCloud节点无法相互通信
解决方案:
- 验证所有节点使用相同的Kerberos配置
- 检查ZooKeeper的Kerberos配置
- 确认服务主体包含正确的主机名
3. 浏览器访问问题
症状:管理界面无法访问
解决方案:
- 配置浏览器支持SPNEGO
- 检查浏览器的安全设置
- 验证Kerberos票证有效性
调试技巧
启用调试日志
1 | # 在JAAS配置中添加debug=true |
验证Kerberos配置
1 | # 测试keytab文件 |
最佳实践
安全建议
Keytab文件安全:
- 设置适当的文件权限(600)
- 定期轮换keytab
- 限制文件系统访问
网络安全:
- 使用防火墙保护KDC
- 加密节点间通信
- 监控认证失败
监控和审计:
- 启用Kerberos日志
- 监控票证续订
- 定期审查访问权限
运维建议
自动化部署:
- 使用配置管理工具
- 标准化keytab分发
- 自动化票证轮换
高可用性:
- 配置多个KDC
- 实施故障转移机制
- 监控KDC健康状态
性能优化:
- 调整票证缓存设置
- 优化续订间隔
- 监控认证性能
总结
Kerberos认证插件为Solr提供了企业级的身份验证解决方案,特别适合已经部署Kerberos基础设施的环境。通过正确配置服务主体、keytab文件和JAAS配置,可以实现安全可靠的Solr集群认证。
在实施过程中,需要特别注意与现有Kerberos基础设施的集成,确保所有组件(Solr节点、ZooKeeper、客户端)都正确配置以支持Kerberos认证。同时,建立完善的监控和故障排除机制对于维护系统的稳定运行至关重要。