前言
本文是根據(jù)solr官方文檔翻譯和改編來的,所以你也在官方文檔中看到過,不要驚訝。
安全認(rèn)證種類
solr帶有安全框架,支持用戶認(rèn)證和限制solr資源的使用。solr插件支持三種認(rèn)證:
1)基礎(chǔ)認(rèn)證(Basic authentication)
僅僅支持solrCloud模式。
2)Kerberos認(rèn)證
solrCloud認(rèn)證和獨(dú)立模式。
3)基礎(chǔ)規(guī)則認(rèn)證(rule-based authorization)
僅僅支持solrCloud模式。
在solrCloud模式下,采用在zk中的/security.json文件來支持,在獨(dú)立模式下,通過 -DauthenticationPlugin=<pluginClassName> 定義插件來支持。
security.json內(nèi)容如下,包含兩段。
{
"authentication" : {
"class": "class.that.implements.authentication"
},
"authorization": {
"class": "class.that.implements.authorization"
}
}
根據(jù)配置使用的插件信息,添加其他諸如用戶或規(guī)則信息,這些信息傳遞給插件。
下面是更詳細(xì)的security.json的例子。 在下面的例子中基本認(rèn)證和規(guī)則認(rèn)證插件被啟用,展示如下:
{
"authentication":{
"class":"solr.BasicAuthPlugin",
"credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0=
Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}
},
"authorization":{
"class":"solr.RuleBasedAuthorizationPlugin",
"permissions":[{"name":"security-edit","role":"admin"}]
"user-role":{"solr":"admin"}
}}
上傳到Zookeeper
如果要啟用solr的認(rèn)證,需要先傳security.json 到zookeeper中,實(shí)例如下:
> server/scripts/cloud-scripts/zkcli.sh -zkhost localhost:2181 -cmd put
/security.json
'{"authentication": {"class": "org.apache.solr.security.KerberosPlugin"}}'
注意:因?yàn)閟olr的認(rèn)證信息是傳到zookeepr上的,所以zookeeper最好也要是認(rèn)證的。
認(rèn)證組成
認(rèn)證插件在solr的請求點(diǎn)做安全認(rèn)證,一個(gè)定制插件通過擴(kuò)展AuthenticationPlugin類來實(shí)現(xiàn)。
一個(gè)認(rèn)證插件由兩個(gè)部分組成:
1)服務(wù)器組件,使用插件里面定義的kerberos、基礎(chǔ)規(guī)則或其他的認(rèn)證機(jī)制來解釋和認(rèn)證solr的請求。
2)客戶端組建,比如一個(gè)HttpClientConfigurer,它讓solrJ客戶端可以以一種服務(wù)器端可以理解的安全認(rèn)證方式去訪問solr實(shí)例。
啟用一個(gè)認(rèn)證
通過前面的security.json來指定認(rèn)證:
{
"authentication": {
"class": "class.that.implements.authentication",
"other_data" : "..."}
}
- 這個(gè)json文件中所有的內(nèi)容,都作為map形式傳遞給solr的安全插件。
- 如果是獨(dú)立的solr實(shí)例,可以通過-DauthenticationPlugin=<plugin class name> 在啟動的時(shí)候指定。
基礎(chǔ)認(rèn)證插件
solr可以通過使用基礎(chǔ)認(rèn)證插件來支持基礎(chǔ)的認(rèn)證。
啟用基礎(chǔ)認(rèn)證
為使用基礎(chǔ)認(rèn)證,你首先創(chuàng)建個(gè)security.json文件,然后保存到zookeeper上。
認(rèn)證類為基礎(chǔ)認(rèn)證類,用戶名和密碼也同樣需要添加,用戶名和密碼為sha256的hash。認(rèn)證授權(quán)部分不是基本認(rèn)證相關(guān)的,但是是一個(gè)單獨(dú)的授權(quán)插件設(shè)計(jì)
支持細(xì)粒度用戶訪問控制。例子如下:
{
"authentication":{
"blockUnknown": true,
"class":"solr.BasicAuthPlugin",
"credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0=
Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}
},
"authorization":{
"class":"solr.RuleBasedAuthorizationPlugin",
"permissions":[{"name":"security-edit",
"role":"admin"}],
"user-role":{"solr":"admin"}
}}
通過如下命令上傳到zookeeper上去,如下:
server/scripts/cloud-scripts/zkcli.sh -zkhost localhost:9983 -cmd putfile
/security.json security.json
在文件中幾件事情:
1、基礎(chǔ)認(rèn)證和規(guī)則認(rèn)證都啟用了。
2、一個(gè)用戶叫solr、密碼為SolrRocks已經(jīng)被定義了。
3、“blockUnknown:true”標(biāo)示未認(rèn)證的請求不能通過。
4、admin這個(gè)角色被定義,它有權(quán)編輯認(rèn)證方式。
5、solr永遠(yuǎn)被定義為admin角色。
注意事項(xiàng)
使用基本身份驗(yàn)證插件時(shí)需要記住以下幾點(diǎn)。默認(rèn)情況下,以純文本形式發(fā)送憑據(jù)。建議在基本時(shí)使用SSL進(jìn)行通信。
啟用了身份驗(yàn)證,如啟用SSL的部分所描述的那樣。用戶訪問到security.json寫權(quán)限可以修改所有權(quán)限以及如何分配用戶權(quán)限。應(yīng)特別注意只允許獲得將安全性編輯給合適的用戶。
當(dāng)然,你的網(wǎng)絡(luò)應(yīng)該是安全的。即使啟用了基本身份驗(yàn)證,也不應(yīng)該
不必要暴露Solr外面的世界。
權(quán)限屬性
每個(gè)角色由一個(gè)或多個(gè)權(quán)限組成,這些權(quán)限定義了用戶被允許執(zhí)行的操作。 每個(gè)權(quán)限
由幾個(gè)定義允許的活動的屬性組成。 有一些預(yù)定義的權(quán)限
不能修改。
這些權(quán)限會在security.json中顯示。 第一個(gè)匹配的權(quán)限是
適用于每個(gè)用戶,因此最嚴(yán)格的權(quán)限應(yīng)該位于列表的頂部。 權(quán)限順序可以
使用授權(quán)API的參數(shù)進(jìn)行控制,如下所述。
預(yù)定義的權(quán)限
有幾個(gè)預(yù)先定義的權(quán)限。這些具有固定的默認(rèn)值,不能修改,
并且不能添加新的屬性。要使用這些屬性,只需定義一個(gè)包含此權(quán)限的角色,
然后將用戶分配給該角色。
預(yù)定義的權(quán)限是:
- security-edit::允許此權(quán)限編輯安全配置,即任何更新操作
通過API修改security.json將被允許。 - security-read::允許此權(quán)限讀取安全配置??,即讀取任何操作
通過API的security.json設(shè)置將被允許。 - schema-edit:允許此權(quán)限使用模式API編輯集合的模式。注意
這允許所有集合的架構(gòu)編輯權(quán)限。如果編輯權(quán)限只應(yīng)用于
特定的集合,則需要?jiǎng)?chuàng)建自定義權(quán)限。 - schema-read:允許此權(quán)限使用模式API讀取集合的模式。注意
這允許所有集合的模式讀取權(quán)限。如果讀取權(quán)限只應(yīng)用于
特定的集合,則需要?jiǎng)?chuàng)建自定義權(quán)限。
config-edit:允許此權(quán)限使用配置API Reque來編輯集合的配置
st參數(shù)API和修改configoverlay.json的其他API。請注意,這允許
所有集合的配置編輯權(quán)限。如果編輯權(quán)限只應(yīng)用于特定
集合,需要?jiǎng)?chuàng)建自定義權(quán)限。
core-admin-read:讀取核心管理API上的操作
core-admin-edit:可以改變系統(tǒng)狀態(tài)的核心管理命令。
config-read:允許此權(quán)限使用Config API(請求)讀取集合的配置
est參數(shù)API以及修改configoverlay.json的其他API。請注意,這允許
配置所有集合的讀取權(quán)限。如果讀取權(quán)限只應(yīng)用于特定的
集合,需要?jiǎng)?chuàng)建自定義權(quán)限。
collection-admin-edit:允許此權(quán)限使用集合編輯集合的配置
API。請注意,這允許所有集合的配置編輯權(quán)限。如果只有編輯權(quán)限
應(yīng)用于特定集合,則需要?jiǎng)?chuàng)建自定義權(quán)限。具體來說,
將允許以下集合API的操作:
創(chuàng)建
RELOAD
SPLITSHARD
CREATESHARD
DELETESHARD
CREATEALIAS
DELETEALIAS
刪除
DELETEREPLICA
ADDREPLICA
CLUSTERPROP
遷移
ADDROLE
REMOVEROLE
ADDREPLICAPROP
DELETEREPLICAPROP
BALANCESHARDUNIQUE
REBALANCELEADERS
collection-admin-read:允許此權(quán)限使用集合讀取集合的配置
s API。請注意,這允許所有集合的配置讀取權(quán)限。如果讀取權(quán)限應(yīng)該
只適用于特定集合,需要?jiǎng)?chuàng)建自定義權(quán)限。具體來說,
將允許以下集合API的操作:
LIST
OVERSEERSTATUS
CLUSTERSTATUS
REQUESTSTATUS
更新:允許此權(quán)限對任何集合執(zhí)行任何更新操作。這包括發(fā)送
索引文件(使用更新請求處理程序)。
閱讀:允許此權(quán)限對任何集合執(zhí)行任何讀取操作。這包括查詢使用
搜索處理程序(使用請求處理程序),例如/ select,/ get,/ browse,/ tvrh,/ terms,/ cluste
環(huán),/提升,/導(dǎo)出,/拼寫,/集群和/ sql。
全部:任何請求到Solr。
編輯認(rèn)證插件的配置
一個(gè)認(rèn)證API準(zhǔn)許更改用戶ID和密碼。API提供了設(shè)置用戶信息和刪除用戶的方方法。
API訪問點(diǎn)
admin/authentication
這個(gè)訪問點(diǎn)沒有指定集合,所以對整個(gè)集群都起作用,如果需要限制特定的集合,可以通過認(rèn)證規(guī)則來做。
添加用戶或編輯密碼
set-user命令可以讓你添加用戶或更改他們的密碼。舉個(gè)例子,下面的命令定義了兩個(gè)用戶兩個(gè)密碼
curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H
'Content-type:application/json' -d '{
"set-user": {"tom" : "TomIsCool" ,
"harry":"HarrysSecret"}}'
刪除用戶
刪除用戶命令準(zhǔn)許你刪除一個(gè)用戶,用戶密碼在刪除的時(shí)候不用發(fā)過去。在下面的例子中,我們刪除一個(gè)ID為tom和harry的。
curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H
'Content-type:application/json' -d '{
"delete-user": ["tom","harry"]}'
設(shè)置屬性
更改安全文件里面的屬性定義如:
curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H
'Content-type:application/json' -d '{
"set-property": {"blockUnknown":false}}'
solrJ中支持基礎(chǔ)認(rèn)證
SolrRequest req ;//create a new request object
req.setBasicAuthCredentials(userName, password);
solrClient.request(req);
solr內(nèi)部認(rèn)證
有很多來自Solr節(jié)點(diǎn)本身的要求。例如:要求監(jiān)督節(jié)點(diǎn)、恢復(fù)線程等。這些要求不攜帶任何級別身份驗(yàn)證憑證因?yàn)闆]有用戶發(fā)起這些請求。
這意味著solr本身,使用一種特殊的認(rèn)證機(jī)制,各節(jié)點(diǎn)間solr節(jié)點(diǎn)是一個(gè)超級用戶由其他solr節(jié)點(diǎn)完全信任。
kerberos認(rèn)證插件
如果在你的網(wǎng)絡(luò)環(huán)境中有kerberos認(rèn)證,kerberos插件可以用來認(rèn)證solr集群。這準(zhǔn)許solr使用kerberos principal 和keytab文件來認(rèn)證zookeeper和solr集群。
管理UI和所有客戶端(solrJ)將需要一個(gè)合法的ticket來使用UI和對solr發(fā)送請求。
kerberos認(rèn)證插件僅僅在solrCloud模式下有用。
帶有kerberos認(rèn)證的solr如何工作
當(dāng)設(shè)置solr使用kerberos時(shí)候,一個(gè)在KDC中注冊認(rèn)證的服務(wù)principal 或者kerberos 用戶名的配置是需要的。這個(gè)配置定義了服務(wù)主體的名稱和keytab文件的位置。solr的認(rèn)證模式是用/security.json這個(gè)文件,如果更改這個(gè)文件,需要重啟整個(gè)solr集群。此外認(rèn)證插件可以通過系統(tǒng)啟動參數(shù)制定:
-DauthenticationPlugin=org.apache.solr.security.KerberosPlugin.
這個(gè)參數(shù)可以用在solrClound 或單獨(dú)模式下,在單獨(dú)模式下這是唯一的方式。
服務(wù)主體和keytab文件
kerberos認(rèn)證說明:


