本文档风哥主要介绍HBase安全配置实战,包括Kerberos认证、ACL授权、数据加密等内容,风哥教程参考HBase官方文档Security、Access Control等内容,适合大数据开发运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 安全机制概述
HBase安全机制包括认证、授权和审计三个方面,保障数据安全访问。学习交流加群风哥微信: itpux-com
- 认证:验证用户身份
- 授权:控制访问权限
- 审计:记录操作日志
- 加密:数据传输加密
1. 认证层
– Kerberos:强认证
– Simple:简单认证
– 令牌认证:Delegation Token
2. 授权层
– ACL:访问控制列表
– RBAC:基于角色的访问控制
– 标签:行级安全
3. 审计层
– 操作日志
– 访问日志
– 安全日志
4. 加密层
– RPC加密
– 数据加密
– 传输加密
# 安全组件
1. HBase Server
– 认证拦截器
– 授权检查器
– 审计日志器
2. HBase Client
– 认证凭证
– 权限缓存
– 安全连接
3. ZooKeeper
– Kerberos认证
– ACL控制
# 安全流程
1. 客户端认证
Client -> Kerberos -> TGT -> Service Ticket -> HBase
2. 权限检查
Request -> AccessController -> ACL Check -> Allow/Deny
3. 操作审计
Operation -> AuditLogger -> Log -> Storage
1.2 认证类型详解
认证类型详解:
1. Simple认证
特点:
– 简单配置
– 无密码验证
– 信任客户端
配置:
适用场景:
– 开发测试环境
– 内网隔离环境
2. Kerberos认证
特点:
– 强认证机制
– 单点登录
– 防止伪造
配置:
适用场景:
– 生产环境
– 安全要求高
3. Delegation Token
特点:
– 临时凭证
– 减少Kerberos开销
– 适合MapReduce
配置:
适用场景:
– 批量作业
– 长时间运行任务
# Kerberos认证流程
1. 客户端获取TGT
kinit -> KDC -> TGT
2. 获取Service Ticket
TGT -> KDC -> Service Ticket
3. 访问HBase
Service Ticket -> HBase -> 验证 -> 允许访问
# 认证配置
hbase-site.xml:
1.3 授权模型详解
授权模型详解:
1. 全局权限
范围:整个集群
权限:Admin, Create, User
示例:
grant ‘admin’, ‘Admin’
grant ‘developer’, ‘Create’
2. 命名空间权限
范围:命名空间
权限:Admin, Create, User
示例:
grant ‘user1’, ‘Create’, ‘@ns1’
3. 表权限
范围:表
权限:Read, Write, Create, Admin
示例:
grant ‘user1’, ‘Read’, ‘fgedu_user’
grant ‘user2’, ‘Write’, ‘fgedu_order’
4. 列族权限
范围:列族
权限:Read, Write
示例:
grant ‘user1’, ‘Read’, ‘fgedu_user’, ‘info’
5. 列权限
范围:列
权限:Read, Write
示例:
grant ‘user1’, ‘Read’, ‘fgedu_user’, ‘info:name’
# 权限类型
权限 说明 操作
Read(R) 读取权限 Get, Scan
Write(W) 写入权限 Put, Delete
Create(C) 创建权限 Create, Alter, Drop
Admin(A) 管理权限 Enable, Disable, Compact
Execute(X) 执行权限 Coprocessor
Create(C) 创建权限 Create Table
# 权限组合
权限 组合
RW 读写权限
RWC 读写创建权限
RWCA 读写创建管理权限
# 权限继承
Global -> Namespace -> Table -> Column Family -> Column
子权限继承父权限,权限可以覆盖。
# 权限管理命令
# 授权
grant ‘user’, ‘permissions’, ‘table’, ‘cf’, ‘col’
# 撤销权限
revoke ‘user’, ‘table’, ‘cf’, ‘col’
# 查看权限
user_permission ‘table’
# 查看所有权限
user_permission
Part02-生产环境规划与建议
2.1 安全规划建议
安全规划建议:
1. 最小权限原则
– 只授予必要的权限
– 避免过度授权
– 定期审查权限
2. 分层安全
– 网络层:防火墙、VPN
– 传输层:TLS加密
– 应用层:认证授权
– 数据层:数据加密
3. 审计追踪
– 记录所有操作
– 保留审计日志
– 定期审计分析
# 安全架构设计
1. 网络隔离
– HBase集群内网部署
– 客户端通过网关访问
– 管理网络独立
2. Kerberos认证
– KDC高可用
– Principal规范命名
– Keytab安全管理
3. ACL授权
– 用户分组
– 角色管理
– 权限最小化
4. 数据加密
– RPC加密
– 数据文件加密
– 备份加密
# 用户角色规划
1. 管理员角色
用户:hbase_admin
权限:全局Admin权限
职责:集群管理、运维
2. 开发者角色
用户:hbase_dev
权限:命名空间Create权限
职责:表开发、测试
3. 应用角色
用户:app_user
权限:表级RW权限
职责:应用读写数据
4. 只读角色
用户:report_user
权限:表级Read权限
职责:报表查询
# 命名规范
1. Principal命名
格式:service/hostname@REALM
示例:hbase/fgedu-node1@FGEDU.NET.CN
2. 用户命名
格式:角色_用户名
示例:app_user1, dev_user2
3. 角色命名
格式:role_功能
示例:role_admin, role_readonly
2.2 Kerberos规划建议
Kerberos规划建议:
1. KDC服务器
– 主KDC:fgedu-kdc1
– 备KDC:fgedu-kdc2
– 高可用配置
2. Realm配置
REALM:FGEDU.NET.CN
域名:fgedu.net.cn
3. Principal规划
服务Principal:
– hbase/_HOST@FGEDU.NET.CN
– HTTP/_HOST@FGEDU.NET.CN
– zookeeper/_HOST@FGEDU.NET.CN
用户Principal:
– hbase@FGEDU.NET.CN
– admin@FGEDU.NET.CN
– app_user@FGEDU.NET.CN
# Keytab管理
1. Keytab生成
# 服务Keytab
kadmin.local -q “addprinc -randkey hbase/fgedu-node1@FGEDU.NET.CN”
kadmin.local -q “xst -k hbase.service.keytab hbase/fgedu-node1@FGEDU.NET.CN”
# 用户Keytab
kadmin.local -q “addprinc -pw password app_user@FGEDU.NET.CN”
kadmin.local -q “xst -k app_user.keytab app_user@FGEDU.NET.CN”
2. Keytab分发
– 服务Keytab:分发到对应服务器
– 权限:600,属主hbase
– 定期更新
3. Keytab安全
– 限制访问权限
– 定期轮换
– 安全存储
# Kerberos配置
krb5.conf:
[libdefaults]
default_realm = FGEDU.NET.CN
dns_lookup_kdc = true
dns_lookup_realm = false
ticket_lifetime = 86400
renew_lifetime = 604800
forwardable = true
udp_preference_limit = 1
[realms]
FGEDU.NET.CN = {
kdc = fgedu-kdc1.fgedu.net.cn
kdc = fgedu-kdc2.fgedu.net.cn
admin_server = fgedu-kdc1.fgedu.net.cn
}
[domain_realm]
.fgedu.net.cn = FGEDU.NET.CN
fgedu.net.cn = FGEDU.NET.CN
2.3 ACL规划建议
ACL规划建议:
1. 最小权限
– 只授予必要权限
– 避免Admin权限
– 定期审查
2. 分层授权
– 全局权限:管理员
– 命名空间权限:项目负责人
– 表权限:应用用户
3. 角色管理
– 创建角色
– 角色授权
– 用户关联角色
# 权限矩阵
用户/角色 全局 命名空间 表
hbase_admin Admin – –
ns_owner – Admin –
app_user – – RW
report_user – – R
# 命名空间权限规划
命名空间:fgedu_app
权限:
– ns_owner: Admin
– dev_user: Create
– app_user: RW
# 表权限规划
表:fgedu_user
权限:
– app_user: RW (info列族)
– report_user: R (info列族)
– admin_user: Admin
# ACL配置示例
# 创建角色
hbase(main):001:0> create_role ‘role_admin’
hbase(main):002:0> create_role ‘role_readonly’
# 角色授权
hbase(main):003:0> grant ‘role_admin’, ‘Admin’
hbase(main):004:0> grant ‘role_readonly’, ‘Read’, ‘fgedu_user’
# 用户关联角色
hbase(main):005:0> grant ‘user1’, ‘role_admin’
hbase(main):006:0> grant ‘user2’, ‘role_readonly’
# 查看权限
hbase(main):007:0> user_permission ‘fgedu_user’
User Namespace Table Family Permission
user1 (global) (global) Admin
user2 (global) fgedu_user Read
Part03-生产环境项目实施方案
3.1 Kerberos认证配置
3.1.1 创建Kerberos Principal
$ kadmin.local
kadmin.local: addprinc -randkey hbase/fgedu-node1@FGEDU.NET.CN
kadmin.local: addprinc -randkey hbase/fgedu-node2@FGEDU.NET.CN
kadmin.local: addprinc -randkey hbase/fgedu-node3@FGEDU.NET.CN
kadmin.local: addprinc -randkey HTTP/fgedu-node1@FGEDU.NET.CN
kadmin.local: addprinc -randkey HTTP/fgedu-node2@FGEDU.NET.CN
kadmin.local: addprinc -randkey HTTP/fgedu-node3@FGEDU.NET.CN
# 2. 生成Keytab文件
kadmin.local: xst -k hbase.service.keytab hbase/fgedu-node1@FGEDU.NET.CN hbase/fgedu-node2@FGEDU.NET.CN hbase/fgedu-node3@FGEDU.NET.CN
kadmin.local: xst -k spnego.service.keytab HTTP/fgedu-node1@FGEDU.NET.CN HTTP/fgedu-node2@FGEDU.NET.CN HTTP/fgedu-node3@FGEDU.NET.CN
# 3. 分发Keytab文件
$ scp hbase.service.keytab fgedu-node1:/etc/security/keytabs/
$ scp hbase.service.keytab fgedu-node2:/etc/security/keytabs/
$ scp hbase.service.keytab fgedu-node3:/etc/security/keytabs/
$ scp spnego.service.keytab fgedu-node1:/etc/security/keytabs/
$ scp spnego.service.keytab fgedu-node2:/etc/security/keytabs/
$ scp spnego.service.keytab fgedu-node3:/etc/security/keytabs/
# 4. 设置权限
$ chown hbase:hadoop /etc/security/keytabs/hbase.service.keytab
$ chmod 400 /etc/security/keytabs/hbase.service.keytab
$ chown hbase:hadoop /etc/security/keytabs/spnego.service.keytab
$ chmod 400 /etc/security/keytabs/spnego.service.keytab
# 5. 验证Keytab
$ klist -kt /etc/security/keytabs/hbase.service.keytab
Keytab name: FILE:/etc/security/keytabs/hbase.service.keytab
KVNO Principal
—- ————————————————————————–
1 hbase/fgedu-node1@FGEDU.NET.CN
1 hbase/fgedu-node2@FGEDU.NET.CN
1 hbase/fgedu-node3@FGEDU.NET.CN
# 6. 测试认证
$ kinit -kt /etc/security/keytabs/hbase.service.keytab hbase/fgedu-node1@FGEDU.NET.CN
$ klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: hbase/fgedu-node1@FGEDU.NET.CN
Valid starting Expires Service principal
04/08/26 13:00:00 04/09/26 13:00:00 krbtgt/FGEDU.NET.CN@FGEDU.NET.CN
3.1.2 配置HBase Kerberos
$ cat >> /bigdata/app/hbase/conf/hbase-site.xml << 'EOF'
# 2. 配置hbase-env.sh
$ cat >> /bigdata/app/hbase/conf/hbase-env.sh << 'EOF'
export HBASE_OPTS="$HBASE_OPTS -Djava.security.auth.login.config=/bigdata/app/hbase/conf/hbase_server_jaas.conf"
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -Djava.security.auth.login.config=/bigdata/app/hbase/conf/hbase_server_jaas.conf"
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Djava.security.auth.login.config=/bigdata/app/hbase/conf/hbase_server_jaas.conf"
EOF
# 3. 配置JAAS
$ cat > /bigdata/app/hbase/conf/hbase_server_jaas.conf << 'EOF'
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
useTicketCache=false
keyTab="/etc/security/keytabs/hbase.service.keytab"
principal="hbase/_HOST@FGEDU.NET.CN";
EOF
# 4. 配置ZooKeeper
$ cat >> /bigdata/app/hbase/conf/hbase-site.xml << 'EOF'
# 5. 重启HBase服务
$ /bigdata/app/hbase/bin/stop-hbase.sh
$ /bigdata/app/hbase/bin/start-hbase.sh
# 6. 验证Kerberos认证
$ kinit -kt /etc/security/keytabs/hbase.service.keytab hbase/fgedu-node1@FGEDU.NET.CN
$ hbase shell
hbase(main):001:0> status
active master: fgedu-node1:16000
…
3.2 ACL授权配置
3.2.1 启用ACL
hbase(main):002:0> version
HBase 2.5.5
…
# 2. 创建测试用户Principal
$ kadmin.local
kadmin.local: addprinc -pw password app_user@FGEDU.NET.CN
kadmin.local: addprinc -pw password admin_user@FGEDU.NET.CN
kadmin.local: addprinc -pw password read_user@FGEDU.NET.CN
# 3. 创建测试表
$ kinit hbase/fgedu-node1@FGEDU.NET.CN
$ hbase shell
hbase(main):003:0> create ‘fgedu_secure_table’, ‘info’, ‘detail’
Created table fgedu_secure_table
# 4. 授权给用户
hbase(main):004:0> grant ‘app_user’, ‘RW’, ‘fgedu_secure_table’
0 row(s) in 0.1234 seconds
hbase(main):005:0> grant ‘admin_user’, ‘A’, ‘fgedu_secure_table’
0 row(s) in 0.1234 seconds
hbase(main):006:0> grant ‘read_user’, ‘R’, ‘fgedu_secure_table’, ‘info’
0 row(s) in 0.1234 seconds
# 5. 查看权限
hbase(main):007:0> user_permission ‘fgedu_secure_table’
User Namespace Table Family Permission
hbase (global) (global) Admin
app_user (global) fgedu_secure_table Read, Write
admin_user (global) fgedu_secure_table Admin
read_user (global) fgedu_secure_table info Read
4 row(s)
3.2.2 测试权限
$ kinit app_user@FGEDU.NET.CN
Password for app_user@FGEDU.NET.CN:
$ hbase shell
hbase(main):008:0> put ‘fgedu_secure_table’, ‘row1’, ‘info:name’, ‘fgedu01’
Took 0.0123 seconds.
hbase(main):009:0> get ‘fgedu_secure_table’, ‘row1’
COLUMN CELL
info:name timestamp=1680940800000, value=fgedu01
1 row(s)
# 2. 测试只读权限
$ kinit read_user@FGEDU.NET.CN
Password for read_user@FGEDU.NET.CN:
$ hbase shell
hbase(main):010:0> get ‘fgedu_secure_table’, ‘row1’
COLUMN CELL
info:name timestamp=1680940800000, value=fgedu01
1 row(s)
hbase(main):011:0> put ‘fgedu_secure_table’, ‘row1’, ‘info:name’, ‘fgedu02’
ERROR: org.apache.hadoop.hbase.security.AccessDeniedException: Permission denied
# 3. 测试管理权限
$ kinit admin_user@FGEDU.NET.CN
Password for admin_user@FGEDU.NET.CN:
$ hbase shell
hbase(main):012:0> disable ‘fgedu_secure_table’
Took 0.5678 seconds.
hbase(main):013:0> enable ‘fgedu_secure_table’
Took 0.7890 seconds.
# 4. 撤销权限
$ kinit hbase/fgedu-node1@FGEDU.NET.CN
$ hbase shell
hbase(main):014:0> revoke ‘app_user’, ‘fgedu_secure_table’
0 row(s) in 0.1234 seconds
hbase(main):015:0> user_permission ‘fgedu_secure_table’
User Namespace Table Family Permission
hbase (global) (global) Admin
admin_user (global) fgedu_secure_table Admin
read_user (global) fgedu_secure_table info Read
3 row(s)
3.3 加密配置实战
$ cat >> /bigdata/app/hbase/conf/hbase-site.xml << 'EOF'
# 2. 配置数据加密
$ cat >> /bigdata/app/hbase/conf/hbase-site.xml << 'EOF'
# 3. 生成加密密钥
$ keytool -genseckey -alias hbase -keytype AES -keysize 128 \
-keystore /bigdata/app/hbase/conf/hbase.jceks \
-storetype jceks \
-storepass hbase123
# 4. 创建加密表
$ hbase shell
hbase(main):016:0> create ‘fgedu_encrypted_table’,
{NAME => ‘info’, ENCRYPTION => ‘AES’}
Created table fgedu_encrypted_table
# 5. 验证加密
hbase(main):017:0> describe ‘fgedu_encrypted_table’
Table fgedu_encrypted_table is ENABLED
fgedu_encrypted_table
COLUMN FAMILIES DESCRIPTION
{NAME => ‘info’, ENCRYPTION => ‘AES’, …}
1 row(s)
# 6. 重启HBase服务
$ /bigdata/app/hbase/bin/stop-hbase.sh
$ /bigdata/app/hbase/bin/start-hbase.sh
Part04-生产案例与实战讲解
4.1 多租户安全案例
# 1. 创建命名空间
$ kinit hbase/fgedu-node1@FGEDU.NET.CN
$ hbase shell
hbase(main):018:0> create_namespace ‘tenant_a’
hbase(main):019:0> create_namespace ‘tenant_b’
# 2. 创建租户用户
$ kadmin.local
kadmin.local: addprinc -pw password tenant_a_user@FGEDU.NET.CN
kadmin.local: addprinc -pw password tenant_b_user@FGEDU.NET.CN
# 3. 授权命名空间
hbase(main):020:0> grant ‘tenant_a_user’, ‘RWC’, ‘@tenant_a’
hbase(main):021:0> grant ‘tenant_b_user’, ‘RWC’, ‘@tenant_b’
# 4. 创建租户表
$ kinit tenant_a_user@FGEDU.NET.CN
$ hbase shell
hbase(main):022:0> create ‘tenant_a:user_table’, ‘info’
Created table tenant_a:user_table
$ kinit tenant_b_user@FGEDU.NET.CN
$ hbase shell
hbase(main):023:0> create ‘tenant_b:user_table’, ‘info’
Created table tenant_b:user_table
# 5. 验证隔离
$ kinit tenant_a_user@FGEDU.NET.CN
$ hbase shell
hbase(main):024:0> put ‘tenant_a:user_table’, ‘row1’, ‘info:name’, ‘tenant_a_data’
Took 0.0123 seconds.
hbase(main):025:0> put ‘tenant_b:user_table’, ‘row1’, ‘info:name’, ‘tenant_a_data’
ERROR: org.apache.hadoop.hbase.security.AccessDeniedException: Permission denied
# 6. 查看权限
hbase(main):026:0> user_permission ‘@tenant_a’
User Namespace Table Family Permission
tenant_a_user tenant_a (namespace) Read, Write, Create
1 row(s)
4.2 审计日志案例
# 1. 配置审计日志
$ cat >> /bigdata/app/hbase/conf/hbase-site.xml << 'EOF'
# 2. 配置log4j
$ cat >> /bigdata/app/hbase/conf/log4j.properties << 'EOF'
log4j.logger.SecurityLogger=INFO,DRFAAUDIT
log4j.additivity.SecurityLogger=false
log4j.appender.DRFAAUDIT=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DRFAAUDIT.File=${hbase.log.dir}/hbase-audit.log
log4j.appender.DRFAAUDIT.DatePattern=.yyyy-MM-dd
log4j.appender.DRFAAUDIT.layout=org.apache.log4j.PatternLayout
log4j.appender.DRFAAUDIT.layout.ConversionPattern=%d{ISO8601} %c{2}: %m%n
EOF
# 3. 重启HBase服务
$ /bigdata/app/hbase/bin/stop-hbase.sh
$ /bigdata/app/hbase/bin/start-hbase.sh
# 4. 执行操作
$ kinit app_user@FGEDU.NET.CN
$ hbase shell
hbase(main):027:0> put ‘fgedu_secure_table’, ‘row1’, ‘info:name’, ‘fgedu01’
hbase(main):028:0> get ‘fgedu_secure_table’, ‘row1’
# 5. 查看审计日志
$ tail -f /bigdata/logs/hbase/hbase-audit.log
2026-04-08 13:00:00,123 SecurityLogger: allowed=true; user=app_user; scope=fgedu_secure_table; family=info; action=put
2026-04-08 13:00:01,234 SecurityLogger: allowed=true; user=app_user; scope=fgedu_secure_table; family=info; action=get
2026-04-08 13:00:02,345 SecurityLogger: allowed=false; user=read_user; scope=fgedu_secure_table; family=info; action=put
# 6. 日志分析
$ grep “allowed=false” /bigdata/logs/hbase/hbase-audit.log | wc -l
123
$ grep “user=app_user” /bigdata/logs/hbase/hbase-audit.log | wc -l
4567
4.3 常见问题处理
4.3.1 Kerberos认证失败
ERROR: org.apache.hadoop.hbase.security.AccessDeniedException: org.apache.hadoop.security.KerberosAuthException: Login failure
# 排查步骤
# 1. 检查Keytab文件
$ ls -l /etc/security/keytabs/hbase.service.keytab
# 2. 检查Principal
$ klist -kt /etc/security/keytabs/hbase.service.keytab
# 3. 检查KDC连接
$ kinit hbase/fgedu-node1@FGEDU.NET.CN
# 解决方案
# 1. 重新生成Keytab
$ kadmin.local
kadmin.local: xst -k hbase.service.keytab hbase/fgedu-node1@FGEDU.NET.CN
# 2. 检查时间同步
$ ntpdate pool.ntp.org
# 3. 检查DNS解析
$ nslookup fgedu-node1
4.3.2 权限不足
ERROR: org.apache.hadoop.hbase.security.AccessDeniedException: Permission denied
# 排查步骤
# 1. 检查当前用户
$ klist
# 2. 检查权限
hbase(main):029:0> user_permission ‘fgedu_secure_table’
# 解决方案
# 1. 授予权限
hbase(main):030:0> grant ‘app_user’, ‘RW’, ‘fgedu_secure_table’
# 2. 检查命名空间权限
hbase(main):031:0> user_permission ‘@tenant_a’
Part05-风哥经验总结与分享
5.1 安全最佳实践
HBase安全最佳实践建议:
1. 启用Kerberos认证
2. 配置最小权限ACL
3. 启用审计日志
4. 定期审查权限
5. 加密敏感数据
5.2 安全建议
安全建议:
- 定期更新Keytab
- 审查权限分配
- 监控审计日志
- 及时撤销离职用户权限
5.3 工具推荐
安全工具:
- Kerberos:认证系统
- Ranger:权限管理
- Atlas:审计管理
- KMS:密钥管理
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
