基本驗證外掛程式

Solr 可以透過使用 BasicAuthPlugin 來支援使用者的基本驗證。

此外掛程式僅提供使用者驗證。若要控制使用者權限,您可能需要設定授權外掛程式,如 基於規則的授權外掛程式 一節所述。

啟用基本驗證

若要使用基本驗證,您必須先建立 security.json 檔案。此檔案以及放置位置在 設定 security.json 一節中有詳細說明。

如果在雲端模式下執行,您可以使用 bin/solr auth 命令列公用程式來為新的安裝啟用安全性,請參閱:bin/solr auth --help 以取得更多詳細資訊。

對於基本驗證,security.json 必須具有 authentication 區塊,其中定義用於驗證的類別。使用者名稱和密碼(格式:base64(sha256(sha256(salt+password))) base64(salt))可以在建立檔案時新增,也可以稍後使用以下所述的驗證 API 新增。

以下顯示一個 security.json 範例,其中包含 authenticationauthorization 區塊,以展示驗證和授權外掛程式如何協同運作

{
"authentication":{ (1)
   "blockUnknown": true, (2)
   "class":"solr.BasicAuthPlugin",
   "credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}, (3)
   "realm":"My Solr users", (4)
   "forwardCredentials": false (5)
},
"authorization":{
   "class":"solr.RuleBasedAuthorizationPlugin",
   "permissions":[{"name":"security-edit",
      "role":"admin"}],
   "user-role":{"solr":"admin"}
}}

此範例中定義了數個選項

1 第一個區塊定義要使用的驗證外掛程式及其參數。
2 參數 "blockUnknown":true 表示不允許未經身份驗證的請求通過。
3 已定義一個名為 'solr' 的使用者,其密碼為 'SolrRocks',採用上述詳細說明的編碼格式。
4 我們會覆寫 realm 屬性,以在登入提示時顯示其他文字。
5 參數 "forwardCredentials":false 表示我們讓 Solr 的 PKI 驗證處理分散式請求,而不是轉發基本驗證標頭。

將您的設定儲存到名為 security.json 的本機檔案。如果您在單一節點安裝中使用 Solr,則應將此檔案放在 $SOLR_HOME 中。

如果 blockUnknown 未在 security.json 檔案中定義,則預設值為 true。這會產生需要對 Solr 進行 HTTP 存取驗證的效果。在某些情況下,您可能不希望在啟用外掛程式後進行驗證;例如,如果您想要將 security.json 放在適當的位置,但尚未準備好啟用驗證。但是,您會希望確保 blockUnknown 設定為 true 或完全省略,以便強制執行對系統的所有請求進行驗證。

如果您將 blockUnknown 設定為 false,則任何未明確受到權限保護的請求都可供匿名使用者存取!因此,您應該為每個您想要保護的預先定義的權限定義角色繫結。您可以為您想要允許匿名使用者存取的請求指派特殊的 role: null 繫結。若要保護除了具有 role:null 的端點之外的所有端點,您可以為 all 權限新增角色繫結,並將其放在 security.json 中的最後位置。

如果未定義 realm,則預設值為 solr

如果您使用 SolrCloud,您必須將 security.json 上傳到 ZooKeeper。您可以在SolrCloud 叢集中的身份驗證和授權外掛程式找到範例指令和更多關於保護設定的資訊。

注意事項

使用基本身份驗證外掛程式時,有幾件事需要注意。

  • 憑證預設以純文字傳送。建議啟用基本身份驗證時,使用 SSL 進行通訊,如啟用 SSL章節所述。

  • 有權寫入 security.json 的使用者將能夠修改所有權限和使用者權限分配。應特別注意僅將編輯安全性的權限授予適當的使用者。

  • 當然,您的網路應該是安全的。即使啟用了基本身份驗證,您也不應不必要地將 Solr 暴露給外部世界。

將基本身份驗證與其他方案結合

當使用其他身份驗證方案時,例如JWT 身份驗證外掛程式,您可能仍然希望為一小部分面向「服務帳戶」的用戶端應用程式使用基本身份驗證。Solr 提供 MultiAuthPlugin 來支援多種身份驗證方案。例如,您可能希望將 Solr 與 OIDC 提供者整合以用於使用者帳戶,但也希望使用 Basic 來驗證來自 Prometheus 指標匯出器的請求。MultiAuthPlugin 使用 Authorization 標頭的方案來決定哪個外掛程式應處理每個請求。當您在 Kubernetes 上執行 Solr 時,MultiAuthPlugin 非常有用,因為您可以將使用者管理和身份驗證委派給 OIDC 提供者以供終端使用者使用,同時也使用 Basic 身份驗證來保護存活性和就緒端點,因為您不希望 Kubernetes 在測試探針端點時使用 OIDC。

