Solr部署:Kerberos认证插件配置与企业安全集成指南

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插件配置包含几个部分:

  1. 创建服务主体和keytab文件
  2. ZooKeeper配置
  3. 创建或更新/security.json
  4. 定义jaas-client.conf
  5. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
root@kdc:/# kadmin.local
Authenticating as principal foo/admin@EXAMPLE.COM with password.

# 添加服务主体
kadmin.local: addprinc HTTP/192.168.0.107
WARNING: no policy specified for HTTP/192.168.0.107@EXAMPLE.COM; defaulting to no policy
Enter password for principal "HTTP/192.168.0.107@EXAMPLE.COM":
Re-enter password for principal "HTTP/192.168.0.107@EXAMPLE.COM":
Principal "HTTP/192.168.0.107@EXAMPLE.COM" created.

# 创建keytab文件
kadmin.local: ktadd -k /tmp/107.keytab HTTP/192.168.0.107
Entry for principal HTTP/192.168.0.107 with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/tmp/107.keytab.
Entry for principal HTTP/192.168.0.107 with kvno 2, encryption type arcfour-hmac added to keytab WRFILE:/tmp/107.keytab.
Entry for principal HTTP/192.168.0.107 with kvno 2, encryption type des3-cbc-sha1 added to keytab WRFILE:/tmp/107.keytab.
Entry for principal HTTP/192.168.0.107 with kvno 2, encryption type des-cbc-crc added to keytab WRFILE:/tmp/107.keytab.

kadmin.local: quit

文件部署

将keytab文件从KDC服务器的/tmp/107.keytab位置复制到Solr主机的/keytabs/107.keytab

重要:为每个Solr节点重复此步骤。

ZooKeeper主体

如果尚未设置ZooKeeper服务主体和keytab,可能需要采取类似步骤。在这种情况下,可以使用zookeeper/host1作为其中一个节点的服务主体。

第二步:ZooKeeper配置

跳过条件

如果您使用的ZooKeeper已配置为使用Kerberos,可以跳过此处显示的ZooKeeper相关步骤。

配置要求

ZooKeeper管理SolrCloud集群中节点间的通信,因此也必须能够与集群的每个节点进行身份验证。

配置要求:

  1. 为ZooKeeper设置服务主体
  2. 定义JAAS配置文件
  3. 指示ZooKeeper使用这两项

Java环境配置

在ZooKeeper的conf目录中创建文件java.env并添加以下内容:

1
export JVMFLAGS="-Djava.security.auth.login.config=/etc/zookeeper/conf/jaas-client.conf"

JAAS配置文件

JAAS配置文件应包含以下参数。确保适当更改principalkeyTab路径:

1
2
3
4
5
6
7
8
9
10
Server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/keytabs/zkhost1.keytab"
storeKey=true
doNotPrompt=true
useTicketCache=false
debug=true
principal="zookeeper/host1@EXAMPLE.COM";
};

ZooKeeper配置更新

将以下行添加到ZooKeeper配置文件zoo.cfg

1
2
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000

启动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
2
3
4
5
6
7
8
9
Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/keytabs/107.keytab"
storeKey=true
useTicketCache=true
debug=true
principal="HTTP/192.168.0.107@EXAMPLE.COM";
};

配置说明

第一行:定义部分名称,将与solr.kerberos.jaas.appname参数一起使用。

