
本期作者

李昌海
哔哩哔哩资深开发工程师
韩志华
大数据平台工具负责人

1.序言
Berserker是B站一站式数据开发及治理平台,基于常用大数据生态组件构建,满足公司内数据查询、数据分析、日常报表、数据集成、数据开发、实时计算和数据治理等各种业务场景。在B站,我们一般将Berserker简写为BSK。

图1. Berserker的整体架构

图2. Berserker主页
其中,数据安全是Berserker平台中重要的一部分,它将为公司内部 Hive、Kafka、ClickHouse、ETL任务等各种资产进行统一的数据安全管理,并为数据平台部内部的数据开发、数据分析、数据报表、数据治理等各种数据类产品进行统一的功能安全管控。
本文将重点介绍Berserker数据安全的建设过程。
2.数据安全建设
2.1 安全目标
我们安全建设的目标是:保障信息资产的保密性(Confidentiality)、完整性(Integrity)、可用性(Availability):

图3. CIA三要素
2.2 5A方法论
我们将根据数据安全5A方法论,打造一个完整的安全产品,并在每个主要流程都分别提供了相应的产品和服务,实现安全闭环。

图4. 数据安全5A方法论
其中:
2.3 数据安全架构

图5. 整体框架
其中:
Berserker接入了公司统一身份认证,在新建账号时,将同步账号到公司AD域控管理,大数据组件通过Kerberos进行身份认证。
一般用户在Berserker平台进行数据安全变更操作(如:权限申请),授权结果记录在数据安全。数据安全将授权结果同步到Ranger和ClickHouse等。
Berserker、数据开发等服务通过数据安全服务进行鉴权。
Hive、Spark、Flink等计算引擎通过Ranger进行鉴权。
我们按不同的数据安全等级制定不同的数据保护策略,并采取下载限制、数据脱敏、安全水印、溯源等多种措施现在数据保护
记录用户或系统的操作,并用于事件追溯。BSK系统中多数据服务已经接入审计,同时也通过HDFS元仓(基于FsImage和HDFS AuditLog构建)进行数据访问分析。
2.4 里程碑
2020年7月数据安全的第一个服务权限系统从Berserker平台独立出,2022年7月,数据安全升级到2.0,中间经历了几次重大变更。

图6. 主要时间节点
数据安全2.0于2021年8月开始规划,2021年11月开始前期开发工作,于2022年7月上线,其最大的变化为有两点:
3.遇到的问题
3.1 权限变更
本质上,权限主要包含三个部分:账号、资源和权限类型。相比于1.0,权限2.0对这三块在设计上较大改变,主要体现在:
3.1.1 权限1.0

图7. 权限1.0模型图
权限系统1.0有以下特点:
由此带来了很多问题:
我们对上述问题进行了详细评估,确认在原有权限体系下都很难解决,于是设计了一套新权限体系。
3.1.2 权限2.0

图8. 权限模型
相比于1.0,权限2.0的做了较大调整:
如:Hive表为:hive:select、hive:update、hive:alter、hive:drop等权限
3.1.3 升级过程
因为权限2.0和权限1.0存在较地差异,升级过程中,为保证稳定性,减少用户体验上的差异,我们主要采取了如下推进措施:
在权限2.0大规模推广前我们先进行了小范围的验证,以保证系统的稳定可靠:
数据安全是berserker的基础服务,为大量的服务提供安全支持。同时数据安全改造无法做到一蹴而就,在推进过程中,存在部分业务使用1.0,部分业务使用2.0,为此我们需要保证系统能够兼容:
数据迁移包括历史全量数据迁移和增量数据迁移,在下面会讲到。
3.2 权限迁移
3.2.1 背景
为减少用户困扰,保证业务的正确运行,我们需要做到无缝权限数据迁移,包含:数据权限迁移和功能权限迁移。
在做数据迁移时也遇到了一些问题,尤其是Hive表的权限数据迁移。
3.2.2 Hive表迁移
需要全量迁移的数据权限有:Hive表、Hive库、数据源、Topic、ETL任务等。以下我们将重点介绍Hive表权限数据迁移过程。
我们原计划将部门、角色、用户组等Hive表权限全部展开个人,但通过计算发现,如将所有权限全部展开,最后权限记录将超过2亿条,这明显存在问题:
在引入工作空间后,任务将以工作空间账号运行,也必须为工作空间账号添加正确的权限。
最后我们放弃了将原权限全部展开到个人的方案,而是采用分析HDFS元仓,通过用户的历史访问行为来添加相应权限。

