Kerberos 认证 javax.security.auth.logon.LoginException:拒绝链接 (Connection refused)

kerberos 服务重启之后异常

项目中用到了hive 和hdfs ,权限认证使用了Kerberos,因为机房异常,导致了Kerberos 服务重启,结果发现本来运行正常的应用服务hive 和hdfs 认证失败,报错信息是

典型的网络连接异常

排查思路

验证Kerberos 服务

首先想到Kerberos服务异常,防火墙拦截。通过hdfs 命令发现 Kerberos 服务正常。

后边自己写了一个hive 链接测试应用,发现同一台机器上可以正常验证通过访问hive。

排查为什么拒绝链接

应用本身上线有一段时间,期间未发生这种报错,所以思路集中在配置文件,服务器hosts配置方向,后边通过自己的测试服务 正常链接排除的环境因素那么就是程序本身问题,奇怪的点事本身服务运行正常,突然报异常了。

这个就有点奇怪,之后对比了代码发现

Kerberos 配置写法导致

正确的写法

java 复制代码
   try {
            Class.forName(JDBC_DRIVER);
 

            //登录Kerberos账号
            String keytabPath = "/opt/data/kerberos/" + keytab;

            Configuration configuration = new Configuration();
            configuration.set("hadoop.security.authentication", "Kerberos");
            configuration.set("java.security.krb5.conf", "/opt/data/kerberos/krb5.conf");
            UserGroupInformation.setConfiguration(configuration);

            UserGroupInformation.loginUserFromKeytab(krbUser, keytabPath);
            System.out.println("Kerberos 验证通过");

            Connection connection = null;
            ResultSet rs = null;
            PreparedStatement ps = null;
            try {
                connection = DriverManager.getConnection(CONNECTION_URL);
                ps = connection.prepareStatement("select * from ods_inc.k02_city");
                rs = ps.executeQuery();
                while (rs.next()) {
                    System.out.println(rs.getString(1));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException | IOException e) {
            e.printStackTrace();
            return "exception";
        }
        return "finish";

    }

产生异常的写法

java 复制代码
try {
            log.debug(keyTabPath);
            log.debug(confPath);
            //设置krb配置文件路径,注意一定要放在Configuration前面,不然不生效
            System.setProperty("java.security.krb5.conf", confPath);
            Configuration conf = new Configuration();
            //设置认证模式Kerberos
            conf.set("hadoop.security.authentication", "Kerberos");
            UserGroupInformation.setConfiguration(conf);
            //设置认证用户和krb认证文件路径
            UserGroupInformation.loginUserFromKeytab(krbUser, keyTabPath);
            log.info("Kerberos 验证成功");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("Kerberos 验证失败", e);
            throw new PluginException("Kerberos 验证失败", e);
        }

关键点是

System.setProperty("java.security.krb5.conf", confPath);

这个配置文件在Kerberos 服务重启之后不生效了。

至于为什么不生效,欢迎高手一起研究交流。

总结

Kerberos 服务认证 内嵌在jdk中,某些jdk版本会导致Kerberos 认证异常,Kerberos 认证抛出的异常信息不足,很多时候排查问题比较耗费时间甄别,这种突然爆出的异常 应该和程序初始化有关系,或者Kerberos 服务重启之后的某些因素影响。

问题比较罕见,如果应用服务中环境可以通过防火墙策略配置,不建议使用Kerberos 认真大数据组件。

相关推荐
敲代码的嘎仔19 分钟前
用 Redis 合并写 + DelayQueue 延迟检测,把视频播放进度写库频率降到 1/60
java·开发语言·数据库·redis·缓存·音视频·高并发
Q264336502336 分钟前
【有源码】基于机器学习的电信网络诈骗话术语义识别与可视化分析系统 XGBoost算法+Hadoop+Spark
大数据·hadoop·算法·机器学习·spark·毕业设计·课程设计
千里码aicood1 小时前
面向电商冷启动与数据稀疏性的协同过滤算法优化研究
大数据·算法·协同过滤
youyou-06061 小时前
AUTOSAR‑COM 常见问题 QA (1)
java·linux·服务器·单片机·汽车
谢亮_vipxieliang1 小时前
ValidX时间段验证详解:ISO 8601标准与简化格式
java·spring boot·后端·spring·spring cloud·hibernate
Lsetea1 小时前
Java 请求 HTTPS 报 PKIX path building failed:从证书链到 truststore 的完整排查
java·https·ssl证书·keytool·truststore
隔窗听雨眠1 小时前
Databend Cloud化简大数据架构完全指南:从多组件堆叠到两组件架构的实践路径
大数据·架构
KANGBboy1 小时前
doris+kafka安装部署(单机+集群)一网卡
大数据·kylin
IT研究室1 小时前
最新大数据毕业设计选题推荐-基于大数据的酵母菌蛋白质细胞定位数据分析与可视化-大数据-Spark-Hadoop-Bigdata
大数据·数据分析·课程设计
知福致福1 小时前
【技术复盘】Git 分支污染与提交污染事故排查与解法
大数据·git·elasticsearch