流程:
①客戶端瀏覽器向web服務(wù)器發(fā)送http請求。
②服務(wù)器返回401狀態(tài)碼,響應(yīng)頭部加上 WWW-Authenticate:Negotiate。
③用戶通過瀏覽器輸入用戶名向AS請求TGS票證。
④AS生成TGS票證,然后查詢用戶密碼并用此密碼加密TGS票證,返回瀏覽器。
⑤瀏覽器使用用戶密碼解密出TGS票證,并向TGS服務(wù)發(fā)起請求。
⑥TGS服務(wù)生成服務(wù)票證響應(yīng)給瀏覽器。
⑦瀏覽器將服務(wù)票證封裝到SPNEGO token中,并發(fā)送給web服務(wù)器。
⑧服務(wù)器解密出用戶名及服務(wù)票證,將票證發(fā)往TGS服務(wù)驗(yàn)證。
⑨通過驗(yàn)證,開始通信。
每個(gè)solr節(jié)點(diǎn)必須在KDC(Key Distribution Center)中注冊有一個(gè)服務(wù)主體。
kerberos插件利用SPNego 進(jìn)行認(rèn)證,Spnego模式是一種由微軟提出的使用GSS-API接口的認(rèn)證模式,它擴(kuò)展了Kerberos協(xié)議。
以“HTTP/host1@YOUR_DOMAIN.ORG”為一個(gè)服務(wù)主體例子:
- HTTP 表示什么類型的請求被認(rèn)證。HTTP/ 在服務(wù)主體必須是工作在HTTP上的SPNego請求。
- host1 匹配的solr節(jié)點(diǎn)的主機(jī)名字。
- YOUR_DOMAIN.ORG 是組織的kerberos的realm(域)。
不同的solr節(jié)點(diǎn)在相同的主機(jī)上,可能有相同的服務(wù)主體,因?yàn)橹鳈C(jī)名對它們來說是相同的。
和服務(wù)主體在一起的,每個(gè)solr節(jié)點(diǎn)需要一個(gè)包含一個(gè)keytab文件,包含服務(wù)主體需要的認(rèn)證信息。keytab文件包含加密的認(rèn)證來支持從kerberos中獲取kerberos ticket無密碼登陸信息。對于每個(gè)solr節(jié)點(diǎn)來說,keytab文件應(yīng)該保存在安全地方,且不能被集群中的其他用戶共享。
因?yàn)閟olr集群需要內(nèi)部通信,每個(gè)節(jié)點(diǎn)必須可以和其他節(jié)點(diǎn)建立kerberos請求。默認(rèn)情況下,solr使用相同的服務(wù)主體和keytab文件作為“client principal”來進(jìn)行內(nèi)不能通信。你也許想配置特別的不同的principal客戶端,但是這樣做是不建議的。
kerberized Zookeeper
設(shè)置Kerberos SolrCloud集群時(shí),建議為ZooKeeper啟用Kerberos安全性。
在這種設(shè)置中,用于通過ZooKeeper驗(yàn)證請求的客戶端主體也可以用于節(jié)點(diǎn)間通信。 由于Solr使用的Zookeeper客戶端負(fù)責(zé)完成這項(xiàng)工作,因此無需分別續(xù)訂票證授予票證(TGT)。 為此,可以將單個(gè)JAAS配置(應(yīng)用程序名稱為Client)用于Kerberos插件以及Zookeeper客戶端。
有關(guān)在Kerberos模式下啟動ZooKeeper的示例,請參閱下面的ZooKeeper配置部分。
瀏覽器配置
為了讓您的瀏覽器在啟用Kerberos身份驗(yàn)證后訪問Solr管理界面,它必須能夠與Kerberos身份驗(yàn)證器服務(wù)協(xié)商以允許您訪問。 每種瀏覽器都支持這種方式,有些(如Chrome)完全不支持。 如果在啟用Kerberos身份驗(yàn)證后嘗試訪問Solr Admin UI時(shí)看到401錯(cuò)誤,則可能是瀏覽器未正確配置,無法知道如何或在何處協(xié)商身份驗(yàn)證請求。
有關(guān)如何設(shè)置瀏覽器的詳細(xì)信息超出了本文檔的范圍; 請咨詢您的系統(tǒng)管理員以獲取有關(guān)如何配置瀏覽器的詳細(xì)信息。
插件配置
咨詢您的Kerberos管理員!
在嘗試配置Solr以使用Kerberos身份驗(yàn)證之前,請查看下面概述的每個(gè)步驟,并咨詢您的本地Kerberos管理員,以確保您知道每個(gè)參數(shù)的正確值。 小錯(cuò)誤可能會導(dǎo)致Solr無法啟動或無法正常工作,并且非常難以診斷。
Kerberos插件的配置有幾個(gè)部分:
1 創(chuàng)建服務(wù)主體和密鑰表文件
2 ZooKeeper配置
3 創(chuàng)建或更新/security.json
4 定義jaas-client.conf
5 Solr啟動參數(shù)
我們將通過下面的每個(gè)步驟。
使用主機(jī)名
要使用主機(jī)名而不是IP地址,請?jiān)赽in / solr.in.sh中使用SOLR_HOST配置,或在Solr啟動過程中傳遞-Dhost = <主機(jī)名>系統(tǒng)參數(shù)。 本指南使用IP地址。 如果您指定主機(jī)名,請根據(jù)需要將指南中的所有IP地址替換為Solr主機(jī)名。
獲取服務(wù)主體和密鑰文件
在配置Solr之前,請確保您擁有適用于KDC服務(wù)器中每個(gè)Solr主機(jī)和ZooKeeper(如果尚未配置ZooKeeper)的Kerberos服務(wù)主體,并生成keytab文件,如下所示。
這個(gè)例子假定主機(jī)名是192.168.0.107,你的主目錄是/ home / foo /。這個(gè)例子應(yīng)該針對你自己的環(huán)境進(jìn)行修改。
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.
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/108.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服務(wù)器的/tmp/107.keytab位置復(fù)制到/keytabs/107.keytab處的Solr主機(jī)。對每個(gè)Solr節(jié)點(diǎn)重復(fù)此步驟。
您可能需要采取類似的步驟來創(chuàng)建ZooKeeper服務(wù)主體和密鑰表(如果尚未設(shè)置)。在這種情況下,下面的示例顯示了ZooKeeper的一個(gè)不同的服務(wù)主體,因此可以使用zookeeper / host1作為其中一個(gè)節(jié)點(diǎn)的服務(wù)主體來重復(fù)上述操作.
ZooKeeper配置
如果您正在使用已配置為使用Kerberos的ZooKeeper,則可以跳過此處顯示的與ZooKeeper相關(guān)的步驟。
由于ZooKeeper管理SolrCloud集群中節(jié)點(diǎn)之間的通信,因此它還必須能夠與集群中的每個(gè)節(jié)點(diǎn)進(jìn)行身份驗(yàn)證。 配置需要為ZooKeeper設(shè)置一個(gè)服務(wù)主體,定義一個(gè)JAAS配置文件并指示ZooKeeper使用這兩個(gè)項(xiàng)目。
第一步是在ZooKeeper的conf目錄下創(chuàng)建一個(gè)文件java.env并添加以下內(nèi)容,如下例所示:
導(dǎo)出JVMFLAGS =“ - Djava.security.auth.login.config = / etc / zookeeper / conf / jaas-client.conf”
JAAS配置文件應(yīng)該包含以下參數(shù)。 確保根據(jù)需要更改主體和keyTab路徑。 該文件必須位于上述步驟中定義的路徑中,并指定文件名。
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配置文件zoo.cfg中:
authProvider.1= org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000
一旦所有部分都到位,使用以下指向JAAS配置文件的參數(shù)啟動ZooKeeper:
bin / zkServer.sh start -Djava.security.auth.login.config = / etc / zookeeper / conf / jaas-client.conf
創(chuàng)建 security.json
創(chuàng)建security.json文件。
在SolrCloud模式下,您可以將Solr設(shè)置為使用Kerberos插件,方法是在創(chuàng)建ZooKeeper時(shí)將security.json上載到ZooKeeper,如下所示:
server / scripts / cloud-scripts / zkcli.sh -zkhost localhost:2181 -cmd put /security.json'{“authentication”:{“class”:“org.apache.solr.security.KerberosPlugin”}}'
如果您在獨(dú)立模式下使用Solr,則需要?jiǎng)?chuàng)建security.json文件并將其放入您的$ SOLR_HOME目錄中。
有關(guān)如何在Solr中使用/security.json文件的更多詳細(xì)信息,請參見身份驗(yàn)證和授權(quán)插件。
如果您已經(jīng)在ZooKeeper中擁有/security.json文件,請下載該文件,添加或修改身份驗(yàn)證部分并使用Solr中提供的命令行實(shí)用程序?qū)⑵渖陷d回ZooKeeper。
定義JAAS配置文件
JAAS配置文件定義用于身份驗(yàn)證的屬性,例如服務(wù)主體和keytab文件的位置。還可以設(shè)置其他屬性以確保票證緩存和其他功能。
以下示例可以針對您的環(huán)境稍微復(fù)制和修改。文件的位置可以位于服務(wù)器上的任何位置,但啟動Solr時(shí)會引用該文件,因此它必須在文件系統(tǒng)上可讀。 JAAS文件可能包含不同用戶的多個(gè)部分,但每個(gè)部分都必須具有唯一的名稱,以便在每個(gè)應(yīng)用程序中可以唯一地引用它。
在下面的例子中,我們創(chuàng)建了一個(gè)JAAS配置文件,其名稱和路徑為/home/foo/jaas-client.conf。我們將在下一節(jié)定義Solr開始參數(shù)時(shí)使用這個(gè)名稱和路徑。請注意,這里的客戶主體與服務(wù)主體相同。這將用于驗(yàn)證節(jié)點(diǎn)間請求和請求到ZooKeeper。確保使用正確的主體主機(jī)名和keyTab文件路徑。
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參數(shù)一起使用。
我們所關(guān)心的主要屬性是keyTab和主要屬性,但還有其他可能需要用于您的環(huán)境的屬性。
Krb5LoginModule的javadoc(正在使用的類在上面的第二行中被調(diào)用)提供了可用屬性的一個(gè)很好的輪廓,但為了參考,上面例子中使用的那些將在這里解釋:
useKeyTab:這個(gè)布爾屬性定義了我們是否應(yīng)該使用keytab文件(在這種情況下為true)。
keyTab:JAAS配置文件的此部分用于主體的keytab文件的位置和名稱。路徑應(yīng)該用雙引號括起來。
storeKey:這個(gè)布爾屬性允許密鑰存儲在用戶的私人憑證中。
useTicketCache:該布爾屬性允許從票證緩存中獲取票證。
調(diào)試:此布爾屬性將輸出調(diào)試消息以幫助進(jìn)行故障排除。
principal:要使用的服務(wù)主體的名稱。
Solr啟動參數(shù)
在啟動Solr時(shí),需要傳遞以下特定于主機(jī)的參數(shù)。 這些參數(shù)可以通過bin / solr start命令在命令行中傳遞(請參閱Solr控制腳本參考以了解有關(guān)如何傳遞系統(tǒng)參數(shù)的詳細(xì)信息),或在bin / solr.in.sh或bin / solr.in.cmd中定義為 適合您的操作系統(tǒng)。