以下範例說明如何配置 MultiAuthPlugin 以支援 BasicBearer 方案。

{
  "authentication": {
    "class": "solr.MultiAuthPlugin",
    "schemes": [{
      "scheme": "bearer",
      "blockUnknown": true,
      "class": "solr.JWTAuthPlugin",
      "wellKnownUrl": "https://OIDC_PROVIDER_URL/.well-known/openid-configuration",
      "clientId": "solr",
      "redirectUris": "https://127.0.0.1:8983/solr/",
      "rolesClaim": "groups"
    },{
      "scheme": "basic",
      "blockUnknown": true,
      "class": "solr.BasicAuthPlugin",
      "credentials": {
        "k8s-oper": "PASSWORD SALT & HASH"
      },
      "forwardCredentials": false
    }]
  }
}

對於來自 Solr 管理 UI 的未經身份驗證的 AJAX 請求(即沒有 Authorization 標頭的請求),MultiAuthPlugin 會將請求轉發到 schemes 清單中列出的第一個外掛程式。在上述範例中,使用者需要向 OIDC 提供者進行身份驗證才能登入管理 UI。

編輯基本身份驗證外掛程式配置

身份驗證 API 允許修改使用者 ID 和密碼。該 API 提供一個端點,其中包含用於設定使用者詳細資訊或刪除使用者的特定命令。

API 進入點

  • v1: https://127.0.0.1:8983/solr/admin/authentication

  • v2: https://127.0.0.1:8983/api/cluster/security/authentication

此端點並非集合專屬,因此會為整個 Solr 叢集建立使用者。如果需要將使用者限制為特定集合,可以使用授權規則來完成。

新增使用者或編輯密碼

set-user 命令允許您新增使用者並變更其密碼。例如,以下定義了兩個使用者及其密碼

  • V1 API

  • V2 API

curl --user solr:SolrRocks https://127.0.0.1:8983/solr/admin/authentication -H 'Content-type:application/json' -d '{"set-user": {"tom":"TomIsCool", "harry":"HarrysSecret"}}'
curl --user solr:SolrRocks https://127.0.0.1:8983/api/cluster/security/authentication -H 'Content-type:application/json' -d '{"set-user": {"tom":"TomIsCool", "harry":"HarrysSecret"}}'

刪除使用者

delete-user 命令允許您移除使用者。移除使用者時,不需要傳送使用者密碼。在以下範例中,我們要求從系統中移除使用者 ID 為 'tom' 和 'harry' 的使用者。

  • V1 API

  • V2 API

curl --user solr:SolrRocks https://127.0.0.1:8983/solr/admin/authentication -H 'Content-type:application/json' -d  '{"delete-user": ["tom", "harry"]}'
curl --user solr:SolrRocks https://127.0.0.1:8983/api/cluster/security/authentication -H 'Content-type:application/json' -d  '{"delete-user": ["tom", "harry"]}'

設定屬性

設定身份驗證外掛程式的屬性。基本身份驗證外掛程式目前支援的屬性為 blockUnknownrealmforwardCredentials

  • V1 API

  • V2 API

curl --user solr:SolrRocks https://127.0.0.1:8983/solr/admin/authentication -H 'Content-type:application/json' -d  '{"set-property": {"blockUnknown":false}}'
curl --user solr:SolrRocks https://127.0.0.1:8983/api/cluster/security/authentication -H 'Content-type:application/json' -d  '{"set-property": {"blockUnknown":false}}'

身份驗證領域預設為 solr,並顯示在 WWW-Authenticate HTTP 標頭和管理 UI 登入頁面中。若要變更領域,請設定 realm 屬性

  • V1 API

  • V2 API

curl --user solr:SolrRocks https://127.0.0.1:8983/solr/admin/authentication -H 'Content-type:application/json' -d  '{"set-property": {"realm":"My Solr users"}}'
curl --user solr:SolrRocks https://127.0.0.1:8983/api/cluster/security/authentication -H 'Content-type:application/json' -d  '{"set-property": {"realm":"My Solr users"}}'

