ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

大数据平台安全策略:Kerberos、Sentry与Ranger的协同实践

大数据平台安全策略:Kerberos、Sentry与Ranger的协同实践

1. 从一次权限失控的排查说起:为什么大数据平台绕不开Kerberos、Sentry和Ranger

刚接手一个离线数仓集群那会儿,我遇到过一次挺典型的事故:某个业务方的分析师在跑一段临时SQL时,误把一张核心明细表的全量数据导到了自己的临时目录,而这张表按规范只应该对风控团队开放。事后复盘发现,问题不在SQL本身,而在于集群当时只做了简单的账号密码登录,谁登录进来、能碰哪些库、能读哪些列,几乎全靠"自觉"。这件事之后,我们花了大概两周时间,把认证、授权、审计这三块重新梳理了一遍,核心就是三个组件:Kerberos、Sentry、Ranger。

这三个词经常被放在一起提,但很多人对它们的边界其实是模糊的。简单说,Kerberos解决的是"你是谁"的问题,也就是身份认证;Sentry和Ranger解决的是"你能干什么"的问题,也就是授权。前者是入场券,后者是场内通行规则。三者配合,才构成一套完整的大数据平台安全策略。这篇文章我会从实际落地的角度,把这三个组件的定位、配置要点、踩过的坑,以及它们之间怎么协同,尽量讲透。适合正在搭建或维护Hadoop生态集群、被权限问题折腾过的运维和开发同学参考,也适合刚接触大数据安全、想搞清楚这几个名词到底差在哪的入门者。

需要先说明一点:Sentry和Ranger在功能上有重叠,很多团队只会选其中一个。它们不是必须同时上,选型取决于你的集群组件构成和团队习惯。下面我会分别拆开讲,再讲它们怎么和Kerberos串起来。

2. Kerberos在大数据集群里到底扮演什么角色

2.1 没有Kerberos的集群,等于门没锁

在没启用Kerberos的Hadoop集群里,默认情况下任何能连上NameNode或HiveServer2的人,都可以伪装成任意用户提交任务。因为早期的Hadoop假设集群运行在一个"可信网络"内,用户身份靠客户端自己声明。你只要在提交任务时写-Duser.name=hdfs,服务端就真把你当成hdfs。这在内部测试环境无所谓,但一旦集群承载了多业务方数据,这就是个巨大的口子。

Kerberos的作用,就是把这个"自报家门"的模式,换成"出示证件"。它基于对称密钥和票据(Ticket)机制,用户先向KDC(Key Distribution Center,密钥分发中心)证明自己的身份,拿到一张TGT(Ticket Granting Ticket),再用TGT去换取访问具体服务(比如HDFS、Hive)的Service Ticket。整个过程用户不需要在每次访问时输入密码,票据有有效期,过期自动失效。

这里有个关键概念叫Principal,可以理解成"身份标识",格式通常是用户名/实例@REALM,比如hive/host1@EXAMPLE.COM。服务端也有自己的Principal,客户端访问服务时,双方通过KDC完成一次双向验证。这套机制的好处是:密码不在网络上传输,票据有生命周期,且可以做到服务端和客户端互相确认身份,防止中间人冒充。

2.2 落地Kerberos时最容易卡住的几个点

理论听着顺,但真配起来,Kerberos是这三个组件里最容易让人抓狂的。我整理了几个高频卡点。

第一,时间同步。Kerberos对时间极其敏感,默认允许的时钟偏差是5分钟。如果KDC和集群节点时间不同步,票据会被判定为无效,报错通常是Clock skew too great。所以部署前务必确保所有节点都指向同一个NTP源。这个坑我踩过,当时一台新加的节点忘了配NTP,结果它上面的任务全部认证失败,排查了半天才发现是时间差了两分多钟。

第二,Principal和Keytab的对应关系。服务端每个需要认证的服务,都要有自己的Principal和对应的Keytab文件(存着密钥的文件)。Keytab相当于服务的"长期密码",服务启动时用它向KDC证明自己。常见错误是Keytab里存的Principal和服务配置里写的不一致,或者Keytab权限没设好被其他用户读走。Keytab文件权限一般要设成400或440,属主是运行该服务的用户。

