solr安全認(rèn)證

前言

本文是根據(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)證說明:


轉(zhuǎn)自:http://blog.csdn.net/wangyangzhizhou/article/details/51163782
SPNego認(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)。

solr參數(shù)

這是一個(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();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 要加“m”說明是MB,否則就是KB了. -Xms:初始值 -Xmx:最大值 -Xmn:最小值 java -Xms8...
    dadong0505閱讀 5,059評論 0 53
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,253評論 6 342
  • nexus 2.xxx安裝 配置代理遠(yuǎn)程倉庫:https://registry.npm.taobao.org/im...
    liurongming閱讀 2,208評論 0 0
  • 一直以來默默關(guān)注著餐廳的進(jìn)度 自己應(yīng)該算是最不管事的股東了 心里相信即使拖延,店也一定會開起來 然后2月份群里部分...
    寧子smile閱讀 448評論 0 0

友情鏈接更多精彩內(nèi)容