kerberos 认证 Unable to obtain password from user 异常排查

文章讲述了在生产环境中遇到Kerberos认证问题的过程,通过排查证书、Java应用和服务器环境,最终发现JDK版本升级可能导致认证失败,建议在遇到此类问题时检查JDK版本作为解决方案。

生产环境突然遇到kerberos 认证异常,java应用连接hive之前的认证异常
报Unable to obtain password from user

很常见的报错异常

一、排查证书

最开始怀疑证书的问题,对kerberos认证理解不深入,猜想大概证书异常
从服务器导出了新的证书,仍然不行,机器上没安装kerberos 客户端,所以证书导入其他有Hadoop的客户端的机器,验证了新证书没有问题

二、怀疑java应用的程序

因为是正常运行的时候突然不行了,不大可能是java 程序的问题,为了验证 特地写了一个demo 应用 部署了一下,发现仍然不行,这时候有点挑战了,
证书没问题,难道程序突然不行了

三、服务器环境排查

生产环境使用了华为的服务器,开始怀疑服务器环境导致,把验证程序部署到了通用服务器,结果验证通过,完全没有问题
定位到了服务器环境,又把验证程序部署到了另一台 华为服务器,验证了一下,发现可以,接下来对比两台服务器的差异

对比了基础配置,对齐了证书,用户
结果还是有一台验证不通过
这时候 想起来前一天 出问题的机器升级了jdk

难道jdk 会影响kerberos 认证过程。

网上搜索资料,发现部分资料提到jdk 版本会导致kerberos 认证异常

准备回退jdk,回退之后 发现认证成功

由于报错信息不明确,导致全程靠猜想

结论

当你遇到Unable to obtain password from user
时,写一个java demo 去不同环境测试 ,当确认证书没有问题,程序没有问题的时候,看看服务器环境jdk 版本。