第三,客户端配置。用户机器上要有krb5.conf(指向KDC)和krb5.keytab(如果需要免密)。很多"认证失败"其实不是服务端问题,而是客户端krb5.conf里的realm大小写、KDC地址写错了。建议先用kinit命令手动测试:kinit -kt user.keytab user@REALM,再用klist看票据是否拿到。这一步能快速定位是客户端还是服务端的问题。

第四,Hadoop各组件对Kerberos的支持程度不一。HDFS、YARN、Hive这些核心组件支持很成熟,但一些周边工具(比如某些调度器、监控agent)可能对Kerberos支持不完善,需要额外配置或者用代理用户(proxy user)的方式绕过。代理用户是个双刃剑,配不好等于开了后门,后面讲授权时会再提。

提示:Kerberos只负责认证,不负责授权。也就是说,用户通过Kerberos证明了"我是张三",但张三能不能读某张表,Kerberos不管。这就是为什么还需要Sentry或Ranger。

3. Sentry:为Hive和Impala量身定做的授权方案

3.1 Sentry的设计思路:基于角色的细粒度控制

Sentry是早期Cloudera系产品里主推的授权组件,主要服务于Hive、Impala这些SQL引擎。它的核心模型是Role(角色):权限不直接授予用户,而是授予角色,再把角色授予用户或用户组。这样做的好处是权限管理可以批量化和结构化,比如"数据分析师"这个角色统一拥有某几个库的SELECT权限,新来的人只要加入这个角色就行。

Sentry的权限粒度可以细到库、表、列,甚至视图。比如你可以规定某用户只能看orders表的order_id和amount两列,其他列(比如用户手机号)不可见。这种列级权限在合规要求高的场景里非常有用。它通过Hive的hook机制拦截SQL,在编译阶段就判断权限,没权限直接拒绝,不会等到执行时才报错。

Sentry的权限模型大致分几层:Server(服务级,比如HiveServer2)、Database、Table、Column,还有URI(针对HDFS路径)。授权语句类似SQL,比如:

-- 创建角色 CREATE ROLE analyst; -- 授予角色对某库的SELECT权限 GRANT SELECT ON DATABASE sales TO ROLE analyst; -- 把角色授予用户组 GRANT ROLE analyst TO GROUP data_team;

这套语法对熟悉SQL的人来说上手很快。但要注意,Sentry的权限是叠加的,用户最终权限是它所有角色权限的并集,没有"拒绝优先"的概念。也就是说,你没法显式地拒绝某个权限,只能通过不授予来实现。这点和某些系统的"deny优先"逻辑不同,设计权限时要留意。

3.2 Sentry实际使用中的几个坑

坑一:Sentry和HDFS权限的联动。Sentry管的是SQL层权限,但底层数据还是存在HDFS上。如果一个用户通过Sentry拿到了某张表的SELECT权限,但HDFS上那个文件目录的权限不允许他读,任务照样会失败。反过来,如果HDFS权限过松,用户可能绕过Sentry直接用hdfs dfs -cat读文件。所以Sentry通常要配合HDFS ACL和Kerberos一起用,确保底层文件权限和上层SQL权限一致。实践中,很多团队会让Hive的仓库目录属主是hive,其他用户通过HiveServer2访问,不直接碰HDFS。

坑二:Sentry对非SQL组件支持有限。Sentry主要覆盖Hive和Impala,对HBase、Kafka、YARN队列等的授权支持较弱或没有。如果你的集群组件很杂,Sentry可能不够用,这也是后来Ranger流行起来的原因之一。

坑三:角色继承和权限膨胀。角色可以嵌套(角色授予角色),用久了容易出现"这个角色到底有哪些权限"说不清的情况。建议定期用SHOW ROLE GRANT之类的命令导出权限清单做审计,避免权限越滚越大。

坑四:和Kerberos配合时的代理用户问题。HiveServer2在Kerberos环境下,通常以hive这个Principal运行,但实际执行SQL的用户是登录的用户。这中间靠**代理用户(proxy user)**机制传递身份。如果hive-site.xml里的代理用户配置不对,会出现"所有操作都以hive身份执行"的情况,Sentry的权限判断就失效了。配置项主要是hadoop.proxyuser.hive.hosts和hadoop.proxyuser.hive.groups,要明确允许哪些主机和组的用户被代理。

