ZooKeeper訪問控制

2018-12-27 15:05 更新

本節(jié)介紹如何在Solr中使用ZooKeeper訪問控制列表(ACL)。有關(guān)ZooKeeper ACL的信息,請參閱:http://zookeeper.apache.org/doc/r3.4.10/zookeeperProgrammers.html#sc_ZooKeeperAccessControl 的ZooKeeper文檔。

關(guān)于ZooKeeper ACL

SolrCloud使用ZooKeeper來共享信息和進行協(xié)調(diào)。

本節(jié)介紹如何配置Solr以將更多限制性的ACL添加到其創(chuàng)建的ZooKeeper內(nèi)容,以及如何告知Solr有關(guān)訪問ZooKeeper中內(nèi)容所需的憑據(jù)。如果你想在你的ZooKeeper節(jié)點中使用ACL,你必須激活這個功能。默認情況下,Solr行為是開放不安全的ACL,并且不使用任何憑據(jù)。

存儲在ZooKeeper中的內(nèi)容對于SolrCloud集群的運行至關(guān)重要。開放訪問ZooKeeper上的SolrCloud內(nèi)容可能會導致各種問題。例如:

  • 更改配置可能會導致Solr失敗或以非預期的方式運行。
  • 將群集狀態(tài)信息更改為錯誤或不一致的情況可能會使SolrCloud群集行為異常。
  • 添加由監(jiān)督員執(zhí)行的刪除集合作業(yè)將導致數(shù)據(jù)從群集中刪除。

如果您將ZooKeeper集合的訪問權(quán)限授予您不信任的實體,或者您希望減少由于下列原因?qū)е碌腻e誤操作的風險,則可能需要使用Solr啟用ZooKeeper ACL:

  • 進入你系統(tǒng)的惡意軟件。
  • 其他使用相同ZooKeeper集合的系統(tǒng)(一個“bad thing”可能是偶然發(fā)生的)。

如果你認為ZooKeeper中有些東西不是每個人都應(yīng)該知道的,你甚至可能想要限制讀取權(quán)限?;蛘吣憧赡苤皇窃谛枰赖幕A(chǔ)上進行一般性的工作。

保護ZooKeeper本身可能意味著許多不同的事情。本節(jié)是關(guān)于保護ZooKeeper中的Solr內(nèi)容。ZooKeeper內(nèi)容基本上一直存在于磁盤上,部分地存在于ZooKeeper進程的內(nèi)存中。本節(jié)不涉及在存儲或ZooKeeper進程級別保護ZooKeeper數(shù)據(jù) - 這是ZooKeeper需要處理的。

但是這個內(nèi)容也可以通過ZooKeeper API“外部”提供。外部進程可以連接到ZooKeeper并創(chuàng)建/更新/刪除/讀取內(nèi)容;例如,SolrCloud集群中的Solr節(jié)點想要創(chuàng)建/更新/刪除/讀取,并且SolrJ客戶端想要從集群中讀取。創(chuàng)建/更新內(nèi)容來設(shè)置內(nèi)容的ACL是外部進程的責任。ACL描述誰可以讀取,更新,刪除,創(chuàng)建等。ZooKeeper中的每個信息(znode / content)都有自己的一組ACL,并且不可能繼承或共享。Solr中的默認行為是在其創(chuàng)建的所有內(nèi)容上添加一個ACL - 一個允許任何人執(zhí)行任何操作的權(quán)限(在ZooKeeper術(shù)語中稱為“開放式不安全ACL(open-unsafe ACL)”)。

如何啟用ACL

我們希望能夠:

  1. 控制Solr用于其ZooKeeper連接的憑據(jù)。憑證用于獲取在ZooKeeper中執(zhí)行操作的權(quán)限。
  2. 控制ACL Solr將添加到它在ZooKeeper中創(chuàng)建的znodes(ZooKeeper文件/文件夾)。
  3. 從“外部”控制它,這樣您就不必修改或重新編譯Solr代碼即可將其打開。

Solr節(jié)點,客戶端和工具(例如ZkCLI)總是使用一個稱為SolrZkClient的java類來處理他們的ZooKeeper的東西。這里所描述的解決方案的實現(xiàn)就是要改變的SolrZkClient。如果您在您的應(yīng)用程序中使用SolrZkClient,則下面的描述也適用于您的應(yīng)用程序。

控制憑證

通過在solr.xml的<solrcloud>部分中配置zkCredentialsProvider屬性到類的名稱(在類別路徑上)來實現(xiàn) zkCredentialsProvider 接口,這可以控制將使用哪個憑據(jù)提供程序。在Solr分布中的server/solr/solr.xml,定義了zkCredentialsProvider如果定義了它,它將采用同名zkCredentialsProvider系統(tǒng)屬性的值(例如,通過取消注釋在solr.in.sh/.cmd中的SOLR_ZK_CREDS_AND_ACLS環(huán)境變量定義- 參見下文),或者如果不定義,則默認為DefaultZkCredentialsProvider實現(xiàn)。

開箱憑證實現(xiàn)