這是一個(gè)可以添加到bin / solr.in.sh的例子。 確保將此示例更改為使用正確的主機(jī)名和密鑰表文件路徑。
SOLR_AUTH_TYPE="kerberos"
SOLR_AUTHENTICATION_OPTS="-Djava.security.auth.login.config=/home/foo/jaas-client.conf -Dsolr.kerberos.cookie.domain=192.168.0.107 -Dsolr.kerberos.cookie.portaware=true -Dsolr.kerberos.principal=HTTP/192.168.0.107@EXAMPLE.COM -Dsolr.kerberos.keytab=/keytabs/107.keytab"
使用委托令牌
Kerberos插件可以配置為使用委托令牌,允許應(yīng)用程序重復(fù)使用最終用戶或其他應(yīng)用程序的身份驗(yàn)證。
Solr有幾個(gè)用例可能會有所幫助:
使用分布式客戶端(例如MapReduce),其中每個(gè)客戶端可能無法訪問用戶的憑證。
在Kerberos服務(wù)器上加載時(shí)很高。 委托令牌可以減輕負(fù)載,因?yàn)樗鼈冊诘谝淮握埱蠛蟛辉L問服務(wù)器。
如果請求或權(quán)限需要委托給另一個(gè)用戶。
要啟用授權(quán)令牌,必須定義幾個(gè)參數(shù)。 這些參數(shù)可以通過bin / solr start命令在命令行中傳遞(請參閱Solr控制腳本參考以了解有關(guān)如何傳遞系統(tǒng)參數(shù)的詳細(xì)信息),或在bin / solr.in.sh或bin / solr.in.cmd中定義為 適合您的操作系統(tǒng)。

