2016-11-14 21 views
1

我最近花了好幾個星期試圖讓WildFly成功連接到Kerberized Apache Phoenix數據源。有關如何做到這一點的文檔數量驚人的有限,但現在我已經破解它,我分享。如何使用WildFly連接到Kerberos保護的Apache Phoenix數據源?

環境:

  • WildFly 9+。一個等效的JBoss版本也應該工作(但未經測試)。 WildFly 8不包含所需的org.jboss.security.negotiation.KerberosLoginModule類(但您可以破解它,請參閱Kerberos sql server datasource in Wildfly 8.2)。我使用了WildFly 10.1.0.Final,並使用了獨立部署。
  • Apache Phoenix 4.2.0.2.2.4.10。我還沒有測試任何其他版本。
  • Kerberos v5。我的KDC在Windows Active Directory上運行,但這不應該造成明顯的差異。
  • 我的Hadoop環境是HortonWorks版本,由Ambari維護。 Ambari確保所有配置文件和Kerberos實施設置都是正確的。

回答

0

首先,你要添加的系統屬性WildFly的standalone.xml指定Kerberos配置文件的位置:我不打算進入krb5.conf的格式

... 
</extensions> 

<system-properties> 
    <property name="java.security.krb5.conf" value="/path/to/krb5.conf"/> 
</system-properties> 
... 

文件在這裏,因爲它依賴於你自己的Kerberos實現。重要的是它包含KDC的默認領域和網絡位置。在Linux上,您通常可以在/etc/krb5.conf/etc/security/krb5.conf上找到它。如果您在Windows上運行WildFly,請確保您在路徑中使用了正斜槓,例如"C:/Source/krb5.conf"

其次,將兩個新的安全域添加到standalone.xml - 一個名爲ZooKeeper使用的「Client」,另一個名爲「主機」,由WildFly使用。不要問我爲什麼(它給我造成了很大的痛苦),但「客戶端」安全域的名稱必須與服務器上Zookeeper的JAAS客戶端配置文件中定義的匹配。如果您已經設置了Ambari,則「客戶端」是默認名稱。還要注意的是,你不能簡單地提供一個jaas.config文件的系統屬性,則必須在此定義它:

<security-domain name="Client" cache-type="default"> 
    <login-module code="com.sun.security.auth.module.Krb5LoginModule" flag="required"> 
     <module-option name="useTicketCache" value="true"/> 
     <module-option name="debug" value="true"/> 
    </login-module> 
</security-domain> 
<security-domain name="host" cache-type="default"> 
    <login-module code="org.jboss.security.negotiation.KerberosLoginModule" flag="required" module="org.jboss.security.negotiation"> 
     <module-option name="useTicketCache" value="true"/> 
     <module-option name="debug" value="true"/> 
     <module-option name="refreshKrb5Config" value="true"/> 
     <module-option name="addGSSCredential" value="true"/> 
    </login-module> 
</security-domain> 

模塊的選項將根據您的實現而改變。我從默認的Java票據緩存中獲取票據,該緩存在JRE的java.security文件中定義,但如果需要,您可以在此處提供一個keytab。請注意,設置storeKeytrue打破了我的實現。檢查所有選項的Java文檔。請注意,每個安全域都使用不同的登錄模塊:這並非偶然 - Phoenix不知道如何使用org.jboss...版本。

現在您需要爲phoenix-<version>-client.jar中的org.apache.phoenix.jdbc.PhoenixDriver類提供WildFly。在WildFly目錄下創建以下目錄樹:

/modules/system/layers/base/org/apache/phoenix/main/

main目錄,粘貼鳳凰 - client.jar中,你可以找到在服務器上(例如,/usr/hdp/<version>/phoenix/client/bin),並創建一個module.xml文件:

<?xml version="1.0" ?> 

<module xmlns="urn:jboss:module:1.1" name="org.apache.phoenix"> 

    <resources> 
     <resource-root path="phoenix-<version>-client.jar"> 
      <filter> 
       <exclude-set> 
        <path name="javax" /> 
        <path name="org/xml" /> 
        <path name="org/w3c/dom" /> 
        <path name="org/w3c/sax" /> 
        <path name="javax/xml/parsers" /> 
        <path name="com/sun/org/apache/xerces/internal/jaxp" /> 
        <path name="org/apache/xerces/jaxp" /> 
        <path name="com/sun/jersey/core/impl/provider/xml" /> 
       </exclude-set> 
      </filter> 
     </resource-root> 
     <resource-root path="."> 
     </resource-root> 
    </resources> 

    <dependencies> 
     <module name="javax.api"/> 
     <module name="sun.jdk"/> 
     <module name="org.apache.log4j"/> 
     <module name="javax.transaction.api"/> 
     <module name="org.apache.commons.logging"/> 
    </dependencies> 
</module> 

您還需要從服務器hbase-site.xmlcore-site.xml粘貼到main目錄。這些通常位於/usr/hdp/<version>/hbase/conf/usr/hdp/<version>/hadoop/conf。如果你不添加這些,你會得到很多無益的ZooKeeper getMaster錯誤!如果您希望驅動程序登錄到WildFly所在的位置,則還應該在main目錄中創建一個log4j.xml文件。您可以在網絡上的其他地方找到示例。 <resource-root path="."></resource-root>元素是在由WildFly部署時將這些xml文件添加到類路徑中的。

最後,在<subsystem xmlns="urn:jboss:domain:datasources:2.0">部分添加一個新的數據源和驅動程序。您可以使用CLI做到這一點,或直接編輯0​​,我做了後者:

<datasource jndi-name="java:jboss/datasources/PhoenixDS" pool-name="PhoenixDS" enabled="true" use-java-context="true"> 
    <connection-url>jdbc:phoenix:first.quorumserver.fqdn,second.quorumserver.fqdn:2181/hbase-secure</connection-url> 
    <connection-property name="phoenix.connection.autoCommit">true</connection-property> 
    <driver>phoenix</driver> 
    <validation> 
     <check-valid-connection-sql>SELECT 1 FROM SYSTEM.CATALOG LIMIT 1</check-valid-connection-sql> 
    </validation> 
    <security> 
     <security-domain>host</security-domain> 
    </security> 
</datasource> 
<drivers> 
    <driver name="phoenix" module="org.apache.phoenix"> 
     <xa-datasource-class>org.apache.phoenix.jdbc.PhoenixDriver</xa-datasource-class> 
    </driver> 
</drivers> 

,你與你的環境的正確動物園管理員法定人數字符串替換first.quorumserver.fqdn,second.quorumserver.fqdn是很重要的。您可以在HBase配置目錄hbase-site.xml中找到它:hbase.zookeeper.quorum您不需要將Kerberos信息添加到連接URL字符串!

TL;博士

  • 確保hbase-site.xmlcore-site.xml在類路徑中。
  • 請確保您有一個名稱爲ZooKeeper(可能是「客戶端」)的<security-domain>,該名稱使用com.sun.security.auth.module.Krb5LoginModule
  • 鳳凰連接網址必須包含整個ZooKeeper法定人數。你不能錯過一臺服務器!確保它匹配hbase-site.xml中的值。

參考文獻:

+0

讓我知道如何可以手動啓動安全羣集上的查詢服務器和客戶端(瘦和胖客戶端) - HTTPS ://stackoverflow.com/questions/46444676/apache-phoenix-how-can-start-the-query-server-and-thin-client-on-kerberos-clus –