你總是可以自己實現(xiàn),但Solr有兩個實現(xiàn):

  • org.apache.solr.common.cloud.DefaultZkCredentialsProvider:它的getCredentials()返回一個長度為零的列表,或者“沒有使用憑據(jù)”。這是默認的。
  • org.apache.solr.common.cloud.VMParamsSingleSetCredentialsDigestZkCredentialsProvider:這使您可以使用系統(tǒng)屬性來定義憑據(jù)。它最多支持一組證書。
    • 架構(gòu)是“digest”。用戶名和密碼由系統(tǒng)屬性zkDigestUsername和zkDigestPassword定義。如果提供了用戶名和密碼,則這組憑證將被添加到getCredentials()返回的憑證列表中。
    • 如果上述一組憑證未添加到列表中,則此實現(xiàn)將回退到默認行為并使用DefaultZkCredentialsProvider(空)憑證列表。

控制ACL

通過在solr.xml的<solrcloud>部分中配置zkACLProvider屬性到類的名稱(在類別路徑上)來實現(xiàn) ZkACLProvider 接口,將會控制要添加的ACL。在Solr分布中的server/solr/solr.xml,定義了zkACLProvider,如果定義了它,它將采用同名zkACLProvider系統(tǒng)屬性的值(例如,通過取消注釋在solr.in.sh/.cmd中的SOLR_ZK_CREDS_AND_ACLS環(huán)境變量定義 - 參見下文),或者如果不定義,則默認DefaultZkACLProvider執(zhí)行。

開箱即用的ACL實現(xiàn)

你總是可以讓你自己實現(xiàn),但Solr有兩個實現(xiàn):

  • org.apache.solr.common.cloud.DefaultZkACLProvider:它為所有zNodePath-s 返回一個長度為1的列表。列表中的單個ACL條目是“不安全的”。這是默認的。
  • org.apache.solr.common.cloud.VMParamsAllAndReadonlyDigestZkACLProvider:這使您可以使用系統(tǒng)屬性來定義ACL。它的 getACLsToAdd () 實現(xiàn)對任何東西都不使用 zNodePath,所以所有的znode都會得到相同的一組ACL。它支持添加以下一個或兩個選項:
    • 允許執(zhí)行所有操作的用戶。
      • 該許可是“ALL”(對應(yīng)于所有的CREATE,READ,WRITE,DELETE,和ADMIN),而架構(gòu)是“digest”。
      • 用戶名和密碼分別由系統(tǒng)屬性zkDigestUsername和zkDigestPassword定義。
      • 除非提供用戶名和密碼,否則此ACL不會添加到ACL列表中。
    • 只允許執(zhí)行讀取操作的用戶。
      • 權(quán)限是READ以及架構(gòu)是digest。
      • 用戶名和密碼分別由系統(tǒng)屬性zkDigestReadonlyUsername和zkDigestReadonlyPassword定義。
      • 除非提供用戶名和密碼,否則此ACL不會添加到ACL列表中。
  • org.apache.solr.common.cloud.SaslZkACLProvider:需要SASL身份驗證。在使用SASL時,為系統(tǒng)屬性solr.authorization.superuser(默認: solr)中指定的用戶授予所有權(quán)限,并為其他任何人提供讀取權(quán)限。設(shè)計用于配置已經(jīng)設(shè)置且不會被修改的設(shè)置,或者通過Solr API控制配置更改的位置。這個提供程序?qū)⒃趉erberos環(huán)境中用于管理。在這樣的環(huán)境中,管理員希望Solr使用SASL對ZooKeeper進行身份驗證,因為這只能通過Kerberos與ZooKeeper進行身份驗證。

如果沒有上述ACL添加到列表中,則默認情況下將使用 DefaultZkACLProvider 的(空)ACL列表。

注意系統(tǒng)屬性名稱與證書提供程序VMParamsSingleSetCredentialsDigestZkCredentialsProvider(如上所述)重疊。這是為了讓兩個供應(yīng)商以一種很好的方式進行協(xié)作:通過限制兩個用戶(一個管理員用戶和一個只讀用戶),我們始終保護對內(nèi)容的訪問權(quán)限,而且我們始終使用與相同管理員用戶相對應(yīng)的憑據(jù)進行連接,基本上這樣我們可以對我們自己創(chuàng)建的內(nèi)容/ znode做任何事情。

您可以將只讀憑據(jù)提供給SolrCloud群集的“客戶端” - 例如,供SolrJ客戶端使用。他們將能夠讀取運行SolrJ客戶端所需的任何內(nèi)容,但是他們將無法修改ZooKeeper中的任何內(nèi)容。

Solr腳本中的ZooKeeper ACL

有兩個影響ZooKeeper ACL的腳本:

  • 對于* nix系統(tǒng):bin/solr&server/scripts/cloud-scripts/zkcli.sh
  • 對于Windows系統(tǒng):bin/solr.cmd&server/scripts/cloud-scripts/zkcli.bat

這些Solr腳本可以通過設(shè)置相應(yīng)的系統(tǒng)屬性來啟用ZK ACL:取消注釋以下內(nèi)容,并將密碼替換為您選擇的密碼,以便在以下文件中啟用上述VM參數(shù)ACL和憑證提供程序:

solr.in.sh:

# Settings for ZK ACL
#SOLR_ZK_CREDS_AND_ACLS="-DzkACLProvider=org.apache.solr.common.cloud.VMParamsAllAndReadonlyDigestZkACLProvider \
#  -DzkCredentialsProvider=org.apache.solr.common.cloud.VMParamsSingleSetCredentialsDigestZkCredentialsProvider \
#  -DzkDigestUsername=admin-user -DzkDigestPassword=CHANGEME-ADMIN-PASSWORD \
#  -DzkDigestReadonlyUsername=readonly-user -DzkDigestReadonlyPassword=CHANGEME-READONLY-PASSWORD"
#SOLR_OPTS="$SOLR_OPTS $SOLR_ZK_CREDS_AND_ACLS"

solr.in.cmd:

REM Settings for ZK ACL
REM set SOLR_ZK_CREDS_AND_ACLS=-DzkACLProvider=org.apache.solr.common.cloud.VMParamsAllAndReadonlyDigestZkACLProvider ^
REM  -DzkCredentialsProvider=org.apache.solr.common.cloud.VMParamsSingleSetCredentialsDigestZkCredentialsProvider ^
REM  -DzkDigestUsername=admin-user -DzkDigestPassword=CHANGEME-ADMIN-PASSWORD ^
REM  -DzkDigestReadonlyUsername=readonly-user -DzkDigestReadonlyPassword=CHANGEME-READONLY-PASSWORD
REM set SOLR_OPTS=%SOLR_OPTS% %SOLR_ZK_CREDS_AND_ACLS%

zkcli.sh:

# Settings for ZK ACL
#SOLR_ZK_CREDS_AND_ACLS="-DzkACLProvider=org.apache.solr.common.cloud.VMParamsAllAndReadonlyDigestZkACLProvider \
#  -DzkCredentialsProvider=org.apache.solr.common.cloud.VMParamsSingleSetCredentialsDigestZkCredentialsProvider \
#  -DzkDigestUsername=admin-user -DzkDigestPassword=CHANGEME-ADMIN-PASSWORD \
#  -DzkDigestReadonlyUsername=readonly-user -DzkDigestReadonlyPassword=CHANGEME-READONLY-PASSWORD"

zkcli.bat:

REM Settings for ZK ACL
REM set SOLR_ZK_CREDS_AND_ACLS=-DzkACLProvider=org.apache.solr.common.cloud.VMParamsAllAndReadonlyDigestZkACLProvider ^
REM  -DzkCredentialsProvider=org.apache.solr.common.cloud.VMParamsSingleSetCredentialsDigestZkCredentialsProvider ^
REM  -DzkDigestUsername=admin-user -DzkDigestPassword=CHANGEME-ADMIN-PASSWORD ^
REM  -DzkDigestReadonlyUsername=readonly-user -DzkDigestReadonlyPassword=CHANGEME-READONLY-PASSWORD

更改ACL方案

在運行Solr集群的整個過程中,您可能決定從一個不安全的ZooKeeper移動到一個安全的實例。更改在在solr.xml中配置的zkACLProvider將確保新創(chuàng)建的節(jié)點是安全的,但不會保護已有的數(shù)據(jù)。要修改所有現(xiàn)有的ACL,可以在Solr的ZkCLI中使用該updateacls命令。首先對定義在server/scripts/cloud-scripts/zkcli.sh(或在Windows上的zkcli.bat)上的SOLR_ZK_CREDS_AND_ACLS環(huán)境變量取消注釋,然后填寫admin-user和readonly-user的密碼 - 見上面 - 然后運行server/scripts/cloud-scripts/zkcli.sh -cmd updateacls /zk-path,或者在Windows上運行:server\scripts\cloud-scripts\zkcli.bat cmd updateacls /zk-path。

在ZK中更改ACL時,只能在SolrCloud群集停止時執(zhí)行。嘗試在Solr運行時執(zhí)行此操作可能會導致狀態(tài)不一致,并且某些節(jié)點無法訪問。

VM屬性:zkACLProvider和zkCredentialsProvider(包含在zkcli.sh/.bat的SOLR_ZK_CREDS_AND_ACLS環(huán)境變量中)控制著轉(zhuǎn)換:

  • 憑證提供程序必須是在節(jié)點上具有當前管理權(quán)限的憑證提供程序。省略時,該進程將不使用任何憑據(jù)(適用于不安全的配置)。
  • ACL提供程序?qū)⒂糜谟嬎阈碌腁CL。省略時,該過程將為所有用戶設(shè)置所有權(quán)限,從而消除存在的任何安全性。

zkcli.sh/.bat中未注釋的SOLR_ZK_CREDS_AND_ACLS環(huán)境變量將憑據(jù)和ACL提供程序設(shè)置為VMParamsSingleSetCredentialsDigestZkCredentialsProvider和VMParamsAllAndReadonlyDigestZkACLProvider實現(xiàn)。

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號