主要属性

  • useKeyTab:布尔属性,定义是否应使用keytab文件(此处为true
  • keyTab:此JAAS配置文件部分对应的主体的keytab文件位置和名称。路径应用双引号括起来
  • storeKey:布尔属性,允许将密钥存储在用户的私有凭据中
  • useTicketCache:布尔属性,允许从票证缓存获取票证
  • debug:布尔属性,输出调试消息以帮助故障排除
  • principal:要使用的服务主体名称

多节点注意事项

JAAS文件可以包含不同用户的多个部分,但每个部分必须具有唯一名称,以便在每个应用程序中唯一引用。

重要:客户端principal与服务主体相同,用于验证节点间请求和对ZooKeeper的请求。

第五步:Solr启动参数

参数配置方式

启动Solr时,需要传递以下特定于主机的参数。这些参数可以:

  • 使用bin/solr启动命令在命令行传递
  • bin/solr.in.shbin/solr.in.cmd中定义

核心启动参数

solr.kerberos.name.rules
  • 是否必需:可选
  • 默认值DEFAULT
  • 功能:用于将Kerberos主体映射到短名称
  • 示例RULE:[1:$1@$0](.*EXAMPLE.COM)s/@.*//
solr.kerberos.name.rules.mechanism
  • 是否必需:可选
  • 默认值hadoop
  • 功能:将Kerberos主体映射到短名称的机制
  • 选项hadoopmit
  • 是否必需:必需
  • 默认值:无
  • 功能:用于发出cookie,应包含Solr节点的主机名
  • 是否必需:可选
  • 默认值false
  • 功能:控制cookie是否感知端口

实际部署示例

完整启动脚本

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

# 设置Kerberos相关的JVM参数
export SOLR_OPTS="-Djava.security.auth.login.config=/home/foo/jaas-client.conf \
-Dsolr.kerberos.cookie.domain=192.168.0.107 \
-Dsolr.kerberos.cookie.portaware=false \
-Dsolr.kerberos.name.rules=DEFAULT"

# 启动Solr
bin/solr start -c -z localhost:2181

solr.in.sh配置示例

1
2
3
4
5
6
7
8
# Kerberos认证配置
SOLR_OPTS="$SOLR_OPTS -Djava.security.auth.login.config=/home/foo/jaas-client.conf"
SOLR_OPTS="$SOLR_OPTS -Dsolr.kerberos.cookie.domain=192.168.0.107"
SOLR_OPTS="$SOLR_OPTS -Dsolr.kerberos.cookie.portaware=false"
SOLR_OPTS="$SOLR_OPTS -Dsolr.kerberos.name.rules=DEFAULT"

# ZooKeeper连接
ZK_HOST="localhost:2181"

客户端使用和管理

SolrJ客户端

1
2
3
4
5
6
// 使用Kerberos认证的SolrJ客户端配置示例
System.setProperty("java.security.auth.login.config", "/path/to/jaas-client.conf");
System.setProperty("solr.kerberos.jaas.appname", "Client");

SolrClient client = new Http2SolrClient.Builder("http://localhost:8983/solr")
.build();

cURL客户端

使用Kerberos票证进行认证:

1
2
3
4
5
# 获取票证
kinit HTTP/192.168.0.107@EXAMPLE.COM

# 发送请求(使用negotiate认证)
curl --negotiate -u: http://localhost:8983/solr/admin/info/system

管理界面访问

  1. 浏览器配置:确保浏览器支持Kerberos/SPNEGO
  2. 票证获取:在访问前获取有效的Kerberos票证
  3. 域配置:浏览器必须配置为信任Solr域

故障排除

常见问题和解决方案

1. 认证失败

症状:401 Unauthorized错误

可能原因和解决方案

  • 票证过期:使用kinit重新获取票证
  • 主体配置错误:检查JAAS配置中的主体名称
  • Keytab文件问题:验证keytab文件路径和权限

2. 节点间通信失败

症状:SolrCloud节点无法相互通信

解决方案

  • 验证所有节点使用相同的Kerberos配置
  • 检查ZooKeeper的Kerberos配置
  • 确认服务主体包含正确的主机名

3. 浏览器访问问题

症状:管理界面无法访问

解决方案

  • 配置浏览器支持SPNEGO
  • 检查浏览器的安全设置
  • 验证Kerberos票证有效性

调试技巧

启用调试日志

1
2
3
4
# 在JAAS配置中添加debug=true
# 在启动参数中添加Kerberos调试
SOLR_OPTS="$SOLR_OPTS -Dsun.security.krb5.debug=true"
SOLR_OPTS="$SOLR_OPTS -Dsun.security.jgss.debug=true"

验证Kerberos配置

1
2
3
4
5
6
7
8
# 测试keytab文件
kinit -kt /keytabs/107.keytab HTTP/192.168.0.107@EXAMPLE.COM

# 检查票证
klist

# 测试ZooKeeper连接
echo "ls /" | bin/solr zk -z localhost:2181

最佳实践

安全建议

  1. Keytab文件安全

    • 设置适当的文件权限(600)
    • 定期轮换keytab
    • 限制文件系统访问
  2. 网络安全

    • 使用防火墙保护KDC
    • 加密节点间通信
    • 监控认证失败
  3. 监控和审计

    • 启用Kerberos日志
    • 监控票证续订
    • 定期审查访问权限

运维建议

  1. 自动化部署

    • 使用配置管理工具
    • 标准化keytab分发
    • 自动化票证轮换
  2. 高可用性

    • 配置多个KDC
    • 实施故障转移机制
    • 监控KDC健康状态
  3. 性能优化

    • 调整票证缓存设置
    • 优化续订间隔
    • 监控认证性能

总结

Kerberos认证插件为Solr提供了企业级的身份验证解决方案,特别适合已经部署Kerberos基础设施的环境。通过正确配置服务主体、keytab文件和JAAS配置,可以实现安全可靠的Solr集群认证。

在实施过程中,需要特别注意与现有Kerberos基础设施的集成,确保所有组件(Solr节点、ZooKeeper、客户端)都正确配置以支持Kerberos认证。同时,建立完善的监控和故障排除机制对于维护系统的稳定运行至关重要。

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