Kerberos身份驗證插件

2018-12-20 11:59 更新

如果您使用Kerberos來保護(hù)您的網(wǎng)絡(luò)環(huán)境,則可以使用Kerberos身份驗證插件來保護(hù)Solr集群。

這允許Solr使用Kerberos服務(wù)主體和keytab文件來認(rèn)證ZooKeeper以及Solr群集的節(jié)點(如果適用)。Admin UI和所有客戶端(如SolrJ)的用戶在能夠使用UI或向Solr發(fā)送請求之前還需要擁有一個有效的票證。

在SolrCloud模式或獨立模式下支持Kerberos身份驗證插件。

如果您將Solr與通過Kerberos保護(hù)的Hadoop集群一起使用,并打算將您的Solr索引存儲在HDFS中,請參閱HDFS上運行Solr部分,以獲取為此目的配置Solr的其他步驟。本頁面上的說明僅適用于使用Kerberos保護(hù)Solr的情況。如果您只需要將索引存儲在Kerberized HDFS系統(tǒng)中,請參閱上面的其他部分。

Solr如何與Kerberos一起使用

當(dāng)設(shè)置Solr以使用Kerberos時,Solr將使用服務(wù)主體或在密鑰分發(fā)中心(KDC)注冊的Kerberos用戶名進(jìn)行配置,以對請求進(jìn)行身份驗證。這些配置定義了服務(wù)主體名稱和包含憑證的 keytab 文件的位置。

security.json

Solr 身份驗證模型使用名為security.json的文件。此文件的說明以及創(chuàng)建和維護(hù)的方式都包含在身份驗證和授權(quán)插件部分。如果此文件是在 Solr 初始啟動后創(chuàng)建的,則需要重新啟動系統(tǒng)的每個節(jié)點。

服務(wù)主體和Keytab文件

每個Solr節(jié)點必須具有在密鑰分發(fā)中心(KDC)注冊的服務(wù)主體。Kerberos插件使用SPNego來協(xié)商身份驗證。

使用HTTP/host1@YOUR-DOMAIN.ORG,作為服務(wù)主體的一個例子:

  • HTTP 指示這個服務(wù)主體將用于身份驗證的請求的類型。服務(wù)主體中的HTTP/是 SPNego 在通過 http 對 Solr 的請求時必須使用的。
  • host1 是托管Solr節(jié)點的計算機(jī)的主機(jī)名。
  • YOUR-DOMAIN.ORG 是組織范圍內(nèi)的Kerberos領(lǐng)域。

同一主機(jī)上的多個Solr節(jié)點可能具有相同的服務(wù)主體,因為主機(jī)名對于所有主機(jī)都是通用的。

與服務(wù)主體一起,每個Solr節(jié)點都需要一個keytab文件,該文件應(yīng)包含所使用的服務(wù)主體的憑證。keytab 文件包含加密的憑據(jù),以便在從KDC獲取Kerberos票據(jù)時支持無密碼登錄。對于每個Solr節(jié)點,keytab 文件應(yīng)保存在安全的位置,而不是與群集的用戶共享。

由于Solr群集需要節(jié)點間通信,因此每個節(jié)點還必須能夠向其他節(jié)點啟用Kerberos啟用的請求。默認(rèn)情況下,Solr使用相同的服務(wù)主體和keytab作為節(jié)點間通信的“客戶端主體”。您可以明確地配置一個不同的客戶端主體,但不建議這樣做,下面的示例中沒有涉及。

Kerberized ZooKeeper

在設(shè)置Kerberos SolrCloud集群時,建議同時啟用ZooKeeper的Kerberos安全性。

在這樣的設(shè)置中,使用ZooKeeper身份驗證請求的客戶端主體也可以用于節(jié)點間通信。由于Solr使用的Zookeeper客戶端負(fù)責(zé)這個操作,因此不需要分別續(xù)訂票證授予票證(TGT)。為了達(dá)到這個目的,一個JAAS配置(應(yīng)用程序名稱為Client)可用于Kerberos插件以及Zookeeper客戶端。

有關(guān)在Kerberos模式下啟動ZooKeeper的示例,請參見下面的ZooKeeper配置部分。

瀏覽器配置

