◆吳科樺 張藝夕
基于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.