<think>我们遇到的问题是:principal `data_quality` 从 keytab 文件 `user.keytab-a9338d9a-10ca-4715-b2e9-3e45d9422d23` 登录失败,错误信息为 `javax.security.auth.login.LoginException: Unable to obtain password from user`。 ### 问题分析 这个错误通常表示 Kerberos 认证过程中无法从 keytab 文件中获取到对应 principal 的密码(密钥)。可能的原因有: 1. **Keytab 文件中不存在指定的 principal**:keytab 文件可能没有包含名为 `data_quality` 的 principal。 2. **Principal 名称不匹配**:keytab 文件中 principal 的名称可能与尝试使用的名称不完全一致(包括域名等)。 3. **Keytab 文件损坏**:文件可能已损坏或格式不正确。 4. **Keytab 文件权限问题**:运行程序的用户可能没有权限读取该 keytab 文件。 5. **Keytab 文件路径错误**:提供的文件路径不正确。 ### 解决步骤 #### 1. 检查 keytab 文件中的 principal 列表 使用 `klist` 命令查看 keytab 文件中的 principal: ```bash klist -kt user.keytab-a9338d9a-10ca-4715-b2e9-3e45d9422d23 ``` 输出示例: ``` Keytab name: FILE:user.keytab-a9338d9a-10ca-4715-b2e9-3e45d9422d23 KVNO Timestamp Principal ---- ----------------- -------------------------------------------------------- 1 01/01/1970 00:00 data_quality@REALM 1 01/01/1970 00:00 another_principal@REALM ``` 请确认输出中是否包含 `data_quality`(注意域名部分是否匹配)。 #### 2. 验证 principal 名称 确保在代码中使用的 principal 名称与 keytab 文件中的完全一致,包括域名(如果有的话)。例如,如果 keytab 中的 principal 是 `data_quality@EXAMPLE.COM`,那么在代码中也必须使用完整的 principal。 #### 3. 检查 keytab 文件权限 确保运行程序的用户有权限读取 keytab 文件: ```bash ls -l user.keytab-a9338d9a-10ca-4715-b2e9-3e45d9422d23 ``` 如果权限不足,使用以下命令修改权限(根据实际安全要求调整): ```bash chmod 400 user.keytab-a9338d9a-10ca-4715-b2e9-3e45d9422d23 ``` #### 4. 测试使用 keytab 登录 使用 `kinit` 命令测试 keytab 文件是否可以成功认证: ```bash kinit -kt user.keytab-a9338d9a-10ca-4715-b2e9-3e45d9422d23 data_quality ``` 如果成功,则不会有任何输出;如果失败,会显示具体的错误信息。 #### 5. 检查 Kerberos 配置 确保 Kerberos 客户端配置文件 (`/etc/krb5.conf`) 配置正确,特别是域名解析和 KDC 服务器地址。 #### 6. 检查代码中的配置 在代码中,确保正确设置了 principal 和 keytab 路径。例如,在 Spark 应用中: ```scala System.setProperty("java.security.krb5.conf", "/etc/krb5.conf") val conf = new SparkConf() conf.set("spark.yarn.keytab", "user.keytab-a9338d9a-10ca-4715-b2e9-3e45d9422d23") conf.set("spark.yarn.principal", "data_quality@REALM") // 注意域名 ``` ### 常见问题及解决方法 - **Principal 不存在于 keytab 中**:重新生成 keytab 文件,将所需的 principal 加入。可以使用 `ktutil` 工具添加或使用 `kadmin` 重新导出。 - **域名不匹配**:在代码中使用完整的 principal 名称(包括域名)。 - **文件路径问题**:使用绝对路径指定 keytab 文件。 ### 相关问题 1. **如何重新生成 keytab 文件?** 使用 `kadmin` 进入管理界面,执行: ```bash kadmin -p admin_user -w admin_password kadmin: addprinc -randkey data_quality@REALM kadmin: ktadd -k /path/to/new.keytab data_quality@REALM ``` 然后使用新生成的 keytab 文件[^1]。 2. **如何在 Spark 应用中调试 Kerberos 认证?** 启用 Kerberos 调试日志:在 JVM 参数中添加 `-Dsun.security.krb5.debug=true`。 3. **Keytab 文件损坏如何修复?** 重新生成 keytab 文件(参考问题1)。 4. **多个 principal 在同一个 keytab 文件中会冲突吗?** 不会,keytab 文件可以包含多个 principal。 5. **Kerberos 认证过程中出现时钟偏差问题怎么办?** 确保所有节点的系统时间与 KDC 服务器同步(使用 NTP 服务)。 [^1]: Kerberos 管理指南 </think>### 解决 Kerberos 登录失败问题分析 根据错误 `javax.security.auth.login.LoginException: Unable to obtain password from user`,表明 Kerberos 无法从 keytab 文件中获取 principal `data_quality` 的凭证。以下是系统性的排查步骤: --- ### 排查步骤 1. **验证 keytab 文件有效性** ```bash klist -kte user.keytab-a9338d9a-10ca-4715-b2e9-3e45d9422d23 ``` - ✅ 成功情况:显示包含 `data_quality` 的 principal 列表 - ❌ 失败情况:显示 `Keytab contains no keys` 或缺失目标 principal *若无效,需重新生成 keytab[^1]* 2. **检查 principal 名称一致性** - 确认服务配置使用的 principal 完全匹配(含域名): ```bash # 提取 keytab 中的实际 principal klist -k user.keytab-a9338d9a-10ca-4715-b2e9-3e45d9422d23 | grep data_quality ``` - 典型完整格式:`data_quality/hostname@REALM` 3. **检查文件权限问题** ```bash ls -l user.keytab-a9338d9a-10ca-4715-b2e9-3e45d9422d23 ``` - 要求权限:`-r--------` (600) - 修复命令: ```bash chmod 600 user.keytab-a9338d9a-10ca-4715-b2e9-3e45d9422d23 chown <运行用户>:<组> user.keytab-a9338d9a-10ca-4715-b2e9-3e45d9422d23 ``` 4. **测试 keytab 认证** ```bash kinit -kt user.keytab-a9338d9a-10ca-4715-b2e9-3e45d9422d23 data_quality klist ``` - ✅ 成功:显示 `data_quality` 的 TGT 票据 - ❌ 失败:返回具体错误信息 5. **检查 Kerberos 配置** - 验证 `/etc/krb5.conf` 包含正确的域名和 KDC 配置: ```ini [libdefaults] default_realm = YOUR_REALM dns_lookup_kdc = true ``` --- ### 常见解决方案 1. **重建 keytab 文件**: ```bash kadmin -p admin -q "ktadd -k /path/to/new.keytab data_quality" ``` 2. **更新 JAAS 配置**: ```java KafkaClient { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true keyTab="/path/to/user.keytab-a9338d9a-10ca-4715-b2e9-3e45d9422d23" principal="data_quality@YOUR_REALM"; }; ``` 3. **检查域名大小写**: - Kerberos 域名严格区分大小写,确保所有配置使用相同大小写 --- ### 相关问题 1. **如何在不重启服务的情况下更新 keytab 文件?** *动态更新流程和验证方法[^1]* 2. **Kerberos 认证中时钟偏差问题如何解决?** *时间同步配置和误差阈值说明* 3. **多个服务共用 keytab 的安全风险有哪些?** *权限隔离最佳实践* 4. **如何诊断 Kerberos 票据续期失败问题?** *kinit 调试模式和日志分析技巧* 5. **跨域 Kerberos 认证需要哪些特殊配置?** *领域信任关系和 krb5.conf 跨域配置* [^1]: Kerberos 密钥表管理文档 [^2]: JAAS 配置规范
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值