為了讓您的瀏覽器在啟用Kerberos身份驗證后訪問Solr管理用戶界面,它必須能夠與Kerberos身份驗證器服務(wù)進(jìn)行協(xié)商以允許您訪問。每個瀏覽器都支持這種方式,有些(如Chrome)完全不支持。如果在啟用Kerberos身份驗證后嘗試訪問Solr管理用戶界面時看到401錯誤,則可能是您的瀏覽器未正確配置,無法知道如何或在何處協(xié)商身份驗證請求。

有關(guān)如何設(shè)置瀏覽器的詳細(xì)信息超出了本文檔的范圍。有關(guān)如何配置瀏覽器的詳細(xì)信息,請與系統(tǒng)管理員聯(lián)系以了解 Kerberos。

Kerberos身份驗證配置

請咨詢您的 Kerberos 管理員:在嘗試將 Solr 配置為使用 kerberos 身份驗證之前,請查看下面列出的每個步驟,并咨詢您的本地Kerberos管理員的每個詳細(xì)信息,以確保您知道每個參數(shù)的正確值。小錯誤可能會導(dǎo)致Solr無法啟動或無法正常工作,并且非常難以診斷。

Kerberos插件的配置有幾個部分:

  • 創(chuàng)建服務(wù)主體和 keytab 文件
  • ZooKeeper配置
  • 創(chuàng)建或更新 /security.json
  • 定義 jaas-client.conf
  • Solr啟動參數(shù)

在之后的內(nèi)容中我們會使用到這些步驟。

注意:使用主機(jī)名;要使用主機(jī)名而不是 IP 地址, 請使用 bin/solr.in.sh 中的 SOLR_HOST 配置或在 solr 啟動期間通過 -Dhost=<hostname> 系統(tǒng)參數(shù)。本指南使用 IP 地址。如果指定了主機(jī)名,請根據(jù)需要將指南中的所有IP地址替換為Solr主機(jī)名。

獲取服務(wù)主體和Keytabs

在配置Solr之前,請確保您擁有KDC服務(wù)器中每個Solr主機(jī)和ZooKeeper的Kerberos服務(wù)主體(如果ZooKeeper尚未配置),并生成一個keytab文件,如下所示。

這個例子假定主機(jī)名是192.168.0.107,并且您的主目錄是/home/foo/。這個例子應(yīng)該根據(jù)您自己的環(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ù)制到位于的Solr主機(jī)/keytabs/107.keytab。對每個Solr節(jié)點重復(fù)此步驟。

您可能需要采取類似的步驟來創(chuàng)建ZooKeeper服務(wù)主體和 keytab(如果尚未設(shè)置)。在這種情況下,下面的例子顯示了ZooKeeper的一個不同的服務(wù)主體,因此上述可能會以 zookeeper/host1 作為其中一個節(jié)點的服務(wù)主體來重復(fù)。

ZooKeeper配置

如果您正在使用的ZooKeeper已配置為使用 Kerberos,則可以跳過此處顯示的與ZooKeeper相關(guān)的步驟。

由于ZooKeeper管理SolrCloud集群中節(jié)點之間的通信,因此它還必須能夠與集群中的每個節(jié)點進(jìn)行身份驗證。配置需要為ZooKeeper設(shè)置一個服務(wù)主體,定義一個JAAS配置文件并指示ZooKeeper使用這兩個項目。

第一步是在ZooKeeper的conf目錄下創(chuàng)建一個java.env文件并添加以下內(nèi)容,如下例所示:

export JVMFLAGS="-Djava.security.auth.login.config=/etc/zookeeper/conf/jaas-client.conf"

JAAS配置文件應(yīng)包含以下參數(shù)。務(wù)必根據(jù)需要更改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

一旦所有部分都到位,使用以下參數(shù)指向JAAS配置文件來啟動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模式下,您可以通過在創(chuàng)建ZooKeeper時上傳security.json來將Solr設(shè)置為使用Kerberos插件,如下所示:

server/scripts/cloud-scripts/zkcli.sh -zkhost localhost:2181 -cmd put /security.json '{"authentication":{"class": "org.apache.solr.security.KerberosPlugin"}}'

如果您在獨立模式下使用Solr,則需要創(chuàng)建該security.json文件并將其放入您的$SOLR_HOME目錄中。

有關(guān)如何在Solr中使用/security.json文件的更多詳細(xì)信息,請參見“身份驗證和授權(quán)插件”部分。

