2016-11-14 1 views
1

나는 최근에 WildFly가 Kerberos 화 된 Apache Phoenix 데이터 소스에 성공적으로 연결 되려고 몇 주를 보냈습니다. 이 작업을 수행하는 방법에 대한 문서의 의외로 제한된 금액이지만, 이제는 내가 그것을 부수고 나눠주었습니다.WildFly로 Kerberos 보안 Apache Phoenix 데이터 소스에 연결하는 방법?

환경 :

  • 제이보스 9+. 동일한 JBoss 버전도 작동해야합니다 (그러나 테스트되지 않은). WildFly 8에는 필요한 org.jboss.security.negotiation.KerberosLoginModule 클래스가 포함되어 있지 않습니다 (해킹 할 수 있음, Kerberos sql server datasource in Wildfly 8.2 참조). WildFly 10.1.0. 최종 사용 및 독립 실행 형 배포를 사용했습니다.
  • Apache Phoenix 4.2.0.2.2.4.10. 다른 버전은 테스트하지 않았습니다.
  • Kerberos v5. 내 KDC는 Windows Active Directory에서 실행되지만 눈에 띄는 차이는 없습니다.
  • My Hadoop 환경은 HortonWorks 버전이며 Ambari가 관리합니다. Ambari는 모든 구성 파일과 Kerberos 구현 설정이 올바른지 확인합니다.

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

    나는 krb5.conf의 형식으로 갈 않을거야 :

답변

0

첫째, 당신은 Kerberos 구성 파일의 위치를 ​​지정 제이보스의 standalone.xml에 시스템 속성을 추가 할 수 있습니다 파일은 Kerberos 구현에 따라 달라 지므로 여기에 파일을 작성하십시오. 중요한 것은 KDC의 기본 영역과 네트워크 위치가 포함되어 있다는 것입니다. 리눅스에서는 일반적으로 /etc/krb5.conf 또는 /etc/security/krb5.conf에서 찾을 수 있습니다. Windows에서 WildFly를 실행하는 경우 경로에 슬래시를 사용해야합니다 (예 : "C:/Source/krb5.conf"

둘째, 두 개의 새로운 보안 도메인을 standalone.xml에 추가하십시오. 하나는 ZooKeeper가 사용하는 "클라이언트"이고 다른 하나는 WildFly에서 사용하는 "호스트"라고하는 도메인입니다. 왜 (이 나를 괴롭혔는지)) "클라이언트"보안 도메인의 이름은 이어야합니다.은 서버의 사육사의 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> 

모듈 옵션은 구현에 따라 달라질 수 있습니다. JRE의 java.security 파일에 정의되어있는 기본 Java 티켓 캐시에서 내 티켓을 가져오고 있지만 원하는 경우 여기에 키탭을 제공 할 수 있습니다. storeKeytrue으로 설정하면 구현이 잘못되었습니다. 모든 옵션에 대해서는 Java 설명서를 확인하십시오. 각 보안 도메인은 다른 로그인 모듈을 사용합니다. 이는 우발적이지 않습니다. Phoenix는 org.jboss... 버전을 사용하는 방법을 모릅니다.

이제 org.apache.phoenix.jdbc.PhoenixDriver 클래스의 WildFly에 phoenix-<version>-client.jar을 제공해야합니다. 제이보스 디렉토리에 다음 디렉토리 트리를 만듭니다의 main 디렉토리에서

/modules/system/layers/base/org/apache/phoenix/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> 

는 또한 main 디렉토리 서버에서 hbase-site.xmlcore-site.xml 붙여 넣기 할 필요가있다. 이들은 일반적으로 /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하여이 작업을 수행 할 수 있습니다 직접 standalone.xml을 편집하여, 나는 후자를했다 :

<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. 연결 URL 문자열에 Kerberos 정보를 추가 할 필요가 없습니다!

TL; DR

  • 확인 hbase-site.xmlcore-site.xml이 클래스 경로에 있는지 확인하십시오.
  • com.sun.security.auth.module.Krb5LoginModule을 사용하는 ZooKeeper가 예상하는 이름 (아마도 "클라이언트")을 가진 <security-domain>이 있는지 확인하십시오.
  • Phoenix 연결 URL 은 전체 ZooKeeper 쿼럼이 포함 된이어야합니다. 하나의 서버를 놓칠 수 없습니다! 값이 hbase-site.xml과 일치하는지 확인하십시오.

참고 :

+0

수동으로 보안 클러스터에 쿼리 서버와 클라이언트 (얇은 두께 클라이언트) 시작할 수 있습니다 방법 알려주세요 - HTTPS를 : //stackoverflow.com/questions/46444676/apache-phoenix-how-can-start-the-query-server-and-thin-client-on-kerberos-clus –

관련 문제