Kerberos是大数据体系中常见的安全认证方案。Kerberos认证也是Hive所支持的认证方式中的一种。
作为客户端来说,与Simple认证相比,访问Kerberos会稍微有点不同。
Java中,有两种方式可简单访问Kerberos认证的Hive。
1.loginUserFromKeytab直接登录
源码如下所示:
public static void main(String[] args) {
Configuration conf = new Configuration();
conf.set("hadoop.security.authentication", "Kerberos");
UserGroupInformation.setConfiguration(conf);
try {
UserGroupInformation.loginUserFromKeytab("test-user/a123@ABC.COM", "/etc/test-user.keytab");
} catch (IOException e) {
logger.error("error in kerberos authentication", e);
throw new RuntimeException(e)
}
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = DriverManager.getConnection("jdbc:hive2://172.10.10.11:10001/default;transportMode=http;httpPath=cliservice;principal=test-user/a123@ABC.COM;auth=kerberos");
ps = conn.prepareStatement("use default");
ps.execute();
rs = ps.executeQuery("show tables");
while (rs.next()) {
logger.info(rs.getString(1));
}
} catch (Exception e) {
logger.error("error in hive-sql execution", e);
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
logger.error("error in closing resultset", e);
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
logger.error("error in closing statement", e);
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
logger.error("error in closing connection", e);
}
}
}
}
通过在逻辑代码中调用UserGroupInformation.loginUserFromKeytab方法,可直接对当前用户进行kerberos认证登录操作,认证完成后,可进行Hive的常规访问。
2.配置jaas
有些时候,无法做到手动执行loginUserFromKeytab操作,比如spark.read.jdbc操作时。
这里提供另外一种方案:通过配置jaas文件,java的jaas框架可自动识别并执行登录。
首先需要生成jaas配置文件——hivejaas.conf,内容如下
com.sun.security.jgss.initiate {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
keytab="my.keytab"
principal="{myprincipal}";
};
然后,在启动对应的demo应用时,添加以下JVM参数
-Djava.security.auth.login.config=/path/to/hivejaas.conf -Djavax.security.auth.useSubjectCredsOnly=false
注意,要加上javax.security.auth.useSubjectCredsOnly,要不然无法自动登录。