如果在ZooKeeper中已經(jīng)有了/security.json文件,請下載該文件,添加或修改身份驗證部分,然后使用 Solr 中提供的命令行實用程序?qū)⑵渖蟼骰豘ooKeeper。

定義一個JAAS配置文件

JAAS配置文件定義用于身份驗證的屬性,如服務(wù)主體和 keytab 文件的位置。還可以設(shè)置其他屬性以確保票據(jù)緩存和其他功能。

以下示例可以根據(jù)您的環(huán)境稍微復(fù)制和修改。文件的位置可以在服務(wù)器上的任何位置,但在啟動Solr時會被引用,因此它必須在文件系統(tǒng)上是可讀的。JAAS文件可能包含不同用戶的多個部分,但每個部分必須具有唯一的名稱,以便在每個應(yīng)用程序中唯一地引用它。

在下面的例子中,我們創(chuàng)建了一個 JAAS 配置文件,其名稱和路徑為/home/foo/jaas-client.conf。我們將在下一節(jié)定義Solr start 參數(shù)時使用這個名稱和路徑。請注意,這里的客戶端主體與服務(wù)主體相同。這將用于驗證節(jié)點間的請求和請求到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";
};

這個文件的第一行定義了節(jié)名稱,它將與下面定義的solr.kerberos.jaas.appname參數(shù)一起使用。

我們關(guān)注的主要屬性是keyTab和principal屬性,但也有其他可能需要為您的環(huán)境。Krb5LoginModule 的 javadoc(正在使用的類在上面的第二行中被調(diào)用)提供了可用屬性的一個很好的概要,但是對于在上面的例子中使用的參考來說,這里解釋如下:

  • useKeyTab:這個布爾屬性定義了我們是否應(yīng)該使用一個keytab文件(在這種情況下是true)。
  • keyTab:JAAS配置文件的此部分用于主體的keytab文件的位置和名稱。路徑應(yīng)該用雙引號括起來。
  • storeKey:這個布爾屬性允許密鑰存儲在用戶的私人憑證中。
  • useTicketCache:該布爾屬性允許從票證緩存中獲取票證。
  • debug:此布爾屬性將輸出調(diào)試消息,以幫助進(jìn)行疑難解答。
  • principal:要使用的服務(wù)主體的名稱。

Solr啟動參數(shù)

在啟動Solr時,需要傳遞以下特定于主機(jī)的參數(shù)。這些參數(shù)可以通過bin/solr啟動命令在命令行中傳遞(請參閱“Solr控制腳本參考”以了解如何傳遞系統(tǒng)參數(shù)的詳細(xì)信息),也可以在bin/solr.in.sh或者bin/solr.in.cmd中根據(jù)您的操作系統(tǒng)進(jìn)行相應(yīng)的定義。

solr.kerberos.name.rules

用于將Kerberos主體映射到短名稱。默認(rèn)值是DEFAULT。名稱規(guī)則的例子:RULE:[1:$1@$0](.*EXAMPLE.COM)s/@.*//。

solr.kerberos.cookie.domain

用于發(fā)出cookie,并應(yīng)具有Solr節(jié)點的主機(jī)名。該參數(shù)是必需的。

solr.kerberos.cookie.portaware

設(shè)置為true時,Cookie根據(jù)主機(jī)和端口進(jìn)行區(qū)分,而標(biāo)準(zhǔn)Cookie不是端口可識別的。如果在同一個主機(jī)上托管多個Solr節(jié)點,應(yīng)該設(shè)置此項。默認(rèn)是false。

solr.kerberos.principal

服務(wù)主體。該參數(shù)是必需的。

solr.kerberos.keytab

包含服務(wù)主體憑證的Keytab文件路徑。該參數(shù)是必需的。

solr.kerberos.jaas.appname

節(jié)點間通信所需的JAAS配置文件中的應(yīng)用程序名稱(節(jié)名稱)。默認(rèn)值是Client,也用于ZooKeeper身份驗證。如果ZooKeeper和Solr使用不同的用戶,那么他們將需要在JAAS配置文件中有單獨的部分。

java.security.auth.login.config

用于配置Solr客戶端以進(jìn)行節(jié)點間通信的JAAS配置文件的路徑。該參數(shù)是必需的。

這是一個可以添加到bin/solr.in.sh的例子。確保將此示例更改為使用正確的主機(jī)名和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加密,則在Kerberized Solr可以與KDC交互之前,您需要將Java Cryptography Extension(JCE)無限制強(qiáng)制管轄權(quán)策略文件添加到您的JRE。

