首先,你要添加的系统属性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。请注意,设置storeKey
到true
打破了我的实现。检查所有选项的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.xml
和core-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.xml
和core-site.xml
在类路径中。
- 请确保您有一个名称为ZooKeeper(可能是“客户端”)的
<security-domain>
,该名称使用com.sun.security.auth.module.Krb5LoginModule
。
- 凤凰连接网址必须包含整个ZooKeeper法定人数。你不能错过一台服务器!确保它匹配
hbase-site.xml
中的值。
参考文献:
让我知道如何可以手动启动安全群集上的查询服务器和客户端(瘦和胖客户端) - HTTPS ://stackoverflow.com/questions/46444676/apache-phoenix-how-can-start-the-query-server-and-thin-client-on-kerberos-clus –