Hive Java Demo with kerberos


发布于 2020-08-16 / 34 阅读 / 0 评论 /
Java Demo访问Kerberos认证的Hive

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,要不然无法自动登录。