Kerberos 驗證外掛程式
如果您使用 Kerberos 來保護您的網路環境,則可以使用 Kerberos 驗證外掛程式來保護 Solr 叢集。
這讓 Solr 可以使用 Kerberos 服務主體和金鑰表檔案來與 ZooKeeper 以及 Solr 叢集的節點之間(如果適用)進行驗證。管理 UI 的使用者和所有用戶端(例如 SolrJ)也需要擁有有效的票證,才能使用 UI 或將請求傳送至 Solr。
SolrCloud、使用者管理或單節點安裝中均提供 Kerberos 驗證支援。
如果您使用 Kerberos 保護的 Hadoop 叢集搭配 Solr,並打算將 Solr 索引儲存在 HDFS 中,另請參閱 HDFS 上的 Solr 章節,以取得額外步驟來設定 Solr 以達到該目的。本頁的指示僅適用於使用 Kerberos 保護 Solr 的情況。如果您只需要將索引儲存在 Kerberized HDFS 系統中,請參閱在 HDFS 上執行 Solr 章節。 |
Solr 如何與 Kerberos 搭配運作
設定 Solr 使用 Kerberos 時,會設定 Solr 使用服務主體或 Kerberos 使用者名稱的組態,該名稱已向金鑰分發中心 (KDC) 註冊以驗證請求。組態會定義服務主體名稱和包含認證的金鑰表檔案的位置。
與所有驗證外掛程式一樣,Kerberos 驗證組態儲存在 security.json
中。本檔案會在 設定 security.json 章節中討論。
服務主體與金鑰表檔案
每個 Solr 節點都必須在金鑰分發中心 (KDC) 註冊服務主體。Kerberos 外掛程式使用 SPNego 來協商驗證。
以 HTTP/host1@YOUR-DOMAIN.ORG
作為服務主體的範例
-
HTTP
表示此服務主體將用於驗證的請求類型。服務主體中的HTTP/
是 SPNego 才能透過 HTTP 使用對 Solr 的請求的必要條件。 -
host1
是託管 Solr 節點的電腦主機名稱。 -
YOUR-DOMAIN.ORG
是整個組織的 Kerberos 領域。
同一主機上的多個 Solr 節點可能具有相同的服務主體,因為主機名稱對它們而言是通用的。
除了服務主體 (service principal) 之外,每個 Solr 節點都需要一個 keytab 檔案,其中應包含所使用服務主體的憑證。keytab 檔案包含加密的憑證,以便在從 KDC 取得 Kerberos 票證時支援無密碼登入。對於每個 Solr 節點,keytab 檔案應保存在安全的位置,且不應與叢集的使用者共用。
由於 Solr 叢集需要節點間通訊,因此每個節點也必須能夠向其他節點發出啟用 Kerberos 的請求。預設情況下,Solr 使用相同的服務主體和 keytab 作為節點間通訊的「用戶端主體」。您可以明確設定不同的用戶端主體,但不建議這樣做,且以下範例中不包含此設定。
已 Kerberos 化 (Kerberized) 的 ZooKeeper
設定已 Kerberos 化的 SolrCloud 叢集時,建議也為 ZooKeeper 啟用 Kerberos 安全性。
在這種設定中,用於驗證與 ZooKeeper 請求的用戶端主體,也可以共用於節點間通訊。這樣做的好處是不需要單獨更新票證授權票證 (TGT),因為 Solr 使用的 ZooKeeper 用戶端會處理此問題。為了實現這一點,Kerberos 外掛程式和 ZooKeeper 用戶端可以使用單個 JAAS 設定 (應用程式名稱為 Client)。
請參閱下方的 ZooKeeper 設定章節,以取得在 Kerberos 模式下啟動 ZooKeeper 的範例。
Kerberos 驗證設定
請諮詢您的 Kerberos 管理員!
在嘗試設定 Solr 使用 Kerberos 驗證之前,請仔細檢查下面概述的每個步驟,並就每個細節諮詢您當地的 Kerberos 管理員,以確保您知道每個參數的正確值。小的錯誤可能會導致 Solr 無法啟動或無法正常運作,而且診斷起來非常困難。 |
Kerberos 外掛程式的設定包含幾個部分
-
建立服務主體和 keytab 檔案
-
ZooKeeper 設定
-
建立或更新
/security.json
-
定義
jaas-client.conf
-
Solr 啟動參數
我們將在下面逐步說明這些步驟。
使用主機名稱
若要使用主機名稱而不是 IP 位址,請使用 |
取得服務主體和 Keytab
在設定 Solr 之前,請確保您在 KDC 伺服器中為每個 Solr 主機和 ZooKeeper (如果 ZooKeeper 尚未設定) 擁有可用的 Kerberos 服務主體,並產生如下所示的 keytab 檔案。
此範例假設主機名稱為 192.168.0.107
,且您的主目錄為 /home/foo/
。此範例應針對您自己的環境進行修改。
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 伺服器的 /tmp/107.keytab
位置複製到 Solr 主機的 /keytabs/107.keytab
位置。為每個 Solr 節點重複此步驟。
如果尚未設定,您可能需要採取類似的步驟來建立 ZooKeeper 服務主體和 keytab。在這種情況下,下面的範例顯示了 ZooKeeper 的不同服務主體,因此上面的內容可能會重複使用 zookeeper/host1
作為其中一個節點的服務主體
ZooKeeper 設定
如果您使用的是已經設定為使用 Kerberos 的 ZooKeeper,則可以跳過此處顯示的與 ZooKeeper 相關的步驟。
由於 ZooKeeper 管理 SolrCloud 叢集中節點之間的通訊,因此它也必須能夠與叢集的每個節點進行驗證。設定需要為 ZooKeeper 設定服務主體,定義 JAAS 設定檔,並指示 ZooKeeper 使用這兩個項目。
第一步是在 ZooKeeper 的 conf
目錄中建立檔案 java.env
,並將以下內容加入其中,如下例所示
export JVMFLAGS="-Djava.security.auth.login.config=/etc/zookeeper/conf/jaas-client.conf"
JAAS 設定檔應包含以下參數。請務必適當地變更 principal
和 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
完成所有設定後,請使用以下參數啟動 ZooKeeper,該參數指向 JAAS 設定檔
$ bin/zkServer.sh start -Djava.security.auth.login.config=/etc/zookeeper/conf/jaas-client.conf
建立 security.json
使用以下內容建立檔案 security.json
{"authentication": {"class": "solr.KerberosPlugin"}}
然後使用 bin/solr zk
命令上傳該檔案
$ bin/solr zk cp ./security.json zk:security.json -z localhost:2181
如果您在單節點安裝中使用 Solr,則需要建立 security.json
檔案並將其放在 $SOLR_HOME
目錄中。
如果 ZooKeeper 中已存在 |
定義 JAAS 設定檔
JAAS 設定檔定義用於驗證的屬性,例如服務主體和 keytab 檔案的位置。還可以設定其他屬性,以確保票證快取和其他功能。
可以複製以下範例並針對您的環境進行少量修改。該檔案的位置可以在伺服器上的任何位置,但在啟動 Solr 時將會參考該檔案,因此必須可以在檔案系統上讀取。JAAS 檔案可能包含不同使用者的多個部分,但每個部分都必須具有唯一的名稱,以便可以在每個應用程式中唯一引用。
在下面的範例中,我們建立了一個名為 /home/foo/jaas-client.conf
的 JAAS 設定檔。我們將在下一節中定義 Solr 啟動參數時使用此名稱和路徑。請注意,此處的用戶端 principal
與服務主體相同。這將用於驗證節點間請求和對 ZooKeeper 的請求。請務必使用正確的 principal
主機名稱和 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
參數一起使用。
我們關心的主要屬性是 keyTab
和 principal
屬性,但您的環境可能需要其他屬性。 Krb5LoginModule 的 javadocs (正在使用的類別,並在上面的第二行中呼叫) 提供了可用屬性的良好概述,但為了參考起見,此處說明了上述範例中使用的屬性
-
useKeyTab
:此布林值屬性定義是否應使用 keytab 檔案 (在本例中為true
)。 -
keyTab
:此 JAAS 設定檔區段所針對的主體之 keytab 檔案的位置和名稱。路徑應以雙引號括起來。 -
storeKey
:此布林值屬性允許將金鑰儲存在使用者的私人憑證中。 -
useTicketCache
:此布林值屬性允許從票證快取中取得票證。 -
debug
:此布林值屬性將輸出偵錯訊息,以協助進行疑難排解。 -
principal
:要使用的服務主體名稱。
Solr 啟動參數
在啟動 Solr 時,需要傳遞以下主機特定的參數。這些參數可以使用 bin/solr
start 命令在命令列中傳遞 (有關如何傳遞系統參數的詳細資訊,請參閱Solr 控制指令碼參考),或在 bin/solr.in.sh
或 bin/solr.in.cmd
中定義,具體取決於您的作業系統。
solr.kerberos.name.rules
-
選用
預設:
DEFAULT
用於將 Kerberos 主體對應到簡短名稱。名稱規則的範例:
RULE:[1:$1@$0](.*EXAMPLE.COM)s/@.*//
。 solr.kerberos.name.rules.mechanism
-
選用
預設:
hadoop
用於將 Kerberos 主體對應到簡短名稱的機制。可以是
hadoop
或mit
。 solr.kerberos.cookie.domain
-
必要
預設:無
用於發出 Cookie,並且應具有 Solr 節點的主機名稱。
solr.kerberos.cookie.portaware
-
選用
預設:
false
當設定為
true
時,Cookie 會根據主機和連接埠進行區分,而不是不感知連接埠的標準 Cookie。如果同一個主機上有多個 Solr 節點,則應設定此參數。 solr.kerberos.principal
-
必要
預設:無
服務主體。
solr.kerberos.keytab
-
必要
預設:無
包含服務主體憑證的 Keytab 檔案路徑
solr.kerberos.jaas.appname
-
選用
預設:
Client
JAAS 設定檔中節點間通訊所需的應用程式名稱 (區段名稱)。預設值也用於 ZooKeeper 驗證。如果 ZooKeeper 和 Solr 使用不同的使用者,則它們需要在 JAAS 設定檔中具有單獨的區段。
java.security.auth.login.config
-
必要
預設:無
用於設定 Solr 用戶端以進行節點間通訊的 JAAS 設定檔路徑。
以下範例可以新增至 bin/solr.in.sh
。請務必變更此範例以使用正確的主機名稱和 keytab 檔案路徑。
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"
使用 AES-256 加密的 KDC
如果您的 KDC 使用 AES-256 加密,您需要在已 Kerberos 化的 Solr 可以與 KDC 互動之前,將 Java Cryptography Extension (JCE) 無限強度管轄原則檔案新增至 JRE。 當您在 Solr 日誌中看到類似以下的錯誤時,您就會知道這一點:「KrbException:不支援/未啟用使用 HMAC SHA1-96 的 AES256 CTS 模式加密類型」。 對於 Java 1.8,此檔案可在此處取得:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html。 將 |
使用委派權杖
Kerberos 外掛程式可以設定為使用委派權杖,允許應用程式重複使用終端使用者或其他應用程式的身份驗證。
在 Solr 中,有幾種情況可能會需要此功能
-
使用分散式用戶端(例如 MapReduce)時,每個用戶端可能無法存取使用者的憑證。
-
當 Kerberos 伺服器上的負載很高時。委派權杖可以減少負載,因為它們在第一次請求後不會存取伺服器。
-
如果請求或權限需要委派給其他使用者。
若要啟用委派權杖,必須定義幾個參數。這些參數可以使用 bin/solr
啟動命令在命令列中傳遞(請參閱 Solr 控制腳本參考),或根據您的作業系統在 bin/solr.in.sh
或 bin/solr.in.cmd
中定義。
solr.kerberos.delegation.token.enabled
-
選用
預設:
false
設定為
true
以啟用委派權杖。如果您想要啟用權杖,則此參數為必要。 solr.kerberos.delegation.token.kind
-
選用
預設值:
solr-dt
委派權杖的類型。目前唯一可用的選項是預設值。
solr.kerberos.delegation.token.validity
-
選用
預設值:
36000
委派權杖有效的時間,以秒為單位。
solr.kerberos.delegation.token.signer.secret.provider
-
選用
預設值:
zookeeper
委派權杖資訊在內部儲存的位置。預設值為
zookeeper
,它必須是跨 Solr 伺服器(在 SolrCloud 模式下執行時)使用委派權杖的位置。目前沒有其他選項可用。 solr.kerberos.delegation.token.signer.secret.provider.zookeper.path
-
選用
預設:無
儲存機密提供者資訊的 ZooKeeper 路徑。它的格式為路徑 +
/security/token
。路徑可以包含 chroot,如果您未使用 chroot,則可以省略它。此範例包含 chroot:server1:9983,server2:9983,server3:9983/solr/security/token
。 solr.kerberos.delegation.token.secret.manager.znode.working.path
-
選用
預設:無
儲存權杖資訊的 ZooKeeper 路徑。它的格式為路徑 +
/security/zkdtsm
。路徑可以包含 chroot,如果您未使用 chroot,則可以省略它。此範例包含 chroot:server1:9983,server2:9983,server3:9983/solr/security/zkdtsm
。
啟動 Solr
完成設定後,您可以使用 bin/solr
腳本啟動 Solr,如下面的範例所示,該範例僅適用於 SolrCloud 模式的使用者。
此範例假設您已使用正確的值修改 bin/solr.in.sh
或 bin/solr.in.cmd
,但如果您沒有修改,則需要在啟動命令中傳遞系統參數。請注意,您還需要根據 ZooKeeper 節點的位置自訂 -z
屬性。
$ bin/solr start -c -z server1:2181,server2:2181,server3:2181/solr
如果您已在 solr.in.sh /solr.in.cmd 中定義 ZK_HOST (請參閱 更新 Solr 包含檔案),則可以從上述命令中省略 -z <zk host string> 。 |
將 SolrJ 與 Kerberized Solr 搭配使用
若要在 SolrJ 應用程式中使用 Kerberos 驗證,您需要在建立 SolrClient 之前使用以下兩行程式碼
System.setProperty("java.security.auth.login.config", "/home/foo/jaas-client.conf");
HttpClientUtil.setHttpClientBuilder(new Krb5HttpClientBuilder().getBuilder());
您需要在上面的 JAAS 用戶端設定檔中為用戶端指定 Kerberos 服務主體和對應的 keytab。此主體應與我們為 Solr 建立的服務主體不同。
以下為範例
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 也支援委派權杖,方法如下
-
DelegationTokenRequest
和DelegationTokenResponse
可用於取得、取消和更新委派權杖。 -
HttpSolrClient.Builder
包含withKerberosDelegationToken
函式,用於建立使用委派權杖進行驗證的 HttpSolrClient。
取得委派權杖的範例程式碼
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();
}
建立使用委派權杖的 HttpSolrClient
HttpSolrClient client = new HttpSolrClient.Builder("https://127.0.0.1:8983/solr").withKerberosDelegationToken(token).build();
建立使用委派權杖的 CloudSolrClient
CloudSolrClient client = new CloudSolrClient.Builder(Collections.singletonList("localhost:2181"),Optional.empty())
.withLBHttpSolrClientBuilder(new LBHttpSolrClient.Builder()
.withResponseParser(client.getParser())
.withHttpSolrClientBuilder(
new HttpSolrClient.Builder()
.withKerberosDelegationToken(token)
))
.build();
Hadoop 的委派權杖回應為 JSON 地圖格式。 |