복붙노트

[HADOOP] 보안 Hbase 용 Java 클라이언트

HADOOP

보안 Hbase 용 Java 클라이언트

안녕하세요, 보안 hbase 자바 클라이언트를 작성하려고합니다. 나는 usergroup 정보 클래스를 사용하고 있기 때문에 코드 자체에서 kinit을하고 싶다. 누군가 내가 여기서 잘못 가고있는 것을 지적 할 수 있을까요?

이것은 내가 hbase로부터 연결하려고하는 주된 방법입니다.

클라이언트가 어디서나 위치 할 수 있기 때문에 xml을 사용하는 대신 Config.xml 파일에 구성을 추가해야합니다.

아래 코드를 참조하십시오 :

    public static void main(String [] args) {
    try {
        System.setProperty(CommonConstants.KRB_REALM, ConfigUtil.getProperty(CommonConstants.HADOOP_CONF, "krb.realm"));
        System.setProperty(CommonConstants.KRB_KDC, ConfigUtil.getProperty(CommonConstants.HADOOP_CONF,"krb.kdc"));
        System.setProperty(CommonConstants.KRB_DEBUG, "true");

        final Configuration config = HBaseConfiguration.create();

        config.set(CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHENTICATION, AUTH_KRB);
        config.set(CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHORIZATION, AUTHORIZATION);
        config.set(CommonConfigurationKeysPublic.FS_AUTOMATIC_CLOSE_KEY, AUTO_CLOSE);
        config.set(CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY, defaultFS);
        config.set("hbase.zookeeper.quorum", ConfigUtil.getProperty(CommonConstants.HBASE_CONF, "hbase.host"));
        config.set("hbase.zookeeper.property.clientPort", ConfigUtil.getProperty(CommonConstants.HBASE_CONF, "hbase.port"));
        config.set("hbase.client.retries.number", Integer.toString(0));
        config.set("zookeeper.session.timeout", Integer.toString(6000));
        config.set("zookeeper.recovery.retry", Integer.toString(0));
        config.set("hbase.master", "gauravt-namenode.pbi.global.pvt:60000");
        config.set("zookeeper.znode.parent", "/hbase-secure");
        config.set("hbase.rpc.engine", "org.apache.hadoop.hbase.ipc.SecureRpcEngine");
        config.set("hbase.security.authentication", AUTH_KRB);
        config.set("hbase.security.authorization", AUTHORIZATION);
        config.set("hbase.master.kerberos.principal", "hbase/gauravt-namenode.pbi.global.pvt@pbi.global.pvt");
        config.set("hbase.master.keytab.file", "D:/var/lib/bda/secure/keytabs/hbase.service.keytab");
        config.set("hbase.regionserver.kerberos.principal", "hbase/gauravt-datanode2.pbi.global.pvt@pbi.global.pvt");
        config.set("hbase.regionserver.keytab.file", "D:/var/lib/bda/secure/keytabs/hbase.service.keytab");

        UserGroupInformation.setConfiguration(config);
        UserGroupInformation userGroupInformation = UserGroupInformation.loginUserFromKeytabAndReturnUGI("hbase/gauravt-datanode2.pbi.global.pvt@pbi.global.pvt", "D:/var/lib/bda/secure/keytabs/hbase.service.keytab");
        UserGroupInformation.setLoginUser(userGroupInformation);

        User user = User.create(userGroupInformation);

        user.runAs(new PrivilegedExceptionAction<Object>() {

            @Override
            public Object run() throws Exception {
                HBaseAdmin admins = new HBaseAdmin(config);

                if(admins.isTableAvailable("ambarismoketest")) {
                    System.out.println("Table is available");
                };

                HConnection connection = HConnectionManager.createConnection(config);

                HTableInterface table = connection.getTable("ambarismoketest");



                admins.close();
                System.out.println(table.get(new Get(null)));
                return table.get(new Get(null));
            }
        });
        System.out.println(UserGroupInformation.getLoginUser().getUserName());


    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

나는 다음 예외를 얻는다.

    Caused by: org.apache.hadoop.ipc.RemoteException(javax.security.sasl.SaslException): GSS initiate failed
at org.apache.hadoop.hbase.security.HBaseSaslRpcClient.readStatus(HBaseSaslRpcClient.java:110)
at org.apache.hadoop.hbase.security.HBaseSaslRpcClient.saslConnect(HBaseSaslRpcClient.java:146)
at org.apache.hadoop.hbase.ipc.RpcClient$Connection.setupSaslConnection(RpcClient.java:762)
at org.apache.hadoop.hbase.ipc.RpcClient$Connection.access$600(RpcClient.java:354)
at org.apache.hadoop.hbase.ipc.RpcClient$Connection$2.run(RpcClient.java:883)
at org.apache.hadoop.hbase.ipc.RpcClient$Connection$2.run(RpcClient.java:880)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491)
at org.apache.hadoop.hbase.ipc.RpcClient$Connection.setupIOstreams(RpcClient.java:880)
... 33 more

모든 포인터가 도움이 될 것입니다.

해결법

  1. ==============================

    1.위의 작동 방식은 멋지지만, Configuration 개체의 모든 올바른 속성을 설정하는 데 많은 어려움을 겪고 있습니다. 실제로 필요로하는 것과 필요하지 않은 것의 발견 된 사실상의 목록은 없으며 클러스터 구성에 힘들어합니다.

    위의 작동 방식은 멋지지만, Configuration 개체의 모든 올바른 속성을 설정하는 데 많은 어려움을 겪고 있습니다. 실제로 필요로하는 것과 필요하지 않은 것의 발견 된 사실상의 목록은 없으며 클러스터 구성에 힘들어합니다.

    확실한 방법은 classpath에 HBase 구성을 복사하는 것입니다. 클라이언트는 언급 한대로 어디서든 사용할 수 있기 때문입니다. 그런 다음 모든 속성을 지정하지 않고도 개체에 리소스를 추가 할 수 있습니다.

    Configuration conf = HBaseConfiguration.create();
    conf.addResource("core-site.xml");
    conf.addResource("hbase-site.xml");
    conf.addResource("hdfs-site.xml");
    

    이 접근법을 뒷받침 할 수있는 자료가있었습니다. IBM, Scalding (스칼라)

    또한이 방법은 실제로 사내 Zookeeper 보안 주체와 키탭을 사용하도록 제한하지 않습니다. 즉, 응용 프로그램이나 Active Directory 사용자를위한 키탭을 만들고 데몬이 자체적으로 인증하도록 내부에서 생성 된 키탭을 그대로 둘 수 있습니다.

  2. ==============================

    2.여전히 도움이 필요한지 확실하지 않습니다. "hadoop.security.authentication"속성을 설정하는 것이 스 니펫에서 누락 된 것 같습니다.

    여전히 도움이 필요한지 확실하지 않습니다. "hadoop.security.authentication"속성을 설정하는 것이 스 니펫에서 누락 된 것 같습니다.

    다음 코드 스 니펫을 사용하여 보안 HBase에 연결합니다 (CDH5). 시도해 볼 수 있습니다.

    config.set("hbase.zookeeper.quorum", zookeeperHosts);
    config.set("hbase.zookeeper.property.clientPort", zookeeperPort);
    config.set("hadoop.security.authentication", "kerberos");
    config.set("hbase.security.authentication", "kerberos");
    config.set("hbase.master.kerberos.principal", HBASE_MASTER_PRINCIPAL);
    config.set("hbase.regionserver.kerberos.principal", HBASE_RS_PRINCIPAL);
    
    UserGroupInformation.setConfiguration(config);
    UserGroupInformation.loginUserFromKeytab(ZOOKEEPER_PRINCIPAL,ZOOKEEPER_KEYTAB);
    
    HBaseAdmin admins = new HBaseAdmin(config);
    TableName[] tables  = admins.listTableNames();
    
    for(TableName table: tables){
        System.out.println(table.toString());
    }
    
  3. from https://stackoverflow.com/questions/23561736/java-client-for-secure-hbase by cc-by-sa and MIT license