4. Ranger:覆盖面更广的统一授权中心

4.1 Ranger凭什么成为很多团队的首选

Ranger最早由Hortonworks推动,后来随着社区融合,逐渐成为Apache顶级项目。它和Sentry最大的区别在于覆盖面:Ranger通过插件(plugin)的方式,支持HDFS、Hive、HBase、Kafka、YARN、Storm、Solr等一大堆组件,基本上主流的大数据组件都能纳管。对于组件多、希望统一权限入口的团队,Ranger的吸引力很大。

Ranger的架构分两部分:Ranger Admin(管理端,提供Web UI和REST API,存策略)和Ranger Plugin(嵌入在各个组件进程里,负责实际鉴权)。策略在Admin上配置,插件定期拉取策略缓存到本地,鉴权时直接查本地缓存,性能损耗小。这种设计让Ranger既能集中管理,又不至于每次鉴权都远程调用,实用性很强。

Ranger的策略模型比Sentry更灵活,支持允许(Allow)和拒绝(Deny)两种规则,且Deny优先。这意味着你可以先给一个大范围允许,再针对特定用户或IP做精确拒绝。它还支持基于**标签(Tag)**的授权,比如给某些列打上"敏感"标签,然后规定"所有带敏感标签的列,只有合规角色能访问",这种基于标签的方式在数据分类分级场景里特别好用。

4.2 Ranger策略配置的实操要点

Ranger的Web UI里,每个组件有独立的策略页面。以Hive为例,一条策略通常包含:资源(库、表、列、URL)、用户/组、权限(select、update、create等)、条件(IP范围、时间等)、允许/拒绝。配置时几个经验点:

  • 资源匹配支持通配符,比如sales_*匹配所有以sales开头的库。但通配符用多了会让策略难以审计,建议核心库用精确匹配。
  • 策略优先级:Ranger按策略的"拒绝优先、具体优先"原则匹配。一条针对具体表的Deny会覆盖针对整个库的Allow。配置时要理清顺序,否则容易出现"明明给了权限却访问不了"的情况。
  • 审计日志:Ranger自带审计功能,能记录每次访问的请求、结果、策略命中情况。这个在排查权限问题和做合规审计时非常有用,建议开启并定期归档。

Ranger的另一个优势是集中式管理。所有组件的权限都在一个界面配,不用像Sentry那样只盯着Hive。对于有几十个组件、上百个用户的集群,这种统一入口能省大量沟通成本。

4.3 Ranger和Kerberos的协同细节

Ranger本身不负责认证,它依赖Kerberos(或其他认证机制)提供用户身份。在Kerberos环境下,Ranger插件从当前请求的**UGI(User Group Information)**里拿用户名和组信息,再和策略比对。这里有个细节:组信息从哪来。Hadoop默认从操作系统或LDAP拿组,如果组映射不准,Ranger的策略可能匹配错。建议统一用LDAP或系统组,并确保各节点组信息一致。

另外,Ranger Admin本身也需要认证保护,通常配Kerberos或LDAP登录,避免任何人打开Web UI就能改策略。生产环境一定要改默认密码,并限制Admin的访问来源IP。

5. 三者如何串成一条完整的安全链路

5.1 认证到授权的完整流程拆解

把三个组件串起来看,一次典型的Hive查询请求,安全链路大致是这样的:

  1. 用户认证:用户用kinit拿到TGT,再向KDC申请HiveServer2的Service Ticket。
  2. 建立连接:客户端用Service Ticket和HiveServer2建立安全连接,HiveServer2验证票据,确认用户身份。
  3. 代理传递:HiveServer2以hive身份运行,通过代理用户机制,把实际用户身份传递给底层HDFS和YARN。
  4. 授权判断:Hive在编译SQL时,调用Sentry或Ranger插件,检查该用户对目标库表的权限。
  5. 底层访问:如果上层授权通过,Hive再去HDFS读数据,此时HDFS层可能还有Ranger的HDFS插件或HDFS ACL做二次校验。
  6. 审计记录:Ranger或Sentry记录这次访问的审计日志。

