設定驗證與授權
Solr 具有安全性框架,可支援使用者驗證、授權和稽核。這允許驗證使用者身分,並限制對 Solr 叢集中資源的存取。
Solr 包含一些現成的外掛程式,而且可以使用以下所述的驗證、授權和稽核記錄框架來開發其他外掛程式。
所有驗證、授權和稽核記錄外掛程式都可以與 Solr 搭配使用,無論它是在叢集還是單節點安裝中執行。所有相關設定,包括使用者和權限規則,都儲存在名為 security.json
的檔案中。當使用 SolrCloud 時,此檔案必須位於 ZooKeeper 結構的 chroot 中。如果未提供 chroot,則必須位於根目錄。當在獨立模式下執行 Solr (沒有 ZooKeeper) 時,此檔案必須位於 $SOLR_HOME
目錄中。當從解壓縮的封存手動執行 Solr 時,這很可能是 server/solr
。如果使用服務安裝程式指令碼,其預設位置將是 /var/solr/data
,可以使用服務安裝程式提供的選項進行變更。
設定 security.json
初始化安全性外掛程式所需的所有資訊都儲存在 security.json
檔案中。此檔案包含 3 個部分,分別用於驗證、授權和稽核記錄。
{
"authentication" : {
"class": "class.that.implements.authentication"
},
"authorization": {
"class": "class.that.implements.authorization"
},
"auditlogging": {
"class": "class.that.implements.auditlogging"
}
}
/security.json
檔案需要在 Solr 執行個體啟動之前位於正確的位置,以便 Solr 在啟用安全性外掛程式的情況下啟動。請參閱以下在 Solr 中使用 security.json一節,以取得如何執行此操作的資訊。
根據使用的外掛程式,其他資訊將儲存在 security.json
中,例如使用者資訊或建立角色和權限的規則。此資訊會透過 Solr 提供的每個外掛程式的 API 或在自訂外掛程式的情況下,透過您設計的方法來新增。
以下是更詳細的 security.json
範例。在此範例中,已啟用基本驗證和以規則為基礎的授權外掛程式,並且新增了一些資料
{
"authentication":{
"class":"solr.BasicAuthPlugin",
"credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}
},
"authorization":{
"class":"solr.RuleBasedAuthorizationPlugin",
"permissions":[{"name":"security-edit",
"role":"admin"}],
"user-role":{"solr":"admin"}
}}
在 Solr 中使用 security.json
在 SolrCloud 叢集中
在設定 Solr 使用驗證或授權外掛程式時,您需要將 security.json
檔案上傳到 ZooKeeper。
使用以下內容建立檔案 security.json
{"authentication": {"class": "solr.KerberosPlugin"}}
請注意,此範例定義了用於驗證的 KerberosPlugin
。您會想要根據您使用的外掛程式來修改此部分。
然後使用 bin/solr zk
命令上傳檔案
>bin/solr zk cp ./security.json zk:security.json -z localhost:2181
如果您在 solr.in.sh /solr.in.cmd 中定義了 ZK_HOST (請參閱 更新 Solr 包含檔案),您可以從上述命令中省略 -z <zk host string> 。 |
每當您使用任何安全外掛程式並將 |
一旦 security.json
上傳到 ZooKeeper 後,您應該使用您正在使用的外掛程式的適當 API 來更新它。您可以手動編輯它,但您必須注意移除任何版本資料,以便在所有 ZooKeeper 節點中正確更新。版本資料位於 security.json
檔案的末尾,會顯示為字母「v」後跟一個數字,例如 {"v":138}
。
設定身份驗證
身份驗證外掛程式透過驗證傳入的請求,有助於保護 Solr 的端點。可以透過擴展 AuthenticationPlugin 類別來實作自訂外掛程式。
身份驗證外掛程式包含兩個部分
-
伺服器端元件,它使用外掛程式中定義的機制(例如 Kerberos、基本驗證或其他機制)攔截並驗證傳入 Solr 的請求。
-
用戶端元件,即
HttpClientConfigurer
的擴展,它使 SolrJ 用戶端能夠使用伺服器理解的身份驗證機制向安全的 Solr 實例發出請求。
啟用身份驗證外掛程式
在 /security.json
中指定身份驗證外掛程式,如以下範例所示
{
"authentication": {
"class": "class.that.implements.authentication",
"other_data" : "..."}
}
security.json
的 authentication
區塊中的所有內容將在初始化期間作為映射傳遞給外掛程式。
也可以透過在啟動期間傳遞 -DauthenticationPlugin=<plugin class name>
來將身份驗證外掛程式與單節點 Solr 實例一起使用。
目前可用的身份驗證外掛程式為
設定授權
可以透過擴展 AuthorizationPlugin 介面來為 Solr 編寫授權外掛程式。
在管理 UI 中進行驗證
每當啟用身份驗證外掛程式時,管理 UI 中所有或某些操作也需要進行身份驗證。管理 UI 是一個在您的瀏覽器中執行的 AngularJS 應用程式,Solr 會將其視為任何其他外部用戶端。
當需要進行身份驗證時,管理 UI 將向您顯示登入對話方塊。管理 UI 目前支援的身份驗證外掛程式為
如果您的首選外掛程式不受支援,管理 UI 仍然會讓您執行不受限制的操作,而對於受限制的操作,您需要透過傳送 HTTP 請求而不是透過管理 UI 的圖形使用者介面與 Solr 互動。管理 UI 支援的所有操作都可以透過 Solr 的 API 執行。
保護節點間請求
有很多請求起源於 Solr 節點本身。例如,來自監督者到節點、恢復執行緒等的請求。我們將這些稱為「節點間」請求。Solr 有一個內建的 PKIAuthenticationPlugin
(如下所述),它始終可用於保護節點間流量的安全。
每個身份驗證外掛程式也可能自行決定保護節點間請求。他們可以透過所謂的 HttpClientBuilder
機制來執行此操作,或者他們可以選擇根據每個請求決定是否委派給 PKI,方法是覆寫基類中的 interceptInternodeRequest()
方法,其中可以設定任何 HTTP 標頭。
PKIAuthenticationPlugin
PKIAuthenticationPlugin
提供了一個內建的身份驗證機制,其中每個 Solr 節點都是超級使用者,並且透過使用公鑰基礎設施 (PKI) 完全受其他 Solr 節點信任。每個身份驗證外掛程式都可以選擇將所有或部分節點間流量委派給 PKI 外掛程式。
目前 Solr 中有兩個版本的 PKI 身份驗證協定可用。對於每個傳出的請求,PKIAuthenticationPlugin
都會新增一個特殊標頭,其中包含請求時間戳記和使用者主體。當節點收到帶有此特殊標頭的請求時,它將使用相應來源節點的公鑰驗證訊息。僅針對來自 ZooKeeper 中註冊的其他 Solr 節點的傳入流量嘗試訊息驗證。如果請求通過 PKI 驗證並且時間戳記小於 5 秒,則該請求將被信任。
注意:由於 PKI 身份驗證外掛程式依賴於相對較短的時間戳記過期時間來驗證請求,因此叢集中不同節點上的時鐘必須同步。 |
協定版本 2 是預設版本。在此版本中,SolrAuthV2
標頭包含:來源節點名稱、使用者主體、請求時間戳記以及 base64 編碼的 RSA 簽名。所有節點都會先嘗試驗證此標頭。
為了支援從舊版本進行滾動重新啟動,可以將 Solr 設定為接受並驗證使用協定 v1 的 PKI 身份驗證。這可以透過設定系統屬性 solr.pki.sendVersion=v1
和 solr.pki.acceptVersions=v1,v2
來啟用。啟用後,請求將包含一個 SolrAuth
標頭,其中將包含使用傳送者的私鑰加密的使用者主體和時間戳記。
如果 SolrAuthV2
標頭存在但驗證失敗,則 Solr 不會回退檢查 SolrAuth
。只有在最新的標頭不存在時,才會諮詢舊版身份驗證標頭。
solr.pki.acceptVersion
的未知值將發出警告日誌訊息,但不會導致錯誤,以便更順利地支援未來的協定修訂。
逾時可以透過名為 pkiauth.ttl
的系統屬性設定。例如,如果您希望將存活時間增加到 10 秒(10,000 毫秒),請使用屬性 '-Dpkiauth.ttl=10000'
啟動每個節點。