使用 MultiAuthPlugin 編輯外掛程式配置

當使用 MultiAuthPlugin 時,您需要將命令資料包裝在一個單鍵物件中,以識別 scheme。例如,Basic 外掛程式的 set-user 命令將是

{
  "set-user": {
    "basic": {"tom":"TomIsCool", "harry":"HarrysSecret"}
  }
}

當使用 MultiAuthPlugin 時,在 Basic 外掛程式上設定屬性

{
  "set-property": {
    "basic": {"realm":"My Solr users"}
  }
}

使用 SolrJ 進行基本身份驗證

使用基本身份驗證保護的 Solr 伺服器,使用 SolrJ 的主要方法有兩種:權限可以設定在每個單獨的請求上,或者可以配置底層的 http 用戶端,以便將憑證新增至它傳送的所有請求。

每個請求的基本身份驗證憑證

在 SolrJ 中設定基本身份驗證的最簡單方法是在每個請求上使用 setBasicAuthCredentials 方法,如本範例所示

SolrRequest req ;//create a new request object
req.setBasicAuthCredentials(userName, password);
solrClient.request(req);

查詢範例

QueryRequest req = new QueryRequest(new SolrQuery("*:*"));
req.setBasicAuthCredentials(userName, password);
QueryResponse rsp = req.process(solrClient);

雖然此方法很簡單,但通常很難確保在需要憑證的地方都提供憑證。它也無法與許多不使用 SolrRequest 物件的 SolrClient 方法一起使用。

每個用戶端的憑證

Http2SolrClient 支援在建立用戶端時設定用戶端層級的憑證。這將確保使用此特定用戶端發出的所有請求都會設定基本身份驗證標頭。

Http2SolrClient client = new Http2SolrClient.Builder(solrUrl)
        .withBasicAuthCredentials(userName, password).build();
QueryResponse rsp = req.process(client);

CloudHttp2SolrClient 支援接收 Http2SolrClient.Builder 實例以建立其內部用戶端,因此若要在用戶端層級設定憑證,您可以使用類似如下的程式碼

Http2SolrClient.Builder http2ClientBuilder = Http2SolrClient.Builder().withBasicAuthCredentials(userName, password);
CloudHttp2SolrClient client = new CloudHttp2SolrClient.Builder(zkHostList, chroot)
            .withInternalClientBuilder(http2ClientBuilder).build();
QueryResponse rsp = req.process(client);

全域 (JVM) 基本身份驗證憑證

或者,使用者可以使用 SolrJ 的 PreemptiveBasicAuthClientBuilderFactory 自動將基本身份驗證憑證新增至所有請求。若要啟用此功能,使用者應設定以下系統屬性 -Dsolr.httpclient.builder.factory=org.apache.solr.client.solrj.impl.PreemptiveBasicAuthClientBuilderFactoryPreemptiveBasicAuthClientBuilderFactory 允許應用程式以兩種不同的方式提供憑證

  1. 可以傳遞 basicauth 系統屬性,其中直接包含憑證(例如,-Dbasicauth=username:password)。此選項很簡單,但可能會在命令行中暴露憑證,具體取決於它們的設定方式。

  2. 可以傳遞 solr.httpclient.config 系統屬性,其中包含持有憑證的屬性檔案的路徑。在此檔案中,使用者名稱和密碼可以分別指定為 httpBasicAuthUserhttpBasicAuthPassword

    httpBasicAuthUser=my_username
    httpBasicAuthPassword=secretPassword

將 Solr 控制腳本與基本身份驗證搭配使用

啟用基本身份驗證後,對 Solr 控制腳本 (bin/solr) 的所有請求都必須包含使用者憑證。若要確保這一點,請將以下行新增至 solr.in.shsolr.in.cmd 檔案。

此範例告知 bin/solr 命令行使用 "basic" 作為身份驗證的類型,並以使用者名稱 "solr" 和密碼 "SolrRocks" 傳遞憑證

SOLR_AUTH_TYPE="basic"
SOLR_AUTHENTICATION_OPTS="-Dbasicauth=solr:SolrRocks"

或者,SOLR_AUTHENTICATION_OPTS 可以接受檔案路徑,如

SOLR_AUTH_TYPE="basic"
SOLR_AUTHENTICATION_OPTS="-Dsolr.httpclient.config=/path/to/solr-9.7.0/server/solr/basicAuth.conf"