深入 HBase 17 - Kerberos、RPC 保护与 ACL
HBase 安全不是一个开关。Kerberos 解决身份认证,RPC protection 解决传输层保护,ACL 解决 HBase 资源授权,HDFS 和 ZooKeeper 还要各自按安全模式配置。任何一层缺失,生产集群都会留下绕过路径。
本篇只抓一个核心问题:客户端身份、服务认证、传输保护和表权限如何衔接。
安全路径图
flowchart TD
Client[Client principal] --> KDC[Kerberos KDC]
RS[RegionServer principal] --> KDC
Master[HMaster principal] --> KDC
Client --> RPC[HBase RPC/SASL]
RPC --> AuthN[authentication]
AuthN --> Protection[hbase.rpc.protection]
Protection --> ACL[AccessController ACL]
ACL --> Region[Region data]
Region --> HDFS[HDFS secure mode]
Master --> ZK[ZooKeeper SASL/ACL]
这张图有四个边界。Client、RegionServer、HMaster 先通过 Kerberos 拥有可验证身份;HBase RPC 再用 SASL 建立认证和可选加密;AccessController 在 HBase 资源层做授权;底层 HDFS 和 ZooKeeper 也必须配置自己的认证与 ACL。
官方安全文档明确要求:如果 HBase RPC 使用 Kerberos,底层 Hadoop 的 hadoop.security.authentication 也应设为 kerberos。否则 HBase 层认证并不能保护 HDFS 层访问。
关键对象和状态
| 层级 | 对象 | 负责的问题 |
|---|---|---|
| 身份 | Kerberos principal、keytab、KDC | 请求者是谁 |
| 传输 | SASL、hbase.rpc.protection、TLS |
RPC 内容是否被保护 |
| HBase 授权 | AccessController、ACL、superuser | 谁能读写哪些资源 |
| HDFS | HDFS secure mode、目录权限、encryption zone | StoreFile、WAL 是否受保护 |
| ZooKeeper | SASL、znode ACL | 集群协调状态谁能修改 |
Kerberos 只解决“身份可认证”。它不自动授予表权限,也不自动加密 RPC 内容。认证成功后,HBase 仍要根据 ACL 判断该用户能否读表、写表、建表、执行 Endpoint 或做集群管理。
hbase.rpc.protection 控制 RPC 保护级别。常见取值是 authentication、integrity、privacy。authentication 只认证身份;integrity 增加完整性保护;privacy 增加加密保护。生产环境应按威胁模型选择,不能把 Kerberos 登录成功等同于 RPC 内容加密。
AccessController 是 HBase 的授权核心。官方数据访问安全文档说明,HBase ACL 基于用户和组授予权限,范围可以是全局、namespace、table、cell 或 endpoint。权限字母包括 Read、Write、Execute、Create、Admin。
HBase ACL 的边界
ACL 常见权限如下:
| 权限 | 含义 | 典型对象 |
|---|---|---|
| R | 读数据 | Get、Scan |
| W | 写数据 | Put、Delete、Increment |
| X | 执行 Endpoint | Coprocessor Endpoint |
| C | 创建或删除资源 | table、namespace |
| A | 管理集群或资源 | balance、assign、schema 管理 |
ACL 不等于关系数据库权限模型。HBase 不区分 insert 和 update,它们都落成 Put;因此授权设计要围绕 row、family、qualifier 和表级操作,而不是围绕 SQL 动词。
ACL 也不补齐跨行事务。权限检查通过后,请求仍按 HBase 的行级语义执行。一个用户有多张表的写权限,不代表一次跨表写入具备原子提交。
Cell 级权限和 visibility labels 可以进一步细化可见性,但它们会把授权状态放进数据读写路径。生产开启前要评估 Scan 性能、管理复杂度和审计路径。
HDFS 和 ZooKeeper 不能省
HBase 把 HFile 和 WAL 放在 HDFS 上。HBase 表 ACL 保护的是 HBase 服务语义,不是裸 HDFS 路径。如果 HDFS 未进入 secure mode,或 HBase 根目录权限过宽,用户可能绕过 HBase API 直接访问底层文件。
ZooKeeper 保存服务发现和协调状态。官方文档说明,HBase daemon 通过 SASL/Kerberos 访问 ZooKeeper,并给 znode 设置 ACL;某些用于服务发现的 znode 允许客户端读取,但只有 HBase 用户能修改。这里要分清“可读服务发现信息”和“可修改协调状态”。
这个边界和第 02 篇的架构边界一致:ZooKeeper 不是 HBase 所有持久元数据的存储地,hbase:meta 也不是安全系统。hbase:meta 是路由元数据表,HDFS 保存文件,ZooKeeper 协调在线状态;安全配置要覆盖每一层。
最小配置骨架
以下配置骨架来自官方安全文档语义,实际 principal、realm、路径按集群替换。当前本地没有 KDC 和 HBase 集群,标记为 UNVERIFIED_RUNTIME。
core-site.xml:
1 | |
hbase-site.xml:
1 | |
这里的 hbase.rpc.protection=privacy 属于 SASL/RPC protection,用于在 HBase RPC 认证链路上增加隐私保护。HBase 2.6.0+ 还提供独立的 RPC TLS 传输层加密,基于 Netty RPC 实现,和 Kerberos、simple access 等认证方式解耦。按官方 TLS 文档,服务端和客户端配置形状如下;当前本地没有 TLS HBase 集群,标记为 UNVERIFIED_RUNTIME。
1 | |
AccessController 相关 coprocessor 也要启用。HBase 2.x 的配置示例包含 master、region、regionserver 层的 AccessController,以及 TokenProvider、VisibilityController 等组件。生产配置应以目标版本官方文档为准,不能从旧版本博客复制类名。
客户端登录通常通过 kinit 完成:
1 | |
HBase shell 连接后授予表级读写权限:
1 | |
这些命令只说明操作形状,不提供虚构返回。验证应查看 user_permission、实际 Get/Put 行为、RegionServer 审计日志和 HDFS 路径权限。
最小实验
实验目标是证明四层边界分别生效,均为 UNVERIFIED_RUNTIME。先用未登录 Kerberos 的客户端访问 HBase,预期应被认证层拒绝。
1 | |
再登录没有表权限的 principal。这个用户可以通过身份认证,但读写目标表应被 ACL 拒绝。
1 | |
随后授予 R 权限,验证读成功、写失败。
1 | |
HBase 层验证完成后,还要检查 HDFS 上 HBase 根目录权限,确认普通用户不能直接读 StoreFile。
1 | |
第五步,检查 ZooKeeper znode ACL,确认服务发现可读项和修改权限分离。
1 | |
观察点包括认证失败类型、ACL 拒绝类型、RPC protection 配置、HDFS permission、ZooKeeper ACL。任何一项通过不了,都不能声称生产安全完成。
失败恢复
Kerberos 故障通常表现为客户端无法连接或服务端无法启动。优先检查 principal、keytab 权限、时钟同步、KDC 可达性和 realm 配置。时钟漂移会直接导致票据无效。
ACL 配错通常表现为连接成功但读写失败。恢复策略应该使用 superuser 或受控管理员账号修改权限,不应关闭全局授权来“临时恢复”。关闭授权会改变整个集群安全边界。
RPC protection 配错可能导致客户端和服务端协商失败。升级或灰度时应确认所有客户端支持相同保护级别。
HDFS 或 ZooKeeper 安全配置缺失时,修复范围超出 HBase 本身。必须把 Hadoop secure mode、目录 owner、ZooKeeper SASL 和 znode ACL 一起纳入变更计划。
工程迁移
| 问题 | HBase 层答案 | 可迁移模式 |
|---|---|---|
| 谁在访问 | Kerberos principal | 先认证身份 |
| 通道是否安全 | SASL/RPC protection/TLS | 再保护链路 |
| 能做什么 | ACL | 后授权动作 |
| 底层文件是否裸露 | HDFS secure mode | 存储层也要关门 |
| 协调状态谁能改 | ZooKeeper ACL | 控制面权限单独收紧 |
模式提炼:认证、传输、授权、底层存储不能互相替代。Kafka、HDFS、Elasticsearch、Kubernetes 都有同类分层;一层看起来“已经安全”,不代表旁路也安全。
常见误解
误解一:开启 Kerberos 后 HBase 就安全。Kerberos 只是认证身份,授权、RPC 保护、HDFS 和 ZooKeeper 仍要配置。
误解二:HBase ACL 能保护裸 HDFS 文件。HBase ACL 只在 HBase 服务路径内生效,HDFS 权限必须独立正确。
误解三:ZooKeeper 保存 HBase 数据,所以保护 ZooKeeper 就够。ZooKeeper 保存协调和发现状态,表数据在 HDFS,路由元数据在 hbase:meta。
误解四:REST 或 Thrift 网关天然继承安全。官方安全模型说明这些网关是可选服务,默认配置不等于生产安全配置,必须单独开启认证或限制网络访问。
练习
- 为一个只读报表用户设计最小权限,列出 Kerberos principal、HBase ACL、HDFS 权限和 ZooKeeper 访问要求。
- 把
hbase.rpc.protection的三个级别放进同一张表,说明各自保护身份、完整性和隐私的差异。 - 检查一个生产上线清单是否同时包含 HBase、HDFS、ZooKeeper 和网关安全项。
系列导航
- 深入 HBase 00 - 导读:row key 决定数据位置
- 深入 HBase 01 - 数据模型:Cell、Column Family 与版本
- 深入 HBase 02 - 集群架构:HMaster、RegionServer、ZooKeeper 与 hbase:meta
- 深入 HBase 03 - Schema 与 row key 设计
- 深入 HBase 04 - 写入路径:WAL、MVCC、MemStore 与 flush
- 深入 HBase 05 - 读取路径:BlockCache、Bloom Filter 与 HFile block
- 深入 HBase 06 - HFile 内部结构
- 深入 HBase 07 - Compaction、TTL、版本与 Delete
- 深入 HBase 08 - Region 生命周期:split、merge 与 assignment
- 深入 HBase 09 - Client 路由与重试
- 深入 HBase 10 - 行级原子性与一致性边界
- 深入 HBase 11 - RegionServer 崩溃与 WAL 恢复
- 深入 HBase 12 - 跨集群 Replication
- 深入 HBase 13 - Snapshot、Backup 与恢复
- 深入 HBase 14 - Get、Scan、Filter 与分页
- 深入 HBase 15 - BufferedMutator 与 Bulk Load
- 深入 HBase 16 - Coprocessor、Endpoint 与 Phoenix 边界
- 深入 HBase 17 - Kerberos、RPC 保护与 ACL
- 深入 HBase 18 - Metrics、hbtop、Compaction 与性能调优
- 深入 HBase 19 - HBase 3.0 与设计边界
参考资料
- Apache HBase Securing Access To Your Data:https://hbase.apache.org/docs/security/data-access/
- Apache HBase Securing Access to HDFS and ZooKeeper:https://hbase.apache.org/docs/security/hdfs-and-zookeeper-access/
- Apache HBase RPC TLS:https://hbase.apache.org/docs/security/tls/
- Apache HBase Security Model:https://hbase.apache.org/security-model/
- Apache Hadoop 3.4.3 Secure Mode:https://hadoop.apache.org/docs/r3.4.3/hadoop-project-dist/hadoop-common/SecureMode.html
证据等级:安全模型和配置边界为 VERIFIED_SOURCE;本地没有 KDC 和安全 HBase 集群,实验为 UNVERIFIED_RUNTIME。
