◆吳科樺 張藝夕
基于LDAP協(xié)議的Solr用戶認(rèn)證設(shè)計與實現(xiàn)
◆吳科樺1張藝夕2
(1.南京中興新軟件有限責(zé)任公司 江蘇 210000;2.南京掌控網(wǎng)絡(luò)科技有限公司 江蘇 210000)
本文針對Solr的用戶基本認(rèn)證方式進(jìn)行了改進(jìn),提出了一種基于LDAP協(xié)議的Solr用戶認(rèn)證方案,并給出了設(shè)計方案和具體實現(xiàn)。該方案實現(xiàn)了用戶認(rèn)證的統(tǒng)一管理,提高了集群系統(tǒng)的可靠性、安全性和性能。
認(rèn)證;LDAP;Solr
Solr是一款用Java開發(fā)、基于Lucene的高性能全文搜索服務(wù),在Lucene基礎(chǔ)上對其進(jìn)行了擴(kuò)展,提供了比其更為豐富的查詢語言,支持可配置和可擴(kuò)展并對查詢性能進(jìn)行了優(yōu)化,同時它提供了一個完善的功能管理界面,是一款非常優(yōu)秀的全文搜索服務(wù)。SolrCloud是Solr提供的分布式高可用部署架構(gòu),一個SolrCloud集群可以包含多個Solr服務(wù)節(jié)點和一套Zookeeper集群。其中Zookeeper集群用于存儲SolrCloud集群的元數(shù)據(jù)信息,Solr客戶端可以通過Zookeeper集群連接到Solr服務(wù)器集群。
Solr擁有支持用戶身份驗證和授權(quán)的安全框架。這允許驗證用戶的身份并限制對SolrCloud集群中的資源的訪問。在用戶認(rèn)證方面,SolrCloud集群可以支持用戶使用BasicAuthPlugin內(nèi)置插件進(jìn)行基本身份驗證,即簡單的用戶名和密碼認(rèn)證。
使用基本身份驗證,必須先創(chuàng)建一個security.json文件,然后在security.json文件中配置一個authentication部分,其中定義一個用于基本身份驗證的“solr.BasicAuthPlugin”插件類,然后在創(chuàng)建文件時預(yù)置用戶名和密碼(例如:sha256(password+salt) hash),security.json文件內(nèi)容如下所示:
"authentication":{
"blockUnknown": true,
"class":"solr.BasicAuthPlugin",
"credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}
}
或者可以稍后使用基本驗證API添加用戶名和密碼。配置完security.json文件,需要上傳到Zookeeper中,完成SolrCloud集群的基本身份認(rèn)證控制。
從技術(shù)上來講,原生Solr提供的基本身份認(rèn)證方式,需通過修改并上傳security.json配置文件或通過調(diào)用API命令來執(zhí)行用戶名與密碼的增刪改操作,這種操作方式使用煩瑣、不便,極易出錯,且安全度較低。
此外,當(dāng)今企業(yè)大數(shù)據(jù)應(yīng)用集群部署的組件繁多,為了便于統(tǒng)一管理,全網(wǎng)各組件都需要使用同一份用戶信息庫。而目前原生Solr提供的這種基本身份認(rèn)證方式是將用戶名、密碼保存在ZooKeeper的security.json文件中進(jìn)行統(tǒng)一管理,即Solr自己維護(hù)了一個Solr用戶管理模塊,該模塊無法方便地與其他組件共享用戶信息庫同步數(shù)據(jù)。
基于以上缺點,本文提出了一種基于LDAP協(xié)議的Solr用戶認(rèn)證的設(shè)計方案。
LDAP是一款輕量級目錄訪問協(xié)議(Lightweight Directory Access Protocol,LDAP),屬于開源集中賬號管理架構(gòu)的實現(xiàn),支持眾多系統(tǒng)版本。LDAP提供并實現(xiàn)目錄服務(wù)的信息服務(wù),目錄服務(wù)是一種特殊的數(shù)據(jù)庫系統(tǒng),對于數(shù)據(jù)的讀取、瀏覽、搜索有很高的性能。目錄服務(wù)一般用來包含基于屬性的描述性信息并支持精細(xì)復(fù)雜的過濾功能,對搜索有很好的效果。
OpenLDAP則是一種基于LDAP協(xié)議的開源實現(xiàn),OpenLDAP 服務(wù)器本質(zhì)上是一個為只讀訪問而優(yōu)化的非關(guān)系型數(shù)據(jù)庫。它主要用作地址簿查詢(如email客戶端)或?qū)Ω鞣N服務(wù)訪問做后臺認(rèn)證以及用戶數(shù)據(jù)權(quán)限管控。
因為Openldap具有高效的檢索性能,以及支持復(fù)雜的過濾功能,所以很多公司和企業(yè)都將OpenLDAP作為各自系統(tǒng)統(tǒng)一的用戶管理服務(wù)器,他們將用戶和信息保存在LDAP服務(wù)器中,并建立了用戶與組的映射關(guān)系。
因此本文將原生SolrCloud的用戶管理部分基于LDAP協(xié)議重新實現(xiàn),使用OpenLDAP來存儲Solr的用戶和組信息。
具體設(shè)計流程如下:
(1)Solr客戶端向Solr服務(wù)端進(jìn)行操作請求;
(2)Solr服務(wù)端將請求中的用戶名和密碼加密發(fā)送至LDAP服務(wù)端進(jìn)行驗證;
(3)驗證通過,則說明該操作的用戶合法,用戶認(rèn)證通過;反之,用戶不合法,不允許操作繼續(xù)進(jìn)行。
同時考慮到LDAP服務(wù)器的高可用性,我們設(shè)計了兩臺LDAP服務(wù)器進(jìn)行雙主配置,保證了用戶數(shù)據(jù)進(jìn)行LDAP認(rèn)證的可靠性。
下面我們具體實現(xiàn)基于LDAP協(xié)議的Solr用戶認(rèn)證方案。
(1)搭建LDAP Server雙主服務(wù)器。
(2)構(gòu)造基于LDAP協(xié)議的Solr用戶認(rèn)證插件LDAPAuthPlugin。
通過研究Solr源碼可以得知,所有的用戶認(rèn)證方式都是基于AuthenticationPlugin抽象類來實現(xiàn)的,因此我們可以構(gòu)造一個基于LDAP協(xié)議的Solr用戶認(rèn)證插件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 {
//此處設(shè)置斷開LDAP服務(wù)器的代碼
}
@Override
public void init(Map
//此處設(shè)置連接LDAP服務(wù)器的代碼
}
@Override
public boolean doAuthenticate(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws Exception {
//此處獲取request請求中的用戶名和密碼,然后向LDAP服務(wù)器請求用戶認(rèn)證。
//LDAP服務(wù)器認(rèn)證通過,則返回true;反之,返回false。
//如LDAP服務(wù)器異常,則直接返回false。
return false;
}
}
(3)將基于LDAP協(xié)議認(rèn)證的Solr用戶認(rèn)證插件注冊到Solr安全管理文件security.json中。
"authentication":{
"blockUnknown": true,
"class":"solr.LDAPAuthPlugin"
}
(4)配置完security.json文件,需要上傳到Zookeeper中,并重啟Solr集群所有服務(wù)器。
經(jīng)過以上各個步驟,即可實現(xiàn)基于LDAP協(xié)議的Solr用戶認(rèn)證功能,進(jìn)而實現(xiàn)用戶認(rèn)證的統(tǒng)一管理,以提高集群系統(tǒng)的可靠性、安全性和性能。
[1]Trey Grainger,Timothy Potter.Solr實戰(zhàn).電子工業(yè)出版社,2016.