當(dāng)您在Solr日志中看到如下錯誤時,您將會知道這一點:“KrbException:帶有HMAC SHA1-96的加密類型AES256 CTS模式不支持/啟用”

對于Java 1.8,可以在這里找到:http : //www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html。

將 JAVA_HOME/jre/lib/security/ 與新的 local_policy. jar 一起替換為已下載包中的 local_policy,然后重新啟動Solr節(jié)點。

使用委托令牌

Kerberos插件可以配置為使用委托令牌,允許應(yīng)用程序重復(fù)使用最終用戶或其他應(yīng)用程序的身份驗證。

對于 Solr,有幾個用例可能會有幫助:

  • 使用分布式客戶端(如MapReduce),其中每個客戶端可能無法訪問用戶的憑據(jù)。
  • 當(dāng) Kerberos 服務(wù)器上的負(fù)載很高時。委托令牌可以減少負(fù)載,因為它們在第一次請求后不訪問服務(wù)器。
  • 如果需要將請求或權(quán)限委派給其他用戶。

要啟用委托令牌,必須定義幾個參數(shù)。這些參數(shù)可以通過bin/solr啟動命令在命令行中傳遞(請參閱“Solr控制腳本參考”以了解如何傳遞系統(tǒng)參數(shù)的詳細(xì)信息),也可以在bin/solr.in.sh或者bin/solr.in.cmd中根據(jù)您的操作系統(tǒng)進(jìn)行相應(yīng)的定義。

solr.kerberos.delegation.token.enabled

默認(rèn)情況下為false,設(shè)置為true時啟用委派令牌。如果要啟用令牌,則此參數(shù)是必需的。

solr.kerberos.delegation.token.kind

代表令牌的類型。默認(rèn)為solr-dt。可能這不需要改變。目前沒有其他選項可用。

solr.kerberos.delegation.token.validity

代表令牌的有效時間,以秒為單位。默認(rèn)值是36000秒。

solr.kerberos.delegation.token.signer.secret.provider

代表令牌信息存儲在內(nèi)部。默認(rèn)值是zookeeper,必須是授權(quán)令牌在Solr服務(wù)器上工作的位置(在SolrCloud模式下運行時)。目前沒有其他選項可用。

solr.kerberos.delegation.token.signer.secret.provider.zookeper.path

秘密提供者信息所在的ZooKeeper路徑。這是路徑+ /安全/令牌的形式。路徑可以包含chroot,如果您不使用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。這個例子包括在chroot: server1:9983,server2:9983,server3:9983/solr/security/zkdtsm

啟動Solr

配置完成后,可以使用bin/solr腳本啟動Solr ,如下面的示例所示,僅適用于SolrCloud模式的用戶。這個例子假設(shè)你修改了bin/solr.in.sh或者bin/solr.in.cmd是正確的值,但是如果你沒有修改的話,你可以把系統(tǒng)參數(shù)和start命令一起傳遞。請注意,您還需要根據(jù)您的ZooKeeper節(jié)點的位置自定義該-z屬性。

bin/solr -c -z server1:2181,server2:2181,server3:2181/solr

測試配置

  1. 用你的用戶名做一個 kinit。例如:kinit user@EXAMPLE.COM。
  2. 嘗試使用curl訪問Solr。你應(yīng)該得到一個成功的回應(yīng):
    curl --negotiate -u : "http://192.168.0.107:8983/solr/"

使用SolrJ與Kerberized Solr

要在SolrJ應(yīng)用程序中使用Kerberos身份驗證,在創(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。這個負(fù)責(zé)人應(yīng)該與我們?yōu)镾olr創(chuàng)建的服務(wù)負(fù)責(zé)人不同。

這是一個例子:

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 可以用來獲取、取消和續(xù)訂委托令牌。
  • HttpSolrClient.Builder包括一個 withDelegationToken,用于創(chuàng)建使用委托令牌進(jìn)行認(rèn)證的HttpSolrClient 的函數(shù)。

獲取授權(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();

Hadoop 的委托令牌響應(yīng)采用 JSON 映射格式。DelegationTokenResponse 中提供了一個響應(yīng)分析器。其他響應(yīng)解析器可能無法很好地處理 Hadoop 響應(yīng)。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號