拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Ranger HA场景下为统一访问域名生成Kerberos票据的完整指南

做大数据平台安全相关的工作只要碰过 Ambari 和 Kerberos应该都有过这种体验Ambari 界面上一切正常服务也显示已启动结果客户端一调接口就报 GSSException或者直接甩给你一句Server not found in Kerberos database。最近我在做 Ranger HA 搭建正好被这种问题卡了一下午卡住我的不是 Ranger 本身而是整个链路里最容易被忽略的一环——为统一访问域名生成 Kerberos 票据。这篇就把这一步从头到尾拆开讲清楚内容包括为什么要用统一域名、票据到底该怎么生成和分发、配置改哪里以及排查问题时的几个关键思路。这次分享适合正在用 Ambari 管理 Hadoop 集群、已经开启 Kerberos、并且准备把 Ranger Admin 做成 HA 形态的运维和架构同学。如果你用的是其他方式部署的 Ranger思路也完全可复用只不过配置文件的路径和属性名需要对应调整。1. Ranger HA 场景下为什么“统一访问域名”是绕不开的坎1.1 Ranger HA 的基本架构和客户端访问模型Ranger 的 HA 架构核心是让 Ranger Admin 服务形成 Active/Standby 双节点甚至可以更多两个节点共享同一个策略数据库并通过内部协调机制决定谁是 Active。对外表现上策略插件、脚本、第三方系统去访问 Ranger 时理论上不应该关心哪一台是 Active它们只需要知道一个固定的入口地址即可。就是这个“固定入口地址”成了整个配置里最要命的部分。很多人在搭 HA 之前Ranger Admin 是单节点客户端直接访问某个主机名比如ranger-admin-01.example.com。Kerberos 环境下Ambari 的向导会自动帮这台机器生成一个形如HTTP/ranger-admin-01.example.comEXAMPLE.COM的 principal并放进 keytab。这时候一切正常因为客户端访问哪个主机名Kerberos 就用哪个主机名去请求服务票据服务端 keytab 里刚好有这个 principal认证就过了。一旦做成 HA问题立刻出现你不可能让客户端在两台主机名之间来回切换所以普遍做法是引入一个统一访问域名例如ranger.example.com通过 DNS、VIP 或者负载均衡转发到后端两台 Ranger Admin 节点。此时客户端请求里的主机名是ranger.example.comKerberos 就会去找HTTP/ranger.example.comEXAMPLE.COM这个 principal。Ambari 自动生成的是按单台主机名命名的 principal根本没有这一条于是认证直接失败。1.2 Kerberos 认证是按“主机名”的不是按“集群”这一节值得多花点笔墨因为很多人第一次遇到这个场景时会本能地怀疑是不是 DNS 没配好、是不是 LB 转发有问题而不会第一时间想到 Kerberos principal 的匹配逻辑。Kerberos 的 Service Principal NameSPN本质上是服务在网络中的唯一身份标识格式是服务类型/服务所在主机名REALM。客户端发起访问时会从 URL 里取出主机名部分拼成一个 SPN然后向 KDC 请求这个 SPN 对应的服务票据。KDC 负责查看自己数据库里有没有对应的 principal有就签发没有就报错。服务端拿到客户端发来的服务票据后用自己 keytab 里的 principal 来解密。这里的关键点在于客户端、KDC、服务端三方对“主机名”的认知必须完全一致。所以ranger.example.com如果解析到了ranger-admin-01客户端访问的 URL 仍然是https://ranger.example.com:6182/...Kerberos 不会因为 DNS 最终解析到哪台机器就改用那台机器的主机名去拼 SPN它只看请求 URL 里写的是什么。这一点特别容易让人绕进去。反过来说即使统一域名解析到了正确的机器但 KDC 里没有对应的 principal服务端 keytab 里也没有客户端无论如何都拿不到服务票据也就无法完成认证。1.3 Step2 在整个搭建链路中的前后位置如果你把 Ranger HA 搭建拆成几个步骤大致会是这样Step1准备两台以上 Ranger Admin 节点配置共享数据库安装 Ranger Admin 服务并确认节点间能正常协调。Step2为统一访问域名创建 Kerberos principal导出 keytab分发到所有 Ranger Admin 节点并修改 Ranger 的认证配置。Step3配置统一入口DNS、VIP 或负载均衡让客户端通过统一域名访问。Step4验证 HA 切换确认 Active 节点发生变化后策略插件仍能通过统一域名拉取策略。在这条链路里Step2 处于中间位置但它决定了 Step3 和 Step4 是否真正可用。如果跳过 Step2就算 VIP 和负载均衡配得再漂亮客户端一访问照样是认证失败。所以我的建议是在接入统一入口之前先把票据和认证链路打通否则后面排查问题的时候很难分清楚到底是入口转发问题还是 Kerberos 问题。2. 准备阶段弄清 KDC 类型、域名解析和票据清单2.1 确认 KDC 和 Ambari 的 Kerberos 集成方式动手之前先确认三件事KDC 是什么类型、Ambari 是用管理账号自动集成还是手动指定 principal、当前集群里 Ranger 各组件的 principal 命名规律是什么。常见的 KDC 有 MIT Kerberos、Active Directory、FreeIPA。Ambari 集成 Kerberos 时如果走的是默认向导它会自动帮你创建 principal 和 keytab生成的 keytab 一般放在各节点固定目录下比如/etc/security/keytabs/。这种情况下服务端已经有一套自动生成好的 keytab但都是基于物理主机名的缺少统一域名的条目。如果 Ambari 配置为手动管理 principal那你需要自己在 KDC 里补全所有条目本文的重点也在这里。你可以先在一台 Ranger Admin 节点上执行下面的命令看一下现有 keytab 里有哪些 principalklist -kt /etc/security/keytabs/rangeradmin.service.keytab正常情况下会看到类似这样的输出KVNO Timestamp Principal ---- ----------------- -------------------------------------------------------- 3 2024-01-10 10:30 HTTP/ranger-admin-01.example.comEXAMPLE.COM确认了现有 principal 的风格之后再决定怎么新增统一域名的条目。2.2 统一访问域名的解析路径VIP、LB 还是 DNS统一访问域名的解析方式会影响后续排查但不影响 Kerberos principal 的创建方式。常见做法有三种DNS A 记录直接指向当前 Active 节点简单直接但 HA 切换时 DNS 记录需要跟着变通常配合脚本或探活程序在 Active 切换后自动更新 DNS。VIP 方式两台 Ranger Admin 节点共用一个虚拟 IP通过 keepalived 之类的软件把 VIP 绑定到当前 Active 节点。客户端访问 VIP 的域名即可切换时 VIP 自动漂移。负载均衡方式用 HAProxy、Nginx 或云负载均衡器把 6182/6080 端口转发到后端两台节点。如果只做 L4 TCP 转发对 Kerberos 无影响如果做了 TLS 终止等 L7 处理则可能需要额外配置建议优先用 L4 透传。无论采用哪种方式客户端访问的 URL 主机名都必须是统一域名本身。KDC 里需要创建的 principal 也是基于这个统一域名而不是 VIP 的 IP也不是后端某台机器的主机名。理解这一点后面操作就不容易跑偏。2.3 需要准备的 principal 和 keytab 清单在 Kerberos 环境下Ranger 涉及的服务身份主要有几类各自用途不同不要混在一起。这里整理了一份我在实际操作中使用的清单Principal用途部署位置HTTP/ranger.example.comEXAMPLE.COMRanger Admin Web 服务对外提供 HTTPS/REST 服务时使用的 SPN用于 SPNEGO 认证所有 Ranger Admin 节点HTTP/ranger-admin-01.example.comEXAMPLE.COMAmbari 自动生成的原有 SPN按需保留ranger-admin-01 节点HTTP/ranger-admin-02.example.comEXAMPLE.COMAmbari 自动生成的原有 SPN按需保留ranger-admin-02 节点rangeradmin/hostnameEXAMPLE.COMRanger Admin 进程访问后端组件如 HDFS 等时使用的用户身份Ranger Admin 节点Ambari 自动生成rangerusersync/hostnameEXAMPLE.COMRanger Usersync 同步用户/用户组时的身份Ranger Usersync 节点Ambari 自动生成需要手动新增的只有第一行也就是HTTP/ranger.example.comEXAMPLE.COM。后面几行通常是 Ambari 已经自动生成好的不需要动但如果确认缺失也需要一并处理。如果你使用了 Kerberos 环境中常见的做法——把同一个 keytab 文件分发到多台机器那要注意Kerberos 协议本身允许多个服务端持有同一个 service principal 的 keytab因为服务票据加密的密钥来自 KDC多个拥有相同 keytab 的节点都能解密。这也是 Ranger HA 场景下分发统一域名 keytab 的协议基础。3. 生成与分发给统一访问域名签发 keytab 的完整操作3.1 在 KDC 中创建 SPN 对应的 principal进入 KDC 管理端使用 kadmin.local 或 kadmin 命令创建 principal。以 MIT Kerberos 环境为例如果当前登录用户有 KDC 管理权限可以直接执行kadmin.local -q addprinc -randkey HTTP/ranger.example.comEXAMPLE.COM这里的-randkey参数表示生成随机密钥不需要手动设置密码这是给服务端 keytab 用时的标准做法。如果使用 Active Directory 作为 KDC需要用ktpass或setspn工具注册 SPN原理和这里一致命令不同。创建完成后可以顺手验证一下 principal 确实存在kadmin.local -q getprinc HTTP/ranger.example.comEXAMPLE.COM看到输出里列出了 principal 名称、过期时间、密钥版本号kvno等信息就说明创建成功。一个小细节统一域名中的主机名部分建议全部使用小写字母。Kerberos realm 默认区分大小写虽然可以配置大小写转换规则但为了少踩坑统一小写是最稳妥的。3.2 导出 keytab 的两种方式与注意事项创建 principal 之后要把对应的密钥导出到 keytab 文件。推荐的做法是使用 kadmin 的ktadd导出到临时目录再分发到目标机器。这里有一个容易忽略的参数-norandkey。kadmin.local -q ktadd -k /tmp/rangeradmin.service.keytab -norandkey HTTP/ranger.example.comEXAMPLE.COM-norandkey的含义是导出 keytab 时不要重新随机化密钥。也就是说导出的 keytab 与 KDC 里当前存储的密钥保持一致密钥版本号kvno不会变化。有的环境下不加这个参数也可能正常但有时会发现导出后 KDC 里的 kvno 变了旧的 keytab 没同步导致服务端认证失败。为了安全起见我在实际操作中固定使用-norandkey。另外考虑到加密类型enctype如果你在 keytab 导出后发现老版本 JDK 或某些组件不识别 AES-256 加密类型的密钥需要检查 KDC 配置和 JDK 的 JCE 策略。在较新的 JDK 版本中AES-256 默认支持问题不大如果遇到Unsupported keysize或类似报错再按实际环境调整加密类型。导出完成后可以用下面的命令查看 keytab 内容ktutil list或者用klist -kt /tmp/rangeradmin.service.keytab检查输出中是否包含HTTP/ranger.example.comEXAMPLE.COM并确认 KVNO 与 KDC 一致。3.3 keytab 分发、属主与权限设置keytab 相当于服务器的密码文件权限设置要严格。Ranger Admin 进程一般以ranger用户运行所以 keytab 文件需要让ranger用户可读。我的做法是把 keytab 分发到所有 Ranger Admin 节点的固定目录命名为rangeradmin.service.keytab和 Ambari 自动生成的文件区分开避免混淆。具体的分发命令可以这样写scp /tmp/rangeradmin.service.keytab ranger-admin-01:/etc/security/keytabs/rangeradmin.service.keytab scp /tmp/rangeradmin.service.keytab ranger-admin-02:/etc/security/keytabs/rangeradmin.service.keytab然后在每台节点上设置属主和权限chown ranger:hadoop /etc/security/keytabs/rangeradmin.service.keytab chmod 400 /etc/security/keytabs/rangeradmin.service.keytab这里的属主组不一定是hadoop以你环境里 Ambari 生成的 keytab 实际属主为准。最简单的方式是看一眼同目录下其他 keytab 文件的属主和权限照着改就行。注意不要为了方便一次性把 keytab 文件权限设置成 644。虽然某些实现不检查权限但权限过宽属于安全隐患而且容易在安全审计时被揪出来。保持 400 或 600 即可。3.4 修改 Ranger Admin 的 Kerberos 配置并触发生效keytab 分发完成后要让 Ranger Admin 使用这个新的 principal 和 keytab。不同版本的 Ambari/Ranger配置项名称略有差异但大方向一致。在 Ambari UI 中进入 Ranger 服务找到 Configs 下的Advanced ranger-admin-site搜索kerberos重点确认这几个配置项ranger.service.https.attrib.kerberos.principal设置为HTTP/ranger.example.comEXAMPLE.COMranger.service.https.attrib.kerberos.keytab设置为/etc/security/keytabs/rangeradmin.service.keytab如果环境使用的是 HTTP不推荐生产环境直接用 HTTP则对应配置项可能是ranger.service.http.attrib.kerberos.principal和ranger.service.http.attrib.kerberos.keytab。除了这两个直接和 SPNEGO 认证相关的配置之外Ranger Admin 还会通过 JAAS 配置文件加载 keytab。旧版本里这个文件通常位于/etc/ranger/admin/conf/ranger-admin-jaas.conf或类似路径新版本里可能叫ranger_jaas.conf。文件内部大致长这样KeytabBackedLoginModule { com.sun.security.auth.module.Krb5LoginModule required keyTab/etc/security/keytabs/rangeradmin.service.keytab principalHTTP/ranger.example.comEXAMPLE.COM useKeyTabtrue storeKeytrue useTicketCachefalse; };如果你在 Ambari 界面上只修改了 ranger-admin-site 里的属性但没有同步修改 JAAS 文件重启后可能仍读取旧的 keytab 路径。稳妥起见两种方式都检查一遍。JAAS 文件修改后不需要通过 Ambari直接重启 Ranger Admin 服务即可生效。完成配置修改后在 Ambari UI 上重启 Ranger Admin 服务。重启时注意观察 Ranger Admin 的日志文件通常位于/var/log/ranger/admin/下。确认日志中没有读取 keytab 失败的异常服务正常启动后再进行下一步验证。3.5 用 curl 和 klist 实测认证链路配置完成不等于真的能用必须实测认证链路。我习惯分两步验证。第一步在客户端机器上用统一域名的 principal 做一次本地kinit确认能拿到 TGTkinit -k -t /etc/security/keytabs/rangeradmin.service.keytab HTTP/ranger.example.comEXAMPLE.COM klist这里-k表示使用 keytab 认证-t指定 keytab 文件。如果客户端机器上没有这个 keytab也可以用普通账号先kinit一个 TGT原理上一样只是测试身份不同。第二步用curl的 SPNEGO 方式访问 Ranger 的 REST 接口curl -k -u : --negotiate https://ranger.example.com:6182/service/ppolicy/index.html注意-u :不能省略它配合--negotiate表示使用当前 Kerberos 缓存里的票据。如果返回 HTTP 200 而不是 401说明认证链路已经通了。如果想进一步验证 Ranger 的策略下载接口这是插件实际使用的接口可以请求这样的 URLcurl -k -u : --negotiate https://ranger.example.com:6182/service/plugins/policies/download这个接口通常还需要传递 service 名称等参数。不需要过于深入只要确认前面那个接口能返回 200基本可以判断 SPNEGO 认证已经正常。如果有时间建议把两台 Ranger Admin 节点都分别通过统一域名访问一遍确认 keytab 在每台节点上都能正常工作。4. 故障排查从报错反推配置问题的实录4.1 高频报错与排查思路速查表我在搭建和模拟故障切换的过程中遇到过几类典型问题整理成一张速查表方便你对照排查。报错现象可能原因排查方向Server not found in Kerberos databaseKDC 中没有对应的HTTP/ranger.example.comEXAMPLE.COM确认 KDC 里 principal 是否创建确认客户端请求 URL 的主机名是否与 SPN 完全一致GSSException: Defective token detected/ 401服务端 keytab 里没有匹配的 principal或者 keytab 权限不对用klist -kt检查 keytab确认服务进程用户可读 keytab浏览器/curl 弹出 401没有任何 GSS 相关报错客户端没有可用的 TGT或协商失败先klist确认有 TGT再确认 curl 是否带了--negotiate和-u :Clock skew too great客户端和服务端时间偏差超过 Kerberos 默认容忍范围通常 5 分钟检查 NTP 同步状态校准所有节点时间使用 IP 访问时报Server not found但用域名访问正常krb5.conf 反向解析或 SPN 构造走的是 IP客户端统一用域名检查 krb5.conf 的rdns设置Ambari 重启后自定义配置被覆盖Ambari 在重启或 Kerberos 配置重新应用时覆盖了手动改的配置在 Ambari 服务配置里修改并保存避免直接改文件第一条报错是最常见的尤其是你刚刚搭好 HA 环境但还没创建统一域名 principal 的时候。解决思路很直接确认客户端访问的是ranger.example.com而不是某一台具体主机名然后到 KDC 里查HTTP/ranger.example.comEXAMPLE.COM是否存在。两边对齐问题基本消失。4.2 三个容易忽略的细节第一个细节是 krb5.conf 的rdns参数。有些环境里客户端请求的 URL 用域名但服务器端做反向 DNS 解析把请求来源解析成了另一台机器的反向记录导致 SPN 匹配失败。这个不是特别常见但一旦遇到会非常难排查。建议在/etc/krb5.conf的libdefaults段里确认rdns false。第二个细节是 keytab 的 kvno 不一致。如果 KDC 里的 principal 因为某种原因被重新设置过密码或密钥kvno 会递增。如果 keytab 文件里的 kvno 还停留在旧的版本服务端解密就会失败。检查方法就是把klist -kt的输出和kadmin.local -q getprinc ...输出的 kvno 做对比。不一致就重新导出一次 keytab。第三个细节是 Ambari Kerberos 向导重新运行时的覆盖行为。如果你通过 Ambari 界面的“Kerberos Security”重新执行了 Kerberos 配置流程Ambari 有可能重新生成或覆盖 keytab。到时候你手动添加的HTTP/ranger.example.com条目可能还在因为它不在 Ambari 的自动管理列表里但需要留意 Ambari 是否把你的 JAAS 文件或 ranger-admin-site.xml 里的自定义配置回滚了。最稳的做法是修改配置一律在 Ambari UI 的配置页里操作保存后让它触发重启不要只改服务器上的文件。4.3 我的几个实操避坑心得第一keytab 文件尽量多准备一套副本放在安全的位置。因为 Ranger HA 环境下你需要往所有 Ranger Admin 节点分发同一个 keytab一旦漏掉其中一台故障切换后你才会发现认证失败而且这种失败特别隐蔽——从 Ambari 上看服务都是正常的可实际请求已经 401 了。预先在所有节点上统一分发好能省掉后面大量的排查时间。第二统一访问域名的 SPN 要和 Ambari 里 Ranger 服务使用的主机名区分开。很多人在配置时会把ranger.example.com和实际的节点主机名搞混导致 keytab 里存的 principal 和 Ranger 配置里写的不一致。我的做法是在创建 principal、导出 keytab、修改配置时全部复制粘贴统一域名不手敲避免大小写或拼写差异。第三日志永远是最好的老师。Ranger Admin 启动过程中相关认证日志会打在/var/log/ranger/admin/下。遇到问题不要急着改配置先看日志里有没有类似KeyTab、principal、GSS的关键字。有一次我排查了很长时间其实只是 keytab 路径写错了一个字母日志里白纸黑字写着找不到文件。先看日志再动手改配置这是效率最高的路径。5. 验证 HA 切换后票据仍然可用统一域名的票据配置完成后不要以为万事大吉。最后一步建议做一个故障切换演练确保在 Active/Standby 切换后统一域名的认证仍然正常。具体操作方式取决于你的 Ranger Admin 集群情况。通常可以把当前 Active 节点的 Ranger Admin 服务手动停止观察 Standby 节点是否自动顶上。切换完成后再用前面提到的curl --negotiate方法访问统一域名确认返回正常。如果切换后认证失败优先检查新 Active 节点上的 keytab 是否分发到位、JAAS 配置是否正确、Ranger 配置项是否一致。我自己在演练过程中还发现一个现象有些环境的 Ranger HA 切换依赖于数据库中的协调状态切换过程需要一点时间刚切换完立刻请求可能因为服务还没完全就绪而报连接拒绝。这种情况下不要急着判断认证有问题先等几十秒再试一次。如果始终失败再看目录日志和服务状态。另外补充一点Ranger 的策略插件比如 HDFS、Hive 的 Ranger 插件在启动时会通过服务端配置的 Ranger 地址拉取策略。如果这些插件配置的是统一域名它们同样需要能够通过 Kerberos 完成 SPNEGO 认证。所以统一域名的票据不仅仅服务于浏览器用户也服务于集群内部插件。建议在完成 HA 切换演练后顺手找一个已经启用 Ranger 插件的组件比如 HDFS 或 Hive确认它的审计或策略拉取日志里没有认证失败记录这才算真正闭环。按照这个流程走下来Step2 的票据生成工作基本就稳了。我的经验是Kerberos 环境下的 HA 搭建最怕的不是步骤多而是“看起来都对了实际全不对”。所以每完成一个环节就立刻用命令行去验证认证链路不要攒到最后统一测。统一域名看似只是一个名字但背后牵连的是 KDC、keytab、服务配置、客户端解析和组件插件一整条链路任何一环断了表面症状都一样——401 或者 GSS 报错。先把链路照清楚再动手去改能省下大量时间。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门