[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.위의 작동 방식은 멋지지만, 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.여전히 도움이 필요한지 확실하지 않습니다. "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()); }
from https://stackoverflow.com/questions/23561736/java-client-for-secure-hbase by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] hdfs 블록 크기보다 큰 XmlInputFormat 요소 구문 분석 (0) | 2019.06.21 |
---|---|
[HADOOP] CDH5.2 : MR, 출력 수집기를 초기화 할 수 없습니다. (0) | 2019.06.21 |
[HADOOP] Spark Pi : 원사를 사용한 클러스터 모드의 예 : 연관 손실 (0) | 2019.06.21 |
[HADOOP] 리플렉션을 사용하여 pojo의 마루 파일에 쓰기 (0) | 2019.06.21 |
[HADOOP] Hadoop Map의 데이터 공유 (0) | 2019.06.21 |