◆吴科桦 张艺夕
基于LDAP协议的Solr用户认证设计与实现
◆吴科桦1张艺夕2
(1.南京中兴新软件有限责任公司 江苏 210000;2.南京掌控网络科技有限公司 江苏 210000)
本文针对Solr的用户基本认证方式进行了改进,提出了一种基于LDAP协议的Solr用户认证方案,并给出了设计方案和具体实现。该方案实现了用户认证的统一管理,提高了集群系统的可靠性、安全性和性能。
认证;LDAP;Solr
Solr是一款用Java开发、基于Lucene的高性能全文搜索服务,在Lucene基础上对其进行了扩展,提供了比其更为丰富的查询语言,支持可配置和可扩展并对查询性能进行了优化,同时它提供了一个完善的功能管理界面,是一款非常优秀的全文搜索服务。SolrCloud是Solr提供的分布式高可用部署架构,一个SolrCloud集群可以包含多个Solr服务节点和一套Zookeeper集群。其中Zookeeper集群用于存储SolrCloud集群的元数据信息,Solr客户端可以通过Zookeeper集群连接到Solr服务器集群。
Solr拥有支持用户身份验证和授权的安全框架。这允许验证用户的身份并限制对SolrCloud集群中的资源的访问。在用户认证方面,SolrCloud集群可以支持用户使用BasicAuthPlugin内置插件进行基本身份验证,即简单的用户名和密码认证。
使用基本身份验证,必须先创建一个security.json文件,然后在security.json文件中配置一个authentication部分,其中定义一个用于基本身份验证的“solr.BasicAuthPlugin”插件类,然后在创建文件时预置用户名和密码(例如:sha256(password+salt) hash),security.json文件内容如下所示:
"authentication":{
"blockUnknown": true,
"class":"solr.BasicAuthPlugin",
"credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}
}
或者可以稍后使用基本验证API添加用户名和密码。配置完security.json文件,需要上传到Zookeeper中,完成SolrCloud集群的基本身份认证控制。
从技术上来讲,原生Solr提供的基本身份认证方式,需通过修改并上传security.json配置文件或通过调用API命令来执行用户名与密码的增删改操作,这种操作方式使用烦琐、不便,极易出错,且安全度较低。
此外,当今企业大数据应用集群部署的组件繁多,为了便于统一管理,全网各组件都需要使用同一份用户信息库。而目前原生Solr提供的这种基本身份认证方式是将用户名、密码保存在ZooKeeper的security.json文件中进行统一管理,即Solr自己维护了一个Solr用户管理模块,该模块无法方便地与其他组件共享用户信息库同步数据。
基于以上缺点,本文提出了一种基于LDAP协议的Solr用户认证的设计方案。
LDAP是一款轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP),属于开源集中账号管理架构的实现,支持众多系统版本。LDAP提供并实现目录服务的信息服务,目录服务是一种特殊的数据库系统,对于数据的读取、浏览、搜索有很高的性能。目录服务一般用来包含基于属性的描述性信息并支持精细复杂的过滤功能,对搜索有很好的效果。
OpenLDAP则是一种基于LDAP协议的开源实现,OpenLDAP 服务器本质上是一个为只读访问而优化的非关系型数据库。它主要用作地址簿查询(如email客户端)或对各种服务访问做后台认证以及用户数据权限管控。
因为Openldap具有高效的检索性能,以及支持复杂的过滤功能,所以很多公司和企业都将OpenLDAP作为各自系统统一的用户管理服务器,他们将用户和信息保存在LDAP服务器中,并建立了用户与组的映射关系。
因此本文将原生SolrCloud的用户管理部分基于LDAP协议重新实现,使用OpenLDAP来存储Solr的用户和组信息。
具体设计流程如下:
(1)Solr客户端向Solr服务端进行操作请求;
(2)Solr服务端将请求中的用户名和密码加密发送至LDAP服务端进行验证;
(3)验证通过,则说明该操作的用户合法,用户认证通过;反之,用户不合法,不允许操作继续进行。
同时考虑到LDAP服务器的高可用性,我们设计了两台LDAP服务器进行双主配置,保证了用户数据进行LDAP认证的可靠性。
下面我们具体实现基于LDAP协议的Solr用户认证方案。
(1)搭建LDAP Server双主服务器。
(2)构造基于LDAP协议的Solr用户认证插件LDAPAuthPlugin。
通过研究Solr源码可以得知,所有的用户认证方式都是基于AuthenticationPlugin抽象类来实现的,因此我们可以构造一个基于LDAP协议的Solr用户认证插件LDAPAuthPlugin。
package org.apache.solr.security;
import java.io.IOException;
import java.util.Map;
import javax.servlet.FilterChain;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class LDAPAuthPlugin extends AuthenticationPlugin {
@Override
public void close() throws IOException {
//此处设置断开LDAP服务器的代码
}
@Override
public void init(Map
//此处设置连接LDAP服务器的代码
}
@Override
public boolean doAuthenticate(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws Exception {
//此处获取request请求中的用户名和密码,然后向LDAP服务器请求用户认证。
//LDAP服务器认证通过,则返回true;反之,返回false。
//如LDAP服务器异常,则直接返回false。
return false;
}
}
(3)将基于LDAP协议认证的Solr用户认证插件注册到Solr安全管理文件security.json中。
"authentication":{
"blockUnknown": true,
"class":"solr.LDAPAuthPlugin"
}
(4)配置完security.json文件,需要上传到Zookeeper中,并重启Solr集群所有服务器。
经过以上各个步骤,即可实现基于LDAP协议的Solr用户认证功能,进而实现用户认证的统一管理,以提高集群系统的可靠性、安全性和性能。
[1]Trey Grainger,Timothy Potter.Solr实战.电子工业出版社,2016.