啟動Solr
配置完成后,您可以使用bin / solr腳本啟動Solr,如下面的示例所示,僅適用于SolrCloud模式的用戶。 這個(gè)例子假設(shè)你修改了bin / solr.in.sh或者bin / solr.in.cmd,并帶有正確的值,但是如果你沒有修改,你可以將系統(tǒng)參數(shù)和start命令一起傳遞。 請注意,您還需要根據(jù)您的ZooKeeper節(jié)點(diǎn)的位置自定義-z屬性。
bin/solr -c -z server1:2181,server2:2181,server3:2181/solr
測試配置
1、用你的用戶名做一個(gè)kinit。 例如,kinit user@EXAMPLE.COM。
2、嘗試使用curl訪問Solr。 你應(yīng)該得到一個(gè)成功的回應(yīng)。
curl --negotiate -u:“http://192.168.0.107:8983/solr/”
使用SolrJ和Kerberized Solr
要在SolrJ應(yīng)用程序中使用Kerberos身份驗(yàn)證,在創(chuàng)建SolrClient之前,需要以下兩行:
System.setProperty(“java.security.auth.login.config”,“/home/foo/jaas-client.conf”);
HttpClientUtil.setConfigurer(new Krb5HttpClientConfigurer());
您需要為客戶端指定Kerberos服務(wù)主體,并在上面的JAAS客戶端配置文件中指定相應(yīng)的keytab。 該principal應(yīng)與我們?yōu)镾olr創(chuàng)建的service principal 不同。
下面是一個(gè)例子:
SolrJClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/keytabs/foo.keytab"
storeKey=true
useTicketCache=true
debug=true
principal="solrclient@EXAMPLE.COM";
};
SolrJ委托令牌
SolrJ也支持授權(quán)令牌,方法如下:
可以使用DelegationTokenRequest和DelegationTokenResponse來獲取,取消和更新授權(quán)令牌。
HttpSolrClient.Builder包含一個(gè)withDelegationToken函數(shù),用于創(chuàng)建一個(gè)使用委托令牌進(jìn)行驗(yàn)證的HttpSolrClient。
獲取授權(quán)令牌的示例代碼:
private String getDelegationToken(final String renewer, final String user, HttpSolrClient solrClient) throws Exception {
DelegationTokenRequest.Get get = new DelegationTokenRequest.Get(renewer) {
@Override
public SolrParams getParams() {
ModifiableSolrParams params = new ModifiableSolrParams(super.getParams());
params.set("user", user);
return params;
}
};
DelegationTokenResponse.Get getResponse = get.process(solrClient);
return getResponse.getDelegationToken();
}
創(chuàng)建使用委托令牌的HttpSolrClient:
HttpSolrClient client = new HttpSolrClient.Builder("http://localhost:8983/solr").withDelegationToken(token).build();
創(chuàng)建使用委托令牌的CloudSolrClient:
CloudSolrClient client = new CloudSolrClient.Builder()
.withZkHost("http://localhost:2181")
.withLBHttpSolrClientBuilder(new LBHttpSolrClient.Builder()
.withResponseParser(client.getParser())
.withHttpSolrClientBuilder(
new HttpSolrClient.Builder()
.withKerberosDelegationToken(token)
))
.build();