图9. Hive表权限同步流程
我们通过ETL任务来实现Hive表全量数据迁移,主要流程有:
通过上述大幅度的降低了权限策略数。同时权限2.0上线后,也未发现因Hive表迁移而产生的权限问题。
3.2.3 不足
Hive表权限依然存在一些不足,需要后期运营处理:
3.3 工作空间推进
3.3.1 背景
数据平台的用户的增长及业务的丰富,基于用户的数据安全模型体系难以支撑各种灵活多变业务需求,主要体现在:

图10. 基于用户的安全体系存在的问题
我们重新规划数据安全体系,并参考了业内的主流方案,引入工作空间,并将其作为管理资产、任务、成员、角色和权限管理的基本组织单元。
3.3.2 工作空间模型

图11. 工作空间模型
可以看到:
引入工作空间将涉及到各方改造,包括而不限于:数据安全、数据开发、数据集成、数据质量、数据治理、数仓以及各类数据应用等。为此,我们制定严格的推进策略
3.3.3 推进过程
工作空间整体推进改造过程主要分为四个阶段:

图12. 工作空间推进过程
工作空间后续工作则按项目正常迭代进行。
引入工作空间后,不管是功能层面还是技术层面都有较大的改造,为减少用户的理解成本,我们在推进过程中采用了一些策略:
3.4 Casbin优化
3.4.1 背景
Casbin 是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。权限系统内部使用Casbin进行权限管理。
Taishan是一款B站自研的分布KV数据库。
权限系统使用Taishan缓存权限策略,以减少服务和数据库的压力,权限系统内部处理流程如下:

图13. 权限系统内部授权/鉴权流程
可以看到,权限系统内部处理的主要流程:
我们在实施过程中也发现了一些问题:
3.4.2 Casbin添加权限性能调优
我们做权限迁移时,需要在Casbin中加载所有的权限策略,我们发现,Casbin加载性能很低,通过Debug后将问题定位在hasPolicy的实现上。
下面是hasPolicy和policy的实现:

图14. Casbin判断策略是否存在的源码

图15. policy定义源码
hasPolicy函数判断相同策略是否已经存在,并且每次添加新策略时都将调用该函数进行判断,其时间复杂度为O(n^2),其中策略条数为n,当策略到达一定规模后,性能急剧下降。
我们对Casbin做了优化,添加一个Set集合(SetpolicySet)用于记录已经加载过的策略,hasPolicy中判断该Set中是否包含该策略,性能得到了大幅度提供。
值得一提的事,Casbin 1.25.0之后的版本修复该BUG。相应地,我们也恢复使用开源版本。
Casbin 1.25.0中的实现:

图16. Casbin添加策略的优化
可以看到Casbin1.25.0之后的版本中添加了policyIndex用于优化hasPolicy。
3.4.3 Casbin回收权限性能调优
权限大量回收操作较少见,主要发生在如下场景:
在大批量的回收权限时,Casbin也会出现卡死,通过Debug后将问题定位在policy和policyIndex的维护上。
下面是Casbin删除权限策略的源码:

图17. Casbin策略删除的源码
可以看到,Casbin删除权限策略的步骤如下:
Casbin回收权限的时间复杂度也为O(n^2),性能较低。
处理该问题时,我们没有直接修改Casbin源码,而是类似于数据库,引入了标志删除:
即定时创建新Casbin模型,并加载未删除的权限策略,完成后替换原Casbin模型,从而实现对回收权限的清理。
目前Casbin的删除性能也得到了极大的提升
3.5 更多问题
除了上面所提到的问题,我们在数据安全建设过程中还有很多问题,如:
4.未来展望
在Berserker数据安全建设过程中,我们参考了很多公司和商业产品对于的最佳实践,同时也确认我们的产品还属于较初级阶段,依然有大量功能需要去完善。
未来我们的建设路线将主要在几个方面:覆盖全生命周期的数据安全保障,更精细化的权限管理,敏感数据保护及风险评估等方面。
本文为从大数据到人工智能博主「jellyfin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。