HBase 代理是 master、region 与 region server 的协处理器:HBase 对每个操作与每次读写都询问它,它依据 hbase 数据服务的签名策略作答。发行包以单个兼容 Java 8 的 JAR 提供,即 agents/hbase/grantforge-agent-hbase-<version>.jar,依赖已重定位打包在内。
仓库的 Testcontainers 集成测试在 HBase 2.5.16、2.6.7 与 3.0.0 中运行该 JAR。这并不代表对其他所有版本的认证。服务插件见 Apache HBase。
工作方式
- 每个请求都在其涉及的每个范围上检查。 HBase 中权限覆盖其范围内的一切,因此代理在请求的命名空间、表、列族与列上分别决策:任一范围的拒绝都会拒绝请求,任一范围的允许都会放行。
- 命名空间的所有者拥有其中的表。 命名空间上的
create与admin让用户可以创建该命名空间、在其中建表并管理这些表,无需逐表配置策略。 - 读取返回可读的部分。 用户只能读表的一部分(例如一个列族)时,get 与 scan 返回这些列,而不是失败;对表中任何内容都无权读取的用户会被拒绝。
- 列表略去无权使用的内容。 列出命名空间和表时只显示用户可以使用、或可以使用其中某些内容的项,列出快照时只显示用户管理的表的快照;描述无权使用的命名空间会被拒绝。
- 拒绝会说明原因。 客户端收到
Permission denied: user bob has no read on table sales:items (no GrantForge policy allows it),或拒绝它的策略。 - 决策会被缓存,访问会被合并。 当前快照的决策会被缓存,默认 100,000 条、10 秒,新快照会重新开始。一个时间窗口(默认 10 秒)内相同的允许访问会作为一条注明次数的访问事件上报;拒绝立即逐条上报。
- 服务器本身不受检查。 HBase 的超级用户(
hbase.superuser中列出)以及服务器自身的工作不受检查也不被审计。hbase命名空间中的表(例如hbase:meta)所有人都可读取,这是客户端必需的。
| 操作 | 所需访问 |
|---|---|
| Get、scan | 表上的 read,或返回的列上的 read |
| 列的 put、increment、append、delete | 所写每一列上的 write |
| 删除列族或整行 | 每个列族上的 write,因为 HBase 按列族逐个删除整行 |
| Check-and-mutate | 所比较列上的 read(使用过滤器时为表上的 read),以及所写内容上的 write |
| 创建表 | 命名空间上的 create |
| 删除、清空、修改、启用、禁用、刷写、拆分、合并、压缩 | 表上的 admin 或 create |
| 移动、分配、取消分配、下线 region | 表上的 admin |
| 创建、恢复、删除或列出快照 | 表上的 admin;克隆还需要目标命名空间上的 create |
| 批量导入 | 表上的 create |
| 创建、修改、删除命名空间 | 命名空间上的 admin |
| 描述命名空间;列出命名空间与表 | 对其本身或其中内容的任意访问 |
| 均衡器、关闭集群、配额、复制对端、region server 组、过程、下线 region server、停止 region server、滚动 WAL | global 上的 admin |
部署
-
添加
hbase数据服务并配置策略。打开 数据权限 → 代理,选择该服务并签发代理令牌。令牌只显示一次;请存入只有 HBase 账户可读的文件。 -
将 JAR 复制到 每个 master 与 region server 的
lib目录,例如/opt/hbase/lib。 -
在每个节点的
hbase-site.xml中加入以下配置,替换示例地址、路径与实例名:<property><name>hbase.coprocessor.master.classes</name> <value>org.devlive.grantforge.hbase.agent.GrantForgeHBaseCoprocessor</value></property> <property><name>hbase.coprocessor.region.classes</name> <value>org.devlive.grantforge.hbase.agent.GrantForgeHBaseCoprocessor</value></property> <property><name>hbase.coprocessor.regionserver.classes</name> <value>org.devlive.grantforge.hbase.agent.GrantForgeHBaseCoprocessor</value></property> <property><name>grantforge.server.url</name><value>https://grantforge.example.com</value></property> <property><name>grantforge.token.file</name><value>/etc/hbase/grantforge.token</value></property> <property><name>grantforge.instance</name><value>regionserver-1</value></property> <property><name>grantforge.cache.dir</name><value>/var/lib/hbase/grantforge-cache</value></property>缓存目录必须对 HBase 账户可写。请在协处理器列表中替换 HBase 自带的
AccessController,不要同时加载两者。 -
逐个重启 master 与 region server。代理拿到第一个快照之前,除超级用户外的请求都会被拒绝。
-
先迁移现有权限: HBase 的
AccessController存在hbase:acl中的授权不再生效。请事先用user_permission列出它们,并创建对应的策略。
| 配置项 | 用途 |
|---|---|
grantforge.server.url、grantforge.token.file、grantforge.instance、grantforge.cache.dir |
必填:GrantForge 服务器、代理令牌文件、此 master 或 region server 的名称,以及存放签名快照与暂存事件的可写目录 |
grantforge.signing.key.file |
可选,固定快照签名密钥的文件;从“代理”页面复制 Base64 编码的 X.509 Ed25519 公钥。省略时在首次连接时从服务器获取 |
grantforge.connect.timeout.ms、grantforge.read.timeout.ms |
GrantForge 的连接与读超时,默认 5000 / 8000 毫秒 |
grantforge.refresh.interval.ms |
代理获取新策略的间隔,默认 30000,至少 1000 毫秒 |
grantforge.audit.batch.size、grantforge.audit.queue.capacity、grantforge.audit.flush.interval.ms、grantforge.audit.spool.limit.bytes |
访问事件:批大小(默认 500)、队列容量(默认 10000)、发送间隔(默认 5000 毫秒)和暂存上限(默认 64 MiB) |
grantforge.audit.fold.window.ms |
相同的允许访问合并为一条事件的时长,默认 10000,最多 3600000 毫秒;0 表示逐条上报 |
grantforge.decision.cache.size、grantforge.decision.cache.ttl.ms |
缓存的决策数上限,默认 100000,最多 10000000,0 表示不缓存;以及缓存时长,默认 10000,1..3600000 毫秒 |
HBase 会为 master、region server 以及它打开的每个 region 各创建一个协处理器;它们共用一个代理、决策缓存与事件合并。
用户、组与角色
策略中的名称是 HBase 赋予连接用户的短名:simple 认证的用户名,或按 hadoop.security.auth_to_local 得到的 Kerberos 主体短名。组是 Hadoop 组映射在服务器上为用户给出的组,加上 GrantForge 为用户指定的组;角色是 GrantForge 赋予用户的角色。
决策与限制
- 没有可用快照时,除超级用户的请求和对
hbase命名空间的读取外,一律拒绝。未启用的服务不检查 HBase,与未安装授权器时相同。 - 令牌绑定的服务类型不是
hbase时,一律拒绝。 - HBase 的
grant、revoke与user_permission会以 AccessController is not loaded 失败:权限是 GrantForge 的策略。 - 协处理器端点调用不受检查;只加载可信的端点。
- 在这里,HBase 不会给表的创建者额外权限;如上所述,命名空间策略会让其所有者拥有其中的表。
- HBase 会把某些拒绝只记入日志而不返回给客户端,例如均衡器开关:开关保持原状,但客户端不会得到提示。
- 决策会缓存
grantforge.decision.cache.ttl.ms,因此策略有效期的开始或结束最多会延迟这么久。 - 不覆盖 HBase 的单元格级权限与可见性标签。列按 UTF-8 文本比较。