这条链路里,任何一环配错都会导致失败。比如Kerberos认证过了,但代理用户没配好,底层HDFS会以hive身份访问,可能读到不该读的数据;或者Sentry给了权限,但HDFS ACL没放开,任务报"Permission denied"。

5.2 选型建议:Sentry还是Ranger

很多团队纠结到底用哪个。我的经验是:

维度SentryRanger
覆盖组件主要Hive、ImpalaHDFS、Hive、HBase、Kafka、YARN等
权限模型角色为主,无DenyAllow/Deny,Deny优先,支持标签
管理界面较弱,偏命令行完善的Web UI
审计基础完善,可集中查看
社区活跃度逐渐下降活跃,Apache顶级项目
适用场景纯Hive/Impala、Cloudera老集群组件多、需统一管理的集群

如果你的集群组件单一、历史包袱是Cloudera系,Sentry够用;如果是新建集群、组件多样,直接上Ranger更省心。两者不建议同时启用,容易冲突。

5.3 一个容易忽略的环节:HDFS透明加密与列级脱敏

认证和授权解决了"谁能访问",但数据本身如果没加密,拿到文件的人还是能直接看。所以完整的安全策略里,通常还会加上HDFS透明加密(TDE)和动态脱敏。TDE让HDFS上的数据以密文存储,只有持有密钥的进程能解密;动态脱敏则是在查询结果返回时,对敏感列做掩码,比如把手机号中间四位变成星号。Ranger支持基于标签的脱敏策略,Sentry在这方面能力较弱。这两块内容展开又是一大篇,这里先点一下,知道它们是授权之后的补充手段即可。

6. 上线前必须做的几项验证和长期维护经验

6.1 权限变更后的回归测试清单

安全策略配好后,最怕的是"改一处、崩一片"。每次调整权限,建议按这个清单回归:

  • 认证层:用kinit测试各业务账号能否正常拿票;检查Keytab是否过期(Keytab里的密钥有版本,KDC轮换密钥后要重新导出)。
  • 授权层:用不同角色的账号,分别测试"该能访问的"和"不该能访问的"操作,确认Allow和Deny都生效。
  • 底层一致性:抽查几个关键表,确认HDFS文件权限和上层SQL权限一致,没有"上层禁、底层开"的漏洞。
  • 审计:确认审计日志正常记录,且能查到刚才的测试操作。

这个清单看着简单,但真出事时能帮你快速定位是哪一层的问题。

6.2 长期维护:权限治理比配置更难

配置是一次性的,治理是长期的。我见过太多集群,上线时权限配得漂漂亮亮,半年后角色嵌套了七八层,谁也说不清某个用户到底有哪些权限。几个实用做法:

  • 定期导出权限清单:Ranger有REST API,可以定期拉取所有策略存档,做diff对比,发现异常变更。
  • 最小权限原则:新用户默认不给权限,按需申请,而不是先给个大权限再慢慢收。
  • 角色命名规范:比如role_<业务域>_<权限级别>,避免出现role1、test_role这种含义不明的名字。
  • 离职和转岗清理:把权限回收纳入人事流程,别等人走了半年权限还挂着。

6.3 我踩过的一个典型坑:Kerberos票据缓存导致的"幽灵权限"

最后分享一个挺隐蔽的坑。有次测试发现,某个已经被移除角色的用户,居然还能访问某张表。排查后发现,是因为他的Kerberos票据缓存(/tmp/krb5cc_<uid>)还没过期,而某些组件的授权判断依赖票据里的组信息,票据里的组是旧的。清理票据缓存(kdestroy)后重新登录就正常了。这提醒我们:权限变更后,要让相关用户重新认证,否则旧票据可能带着旧身份继续用一段时间。票据有效期一般设8到24小时,敏感环境可以设短一些。

另外,Kerberos的票据续期(renew)也要注意,长时间运行的任务如果票据过期,会中途失败。可以用kinit -r指定可续期时长,或者用keytab自动续期。

这套安全策略搭起来确实费劲,但一旦跑顺,后面基本就是维护和微调。真正难的不是技术配置,而是让所有业务方理解并配合这套规则。我的体会是,前期多花时间做权限梳理和文档,后期能省下大量救火的时间。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进