DataWorks大数据安全治理实践指南

数据安全治理的必要性

数据安全治理的本质

2021610日《数据安全法》的发布为我国建立健全数据安全治理体系指明了方向。其中,第4条“维护数据安全,应当坚持总体国家安全观,建立健全数据安全治理体系,提高数据安全保障能力”和第7条“国家保护个人、组织与数据有关的权益,鼓励数据依法合理有效利用,保障数据依法有序自由流动,促进以数据为关键要素的数字经济发展”,数据安全治理将以体系化的方式保障数据安全。

国外主流的安全治理体系包括GartnerDSG Gartner及微软的DGPC方法。

  • DSG Gartner认为数据安全治理绝不仅是一套用工具组合而成的产品级解决方案,而是从决策层到技术层,从管理制度到工具支撑,自上而下、贯穿整个组织架构的完整链条。组织内的各个层级需要对数据安全治理的目标和宗旨达成共识,确保采取合理和适当的措施,以最有效的方式保护信息资源。

  • 微软DGPC方法提倡组织从人员、过程和技术3个核心能力领域,实现数据相关的安全及隐私风险保护

    • 人员领域:涉及组织、角色和责任,需要有适当的组织结构和资源,对DGPC的目标和职责有严格的要求并针对每个组织的独特情况进行调整。

    • 过程领域:涉及风险管理和政策定义,需要熟悉数据安全相关的法律法规、标准及制度,确定数据的合规要求,转化为本组织的制度与流程,实现数据安全实践。

    • 技术领域:涉及风险评估和减轻,需要将DGPC需求转化为技术控制和能力,并管理信息流中的风险。其中,风险/差距分析矩阵是最关键的组成部分,它将信息生命周期和技术领域与数据隐私和保密原则相结合,采取相应的措施来保护数据免受隐私、机密性和合规性威胁,并管理剩余风险。

上述定义均体现了数据安全治理并不是单纯使用技术工具就能实现的。从宏观上看,数据安全治理要处理好制度、组织、人员、工具间的关系;从微观上看,数据安全治理的本质则是要处理好各类人员(身份)对组织资产(IAAS/PAAS/SAAS/各类数据)所施加的行为,若某人员对组织资产采取了不恰当的行为,将导致资产所承载信息的机密性(Confidentiality)、完整性(Integrity)、可用性(Availability)受损,便会产生数安事件

image.png

例如:某电商企业的数据分析师每月通过订单事实表汇总销售额并配置看板,该行为符合预期。若分析师在没有特殊业务要求的情况下查看用户订单明细数据,则该行为不恰当。此类行为应该被治理。

数据安全治理的目标

2016年以前,我国对于数据保护相关的立法相对零散,普遍是以国家或行业的推荐性标准形式存在。自2017年网络安全法颁布以来,各类法律法规、国家强制性标准更加密集、更有针对性地颁布,这些法律文书大多思路明确、规则具体、处罚严重,若不遵守相关法律法规、履行数据安全保护义务,企业可能会被立案处罚。

image.png

当下企业在开展数据处理相关业务时,只要存在数据收集、处理、使用等行为,就需要从以下方面保障企业的经营合法合规。

  • 重点关注及遵守相关法律法规,时刻监督自己是否存在违规行为。例如,网络安全法、数据安全法、个性信息保护法、民法典及国家强制性标准保2.0等)。

  • 参考相关行动指南(例如,《数据安全治理实践指南》、《DSMM》、特定行业相关标准等)或购买安全厂商提供的安全产品或服务,开展数据安全治理项目。

image.png

从前,企业购买并使用安全产品仅仅是为了防范风险、治理风险,确保业务连续、确保资产不被滥用、泄露或控制,在这个时代,数据是企业命脉。

而当下,企业开展数据安全治理活动则是要让自己合规合规的目的并不是为了向监管部门“交作业”,而是让每一个被搜集数据的公民享有自己的合法权益、保证个人隐私不受侵犯,让个人享受到数据带来的便利、效益和福祉,这是企业社会责任的关键体现

image.png

数据安全相关法律法规示例

  • 数据安全法

    • 21条规定,应该对数据实行分类分级保护。该要求也存在于国家或其他行业推荐性标准中。image.png

    • 24条提到的数据安全审查,落地到数据安全治理中则为操作审计;第29条提到的对数据安全缺陷、漏洞、安全事件的补救及处置措施,落地到数据安全治理中则为对风险的响应,主要包括告警、阻断、审批等。

      这些要求在其他具备法律效力的文书中也存在,但不同行业存在某些场景化的要求image.png

  • 个人金融信息保护技术规范 JR/T0171-2020image.png

  • 个人金融信息保护技术规范 JR/T0171-2020image.png

大数据安全治理的难点

数据安全治理的关键问题

数据安全治理能否清楚、准确地回答如下问题,将从侧面反映安全治理项目是否能有效地落地。image.png

哪些资产需要被保护?

您有哪些资产?这些资产分布在哪里、承载着什么样的业务?资产内有哪些数据?数据业务属性及重要程度如何?是否做了相应的分级分类?

说明

此处的资产不单单局限于结构化、非结构化数据资产,还包括硬件资产、IAAS/PAAS/SAAS、甚至人员资产,因为任意一个资产被攻破,都会导致企业关键信息被侵害。

这些资产存在哪些风险?

在真实的业务场景下,企业数据资产不可避免地会经历采集、传输、存储、处理、使用、交互、销毁阶段,在这些阶段中分别存在哪些风险?每个阶段的风险如何通过定性、定量(年化损失期望ALE/年化防护成本ACS)方法来评估?企业可通过什么手段来识别、预判风险的存在?

风险评估的意义在于让组织的各业务方明确手头资产的风险所在,有利于高层以此推动落地安全项目。通过风险评估后,组织还可以根据评估结果对不同风险采取差异化的应对策略:

  • 风险缓解(Risk Mitigation):部署安全防护,降低数据安全事件发生的概率。

  • 风险转移(Risk Assignment):考虑到防护成本过高,选择购买商业保险规避损失。

  • 风险接受(Risk Acceptance):数据价值低,防护投入大,不采取防护措施。

  • 风险拒绝(Risk Rejection):评估认为被攻击概率极低,不采取任何防护措施。

  • 风险威慑(Risk Deterrence):通过对攻击者传递威慑信息以驱赶攻击者。

  • 风险规避((Risk Avoidance):直接下线某个系统,避免被攻击。

组织是否合规?

组织/企业每年将会面对哪些监管机构进行审查?应遵循哪些法律法规或强制性标准?面对监管机构,企业应审查哪些内容以确保合规性?

内外攻防怎么做?

基于对资产分布/资产重要性、资产风险及应对策略的认知,企业应保护哪些资产?不同资产使用什么样的方式、工具、手段来进行保护?如何避免或快速发现内部人员的滥用行为?如何防范外部的各类攻击?

安全运营应如何落地?

企业应该如何建立可持续、平台化、体系化、可视化的全运营体系?应配置什么样的基线、安全策略、风险规则、响应手段,以便从全局视角把控企业整体安全状况?安全团队应如何向上级说明价值、申请资源?

说明

数据安全的持续运营至关重要,大多数企业通常会采用多次立项的方式进行问题治理,这种项目制的治理方式费时费力、推动困难,原因就是将数据安全治理当作一次性项目,结束后未沉淀可运转的规章制度、安全基线或风险规则,导致权限冗余、数据滥用等问题再次出现而未被制止。

大数据体系的特点与安全治理难点

由于大数据系统在“存储、用户、入口、流转、交付”等多方面的特点,想要回答好上述问题,存在诸多难点。image.png

存储

众所周知,大数据系统以数据类型多(结构化、非结构化、半结构化)、数据量大(动辄PB级别)著称,某些巨头组织一天就能新增数十万甚至数百万张表,如此体量给数据分级分类带来了极大挑战,通过人工进行数据分级分类显然是不现实的,难免会出现遗漏的情况。

用户

大数据系统的用户基数大,覆盖所有与数据相关的角色。使用大数据系统的常见人员包括开发、运营、分析师,甚至销售及HR都会来查询自己所需的数据。如此多类型的用户,授权、管理难度加大,什么样的人员需要授予什么样的权限?如果他们离职、换部门了怎么办?这其中很有可能出现权限蠕变、过度授权、离职撤权不彻底的情况,这些都为数据安全事件埋下了隐患。

入口

由于大数据系统要服务不同的角色,每种角色技术水平不同,因此需提供不同的入口给各类人员使用。例如,技术人员可以使用命令行,但数据分析师或运营就需要使用可视化界面或BI工具。

不同的入口其登录认证、鉴权逻辑、审计能力可能存在差异。最常见的莫过于多个用户使用同一个身份从某个入口访问/操作数据的场景,此类场景就是典型的传递信任风险。此外,由于各上层系统审计能力参差不齐,也可能出现审计事件缺失、审计报文缺失、无法审计到人的违规问题。

流转

大数据系统通常是端到端的一整套数据开发和治理服务,不仅要采集数据、加工数据,更要将数据提供给业务方使用。因此,其存在错综复杂的数据流转链路,包括但不限于即席查询链路、离线传输链路、实时传输链路、数据服务API链路、其他底层API/SDK流出通道。

这些链路都是数据机密性受损的直接渠道,数据流转安全策略定义不清楚或未定义、底层链路未禁用、API安全防护缺失、人员行为未做风控都会导致数据安全事件发生。例如,非法出境(出域)、脱库、泄露等。

交付

大数据系统负责每日产出用于业务决策的数据,产出数据是否准时、准确,可能直接影响高层的决策。若无法准时、准确地产出数据,则相当于损害了信息的完整性(Integrity)、可用性(Availability)

通常,大数据系统中的工作流涉及多部门、多责任人且跨系统的数据,如何才能协调好这些业务系统准时、保质保量地产出数据,避免出现因业务系统宕机/脏数据导致数据延时产出、产出脏数据,关乎到企业数据业务的连续性问题甚至高层的信任问题。image.png

数据安全治理的常见思路

数据安全治理通常会经历如下阶段。image.png

阶段一:摸清家底

image.png

  1. 梳理资产摸清家底,产出《数资产清单》。例如:

    • 本企业有哪些数据?服务哪些业务?

    • 数据存在哪里?数据量有多大?

    • 数据类型有哪些?

    • 数据负责部门、负责人是谁?

  2. 进行数据分级分类,产出《数据分级分类清单》。例如:

    • 根据企业的服务场景,确认业务分类。

    • 根据业务重要性,确认数据敏感级别。

阶段二:评估风险

image.png

分别进行如下三项评估:

  • 合规风险评估:基于法律法规及国家标准,调研合规现状。梳理合规风险点,对标法律法规进行差距分析,产出《合规风险报告》。

  • 技术风险评估:基于数据全生命周期,调研技术现状。基于泄露风险(机密性)、篡改风险(完整性)、不可用风险(可用性)梳理技术风险点,产出《技术风险报告》。

  • 管理风险评估:基于组织架构、流程、规范,调研管理现状。基于法律法规对管理的要求梳理管理风险点,产出《管理风险报告》。

阶段三:建设能力

image.png

根据阶段二产出的评估报告,对如下三个体系进行建设:

  • 管理体系建设:着重对组织人员、制度流程、职责权力、资源分配、能力培训进行建设,最终产出各类机构、各类管理办法与规范。

  • 技术体系建设:基于数据全生命周期的识别、检测、防护、响应等安全技术设施,按实际需求部署各类安全防护产品。

  • 运营体系建设:定期评估风险与基线扫描,并进行日常与专项审计。同时,建立监控预警机制,落实风险事件应急处理,产出“数据安全运营成效评估指标”。

DataWorks安全能力介绍

为贴合上述安全治理思路,DataWorks特别针对阶段一(资产梳理)、阶段三(技术体系/运营体系)建设了一系列数据安全产品能力。DataWorks安全能力版图如下。image.png

DataWorks基于“I(Identify)P(Protect)D(Detect)R(Respond)”理论框架,构建自身数据安全能力。该框架具有业务上的逻辑顺序,详细介绍如下。

资产识别I(Identify)

企业对自身系统和业务数据进行梳理,识别各类敏感资产,确认哪些系统、资产和数据可能对国家、组织、个人产生安全威胁。

DataWorks可通过如下方式识别对应资产。

  • 支持自动化检测元数据,并支持管理员通过配置数据源的方式采集元数据。

    image.png

  • 支持管理员通过配置关键字、正则表达式,或内置专家模板、语义特征模板、内容识别模板等,快速帮助用户识别敏感信息。image.png

    image.png

  • 对于非数据类实体,不恰当的操作也可能导致风险。因此,可通过OpenAPI获取该类实体的全貌,以便针对不同实体的业务属性定义其重要程度。image.png

安全防护P(Protect)

对步骤一中已进行分级分类的资产,针对不同资产制定最合适的防护措施并实施相应计划。例如,哪些系统需要多因素认证、哪些库需要实施行级授权、哪些表及字段需禁止下载。

DataWorks及大数据计算服务MaxCompute为您提供了诸多数据防护的基础及进阶能力,具体如下。

数据传输

  • 传输加密:支持在创建数据同步任务时,对数据源开启SSL传输通道加密。

  • 临时身份:支持将临时Token作为数据源访问身份,消除认证信息泄露风险。

  • 流转管控:支持对数据流向进行管控。

数据存储

  • 存储加密:大数据计算服务MaxCompute天然支持透明加密、列级别加密。

  • 备份与恢复:云原生底层存储天然支持三份副本备份,同时,大数据计算服务MaxCompute提供数据备份与恢复功能,您可对保留周期内的数据进行快速恢复,避免因错误操作丢失数据。

  • 安全销毁:阿里云上落盘的数据一经删除,永久不可恢复;同时,用户可手动设置表分区生命周期来定义删除时间。

数据处理

  • 生产/开发环境隔离:支持生产与开发环境隔离的协同工作模式,并基于此实现“代码开发 > 代码评审 > 代码发布 > 数据产出 ”的规范化流程。

  • 预设自定义角色:支持管理员为用户授权DataWorks官方预置的角色,来实现规范化开发、生产流程。同时,支持用户按需创建自定义角色并配置权限(例如,配置自定义角色与MaxCompute引擎角色进行映射)。image.png

  • 数据列级别多级审批:基于底层大数据引擎的访问控制列表与数据分级分类,DataWorks支持按项目与数据分级分类,定义数据列的权限申请及审批策略。

  • 数据质量规则:支持管理员配置数据质量规则并关联生产任务,确保每日产出的结果数据无缺失、无污染、准确有效并可用于支撑业务决策,保障数据的完整性(Integrity)与可用性(Availability) 。image.png

  • 智能监控规则:支持管理员为重要的任务优先倾斜更多计算资源或调度资源,并实现全链路产出监控,保障每日数据准时产出,维护数据的可用性(Availability) 。image.png

数据使用

  • 动态脱敏和静态脱敏:管理员可对已识别的敏感数据开启动态脱敏、静态脱敏开关,以确保开发态与分析态明细数据的机密性。image.png

  • 数据API鉴权&发布审批:支持对数据服务API配置鉴权方式及策略,并对API的发布配置审批管控策略。

  • 泄露数据溯源:支持提取数据泄露文件中数据的水印信息,帮助管理员定位泄露数据的责任人。

通用防护措施

  • 企业/部门间权限隔离:支持企业间租户隔离、团队间空间隔离。

  • 增强身份鉴别:支持多因素登录认证、基于角色SSO的登录认证。

  • 离职人员权限转交:支持管理员通过配置转交策略或手工操作,将目标工作空间下各模块的实体(资源、函数等)在责任人被踢出空间或被删除时触发转交。

  • 登录地黑名单/登录入口黑名单:支持管理员定义可登录DataWorks的本地IP地址,支持禁用DataWorks Web登录界面或OpenAPI调用。

行为检测D(Detect)

步骤二完成后,您已经完成了一次性的安全防护,但这样仍然不够。管理者需要制定一系列的基线与规则,来监控是否存在安全配置非预期变更、资产被滥用等情况,以快速发现或预判风险事件的发生。

针对您在DataWorks上的使用行为,我们提供如下能力来进行风险检测。

离线操作日志

  • DataWorks操作行为审计:DataWorks已集成至操作审计(ActionTrail)中,您可在ActionTrail中查看及检索阿里云账号最近90天的DataWorks行为事件日志。DataWorks自身的200多个操作事件及关键报文将会被记录。

  • MaxCompute Information Schema:大数据计算服务内的所有操作会被记录至离线元数据仓库Information Schema,您可随时调用。

实时操作日志

支持使用OpenEventDataWorks关键操作变更情况以消息的方式发送至用户,便于用户订阅消息并做出个性化响应。目前已有13类关键操作支持推送实时操作事件消息。详情请参见实体操作日志(消息事件)

离线风险规则

支持对MaxCompute数据访问/操作配置异常行为相关的离线风险规则,实现T+1告警。详情请参见离线风险规则

实时风险规则

支持对DataWorks的高危操作自定义扩展程序,来实时识别风险。允许您将风险识别程序部署在本地,通过自研或第三方安全厂商的风控能力对云上相关操作进行实时识别、阻断、警告、审批,打破“云”与“本地”在进行数据安全治理时的边界。详情请参见实时风险规则

image.svg

基线配置检查

DataWorks工作空间与绑定的数据源在数据传输、存储、运算等过程中,提供与身份认证、访问权限控制、开发模式等功能相关的配置检查能力,帮助您及时发现平台的安全隐患,在进行相关工作事务前快速建立基本的安全体系。详情请参见基线配置检查

image.png

风险事件响应R(Respond)

制定并实施适当的管理机制。当检测到异常行为时,可紧急采取措施,对导致信息受损的相关功能或服务进行还原或冻结,以减少事件影响。例如,SOAR剧本、自动化执行响应动作、风险事件分析、恢复与持续改进等。

DataWorks提供离线、实时风险响应的基础能力,帮助您感知、处理风险事件。

  • 离线风险响应:支持对MaxCompute数据访问/操作配置异常行为相关的离线风险规则,实现T+1告警。

  • 实时风险响应:支持对DataWorks的高危操作自定义扩展程序,来识别风险,并针对风险行为配置实时审批、阻断、消息告警。

大数据安全治理路线及最佳实践

了解DataWorks数据安全产品能力后,您可参考如下三个阶段在DataWorks上落地数据安全治理项目。image.png

阶段一:基础防护建设

在该阶段,您要先对数据资产进行梳理、分级分类,这也是满足合规监管的首要任务;其次,应重点关注登录认证、人员授权、操作行为审计,如果未做相关部署,则无异于无证驾驶。

场景一:数据分级分类

不论在任何行业,数据分级分类都是监管首要检查的对象,也是企业应审的首要任务。因此,如何对本企业敏感数据识别、分级分类打标将成为一切安全治理工作的开始。

敏感数据一般包含如下三类。

敏感数据类别

描述

个人身份信息(Personally Identifiable Information,PII)

任何可以识别个人的信息,如姓名、社会保险账号、社会安全号码、出生日期、出生地点、母亲的娘家姓或生物识别记录,也包括关联信息,如医疗、教育、金融和就业信息等。

受保护的健康信息(Protected Health Information,PHI)

与个人有关的任何健康信息,如身体健康状况、病例信息、医疗费用等。从另一方面来说,PHI也属于PII。

专有数据(Proprietary Data)

影响组织核心竞争力、一旦泄露会对组织造成损害的数据,典型例子有设计图纸、药物配方、客户信息等。

管理员可以根据上述敏感数据类型及本企业的数据属性,定义本企业/组织的数据敏感级别,一般情况下可以参考如下分级方式。

数据属性

分类分级

政府机构

  • 绝密(Top Secret):对国家安全造成异常严重损害。

  • 秘密(Secret):对国家安全造成严重损害。

  • 机密(Confidential):对国家安全造成损害。

  • 未分类(Unclassified):对国家安全不会造成损害。

非政府组织

  • 机密/专有(Confidential/Proprietary):泄密会对企业竞争力造成异常严重影响,偏重于商业秘密、专利等。

  • 私有(Private):泄密会对企业造成严重影响,偏重于企业员工或用户的个人数据或财务数据等。例如,个人健康相关的X射线。

  • 敏感(Sensitive):泄密会对企业造成影响,偏重于网络拓扑图、内部流程制度等。

  • 公开(Public):泄密不会对企业造成影响,通常会保护其完整性,如防网页篡改。

如仍然无法确认分级标准,则可参考所在行业国家标准。例如,《金融数据安全分级指南 JR/T 0197-2020》。

分级、分类标准确认完毕后,即可前往DataWorks数据保护伞模块配置分级分类、数据识别规则,步骤如下图。

image.png

详情请参见数据保护伞 | 步骤一:事前梳理

场景二:规范数据开发流程

数据仓库不仅是企业的核心数据资产,也是业务决策神经中枢。因此,对于生产环境的机密性、稳定性需通过DevOps的方式来保障。DataWorks提供了多个预设角色,并配合标准模式工作空间,支持团队内分权管理、各司其职,规范化开展数据生产开发流程。

标准模式下,可以给数据开发人员授权“开发”角色、给运维人员授权“运维”或“部署”角色、给数据团队主管授权“空间管理员”角色、给分析师授权“数据分析师”角色。这样,便可形成规范化的数据开发与生产流程。

image.png

  • 数据建模链路:先由数据团队主管定义好建模过程中可能使用到的数据标准,再由数据建模人员设计并提交模型,最后经由数据团队主管、运维或部署人员审核无误后发布至生产环境。

  • 数据开发与生产链路:开发人员在开发环境先开发代码、配置调度依赖、调试任务,待冒烟测试无误后可申请提交发布,此时应由一个运维/部署/管理员角色来进行代码Review,确认无误后即可发布到生产环境,让规范、安全的代码在生产环境定期运行并产出数据。

通过该方式,每个人各司其职,职责分离,有效避免了“自己开发、自己发布”的情况,同时,多人协作把控风险,可降低故障率。

说明

不同人员建议只分配一个对应的角色。例如,不可以给数据开发人员空间管理员的角色;或给某开发人员既分配开发角色又分配运维角色,这样会导致过度授权、提升故障风险。

image.png

详情请参见权限管理与规范化数据开发

场景三:企业级身份认证

企业期望直接通过本地ADLDAP来统一管理身份,而不是在云上维护一套账号,该操作可能导致管理难、离职账号回收遗漏等问题。阿里云支持基于SAML 2.0OIDCSSO(Single Sign On,即单点登录),也称为身份联合登录。通过管理者身份,可以实现系统与阿里云的单点登录集成。例如:

  • 管理者可以在云上维护几个RAM角色,既可支持大量开发人员从本地SSO扮演角色进行开发工作,也可从操作审计日志中追踪到扮演者。

  • 调度访问身份权限较大,管理者可以将RAM角色配置为调度访问身份,有效避免人员意外登录。

image.png

详情请参见DataWorks角色登录

场景四:开源身份隔离

企业通常会使用DataWorks联合各类大数据引擎(例如,MaxCompute、E-MapReduce)进行数据开发。

  • 使用DataWorksMaxCompute进行数据开发时,在标准模式工作空间下默认支持身份权限隔离。

  • 使用DataWorksE-MapReduce时,支持管理者将DataWorks空间成员与EMR集群的Linux系统账号(已通过RangerSentry分配好权限)、OPEN LDAP账号、Kerberos账号进行一一映射,实现人员权限隔离。

image.png

详情请参见E-MapReduce身份映射

阶段二:数据安全防护措施及策略增强建设

在该阶段,您可依照自身业务场景或更高的防护要求开启数据预授权、多级审批、数据质量、任务优先级(智能监控)、防泄露等相关高级能力。

场景一:新人入职自动化授权

当企业规模变大,使用数仓的人员就会变多,同时,企业入职、离职、转岗的人员也会越来越多。当数据分析师或数据开发人员新人入职时,如果仅通过人工授权,则工作量巨大,且可能出现错漏。此时,管理员可通过定义“DataWorks自定角色 + MaxCompute Role”及DataWorks OpenAPI来进行自动化授权,实现人员入职成功后即可拥有最基本的数据权限。

image.png

操作步骤如下:

  1. 步骤一:为各部门对应的MaxCompute项目创建自定义Role,并通过Policy定义数据权限。

  2. 步骤二:在DataWorks中创建自定义角色并映射关联至MaxComputeRole。

  3. 步骤三:将DataWorks添加成员的OpenAPI接口,嵌入至本企业HR系统中,按需触发或在人员入职成功后自动将对应的RAM身份添加至DataWorks自定义角色。

  4. 步骤四:最终,入职的新人便会默认拥有DataWorks空间角色及MaxCompute数据权限。

详情请参见DataWorks自定义角色DataWorks添加成员OpenAPIMaxCompute Role Policy配置

场景二:按需申请数据权限&多级审批

在日常工作中,开发人员、数据分析师常需要读取他人产出的结果表,他们可在DataWorks数据地图检索表的元数据,并对表或表的某列进行权限申请。默认情况下,空间管理员或表Owner审批后便会自动授权,详情请参见DataWorks表权限申请及审批

对数据安全要求较严格的企业,其内部制定了相关授权规范,例如:

  • 敏感级别较低的数据由主管审批,较高密级的数据则由更高职位的人员审批。

  • 由于不是所有审批人都会登录至DataWorks进行审批,因此,要求审批流程能延伸至用户外部审批系统(例如,钉钉、飞书、企业微信)。

面对这类场景,我们支持基于数据分级自定义审批流程,同时,支持通过OpenAPI与审批消息实现与外部系统对接,满足企业对平台开放性的诉求。

image.png

详情请参见通过分级分类配置审批策略安全审批单相关OpenAPI中心审批消息

场景三:数据可用而不可见

在数据分析场景下,若非特殊情况,数据分析师通常不需要查询明细数据;在数据开发、测试场景下,开发人员在生产环境中导出数据进行开发或测试时,不展示明细数据时也不会影响开发工作。

为避免数据分析师、开发人员滥用数据,出于非工作目的查看明细数据,则可采用数据脱敏能力(支持保留格式加密、掩盖、HASH加密、字符替换、区间变换、取整、置空等多种方式),即很多法律法规中都重点强调的“去标识化”,实现在即席查询场景的界面化脱敏通过数据集成任务将数据从生产同步至开发环境时的脱敏

说明

必须要先完成数据分级分类,才能针对已识别到的敏感数据进行脱敏!

效果如下:

image.png

详情请参见数据脱敏能力概述

场景四:数据完整性与可用性专项治理

数据质量的好坏直接决定了数据信息的完整性(Integrity)与可用性(Availability),在整体数据链路的处理过程中,为保证最终产出数据的质量,数仓团队需要对数据仓库ODS、CDMADS层的数据分别进行监控,如产出脏数据(例如,缺失值、空值、异常值),则需及时告警或阻断脏数据向下游蔓延。

通常,数据质量的管理流程包括业务的数据资产定级加工卡点风险点监控及时性监控。同时,数据的可用性(Availability)还关系到数据能否准时产出。

为保证数据的完整性及可用性,DataWorks的智能监控为您提供如下功能

  • 支持用户定义任务优先级与任务承诺完成时间。

  • 及时捕捉重要任务(例如,高优先级任务、部分基线上的任务)无法按时完成的异常情况并提前预警。

  • 保障复杂依赖场景下重要数据能在预期时间内顺利产出,帮助您降低配置成本、避免无效报警、自动监控所有重要任务。

详情请参见数据质量最佳实践教程DataWorks智能基线

阶段三:数据安全持续运营

前两个阶段完成后,数据安全防护措施已相对完备。现在,您需通过一系列基线、风险识别与响应等基础措施,来对安全大盘进行持续运营。企业也可以考虑将DataWorks风险相关的事件信息接入至企业已有的安全运营平台统一管控。

基于对用户行为实时事件、实时审计日志的分析,能够及时发现风险行为,并实时、准时响应风险操作。

image.png

场景一:数据违规下载实时阻断/审批

数据下载是企业风险治理的重中之重。通常,企业数据开发人员、分析人员只允许在数据平台上浏览及使用数据,不允许将明细数据下载至本地进行分析。数据导出到本地后将无法审计其使用行为,若使用不当或遇到别有用心者,将导致数据被滥用、泄露,严重则可能产生数安事件及风险舆情。

不同企业对下载行为风控规则的定义存在差异,本文将以“一次性导出数据超过1000行时则阻断/审批”为例进行展示。

实现原理

DataWorksOpenEvent为您提供消息推送订阅的能力,同时,您可将服务程序注册为DataWorks的扩展程序,通过扩展程序来卡点并响应订阅的事件消息,实现通过扩展程序对特定事件进行消息通知与流程管控。详情请参见扩展程序概述

操作步骤

  1. 开启并配置消息订阅(OpenEvent)

    • 由于“查询结果下载”为非工作空间内的操作,因此本案例将使用Default总线来承接操作事件消息。

      说明

      如需通过RAM子账号/RAM角色身份读取Default总线中的事件,请提前进行授权

      image.png

    • 查询结果下载的事件名称为“dataworks:ResourcesDownload:DownloadResources”,可参考下图查看详情。

      image.png

      事件详情及关键参数含义。

      {
        "datacontenttype": "application/json;charset=utf-8",
        "aliyunaccountid": "1107550004253538",
        "aliyunpublishtime": "2023-12-05T07:25:31.708Z",
        "data": {
          "eventCode": "download-resources",
          "extensionBizId": "audit_4d7ebb42b805428483148295a97a8404",
          "extensionBizName": "DataWorks_IDE_Query_20231205152530.csv",
          "requestId": "77cac0c2fc12cecbf1d289128897cc7b@@ac15054317017611303051804e8b43",
          "appId": 3159,
          "tenantId": 524257424564736,
          "blockBusiness": true,
          "eventBody": {
            "sqlText": "SELECT * FROM table_1",   // 查询SQL
            "queryDwProjectId": "3159",    // 查询数据源所在的工作空间ID
            "moduleType": "develop_query",  // 下载来源:develop_query(数据开发查询)/sqlx_query(数据分析查询)/dw_excel(数据分析电子表格)
            "operatorBaseId": "1107550004253538", //操作者的UID
            "datasourceId": "18889", //查询的数据源ID
            "queryDwProjectName": "yongxunQA_emr_chengdu1", // 查询数据源所在的工作空间名称
            "dataRowSize": 4577,  // 下载的数据量
            "datasourceName": "odps_source",  // 查询的数据源名称
            "operatorUid": "1107550004253538"
          },
          "operator": "1107550004253538"
        },
        "aliyunoriginalaccountid": "1107550004253538",
        "specversion": "1.0",
        "aliyuneventbusname": "default",
        "id": "169d171c-d523-4370-a874-bb0fa083194d",
        "source": "acs.dataworks",
        "time": "2023-12-05T15:25:31.588Z",
        "aliyunregionid": "cn-chengdu",
        "type": "dataworks:ResourcesDownload:DownloadResources"
      }
  2. 开发部署线扩展程序(Extensions)

    处理的扩展点选择“数据下载前置事件”。image.png

    开发扩展程序可参考的示例代码。

    package com.aliyun.dataworks.demo;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.aliyun.dataworks.config.Constants;
    import com.aliyun.dataworks.config.EventCheckEnum;
    import com.aliyun.dataworks.config.ExtensionParamProperties;
    import com.aliyun.dataworks.services.DataWorksOpenApiClient;
    import com.aliyuncs.IAcsClient;
    import com.aliyuncs.dataworks_public.model.v20200518.*;
    import com.aliyuncs.exceptions.ClientException;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    /**
     * @author dataworks demo
     */
    @RestController
    @RequestMapping("/extensions")
    public class ExtensionsController {
    
        @Autowired(required = false)
        private DataWorksOpenApiClient dataWorksOpenApiClient;
    
        @Autowired
        private ExtensionParamProperties extensionParamProperties;
    
        /**
         * 接收eventBridge推送过来的消息
         * @param jsonParam
         */
        @PostMapping("/consumer")
        public void consumerEventBridge(@RequestBody String jsonParam){
            JSONObject jsonObj = JSON.parseObject(jsonParam);
            String eventCode = jsonObj.getString(Constants.EVENT_CODE_FILED);
            if(Constants.COMMIT_FILE_EVENT_CODE.equals(eventCode) || Constants.DEPLOY_FILE_EVENT_CODE.equals(eventCode)){
                //初始化client
                IAcsClient client = dataWorksOpenApiClient.createClient();
                try {
                    //当前事件参数信息
                    String messageId = jsonObj.getString("id");
                    JSONObject data = jsonObj.getObject("data", JSONObject.class);
                   // Long projectId = data.getLong("appId");
    
                    //初始化事件回调
                    CallbackExtensionRequest callbackExtensionRequest = new CallbackExtensionRequest();
                    callbackExtensionRequest.setMessageId(messageId);
                    callbackExtensionRequest.setExtensionCode(extensionParamProperties.getExtensionCode());
                    JSONObject eventBody = data.getJSONObject("eventBody");
                    Long dataRowSize = eventBody.getLong("dataRowSize");
                    //获取扩展程序选项配置在项目空间下的配置
                    GetOptionValueForProjectRequest getOptionValueForProjectRequest = new GetOptionValueForProjectRequest();
                    //全局扩展点事件的配置信息所属projectId默认为-1
                    getOptionValueForProjectRequest.setProjectId("-1");
                    getOptionValueForProjectRequest.setExtensionCode(extensionParamProperties.getExtensionCode());
                    GetOptionValueForProjectResponse getOptionValueForProjectResponse = client.getAcsResponse(getOptionValueForProjectRequest);
                    JSONObject jsonObject = JSON.parseObject(getOptionValueForProjectResponse.getOptionValue());
                    //这里需根据在DataWorks上实际设置格式来填写
                    Long maxDataRowSize = jsonObject.getLong("dataRowSize");
                    //判断代码是否包含限制函数
                    if(dataRowSize > 1000){
    
                        callbackExtensionRequest.setCheckResult(EventCheckEnum.FAIL.getCode());
                        callbackExtensionRequest.setCheckMessage("下载的行数超过限制数");
                    }else{//成功回调
                        callbackExtensionRequest.setCheckResult(EventCheckEnum.OK.getCode());
                    }
                    //回调DataWorks
                    CallbackExtensionResponse acsResponse = client.getAcsResponse(callbackExtensionRequest);
                    //请求的唯一标识,用于后续错误排查使用
                    System.out.println("acsResponse:" + acsResponse.getRequestId());
                } catch (ClientException e) {
                    //请求的唯一标识,用于后续错误排查使用
                    System.out.println("RequestId:" + e.getRequestId());
                    //错误状态码
                    System.out.println("ErrCode:" + e.getErrCode());
                    //错误描述信息
                    System.out.println("ErrMsg:" + e.getErrMsg());
                }
            }else{
                System.out.println("未能过滤其他事件,请检查配置步骤");
            }
        }
    }
  3. 配置风险响应规则。

    进入安全中心 > 风险识别规则,为上述已发布上线的扩展程序配置风险响应,如需审批,则可添加已创建的审批流程。

    说明

    在响应配置时:

    • 如需实现“审批”,则需保证扩展程序在识别到用户风险行为时callbackExtensionRequest.setCheckResult()返回“WARN”。

    • 如需实现“阻断”,则callbackExtensionRequest.setCheckResult()应返回“FAIL”。

    image.png

  4. 开启扩展程序。image.png

结果验证

  1. 在数据开发、数据分析模块单击下载数据,将跳转至数据下载页面进行风险检测。image.png

  2. 根据检测结果进行后续处理。

    • 若检测通过,则可继续下载。

    image.png

    • 若检测不通过,则下载被阻断,或告知用户需申请权限。

      • 下载被阻断。

        image.png

      • 提示用户申请权限。image.png

其他场景说明

  • 其他可落地的常见数据下载实时风险响应案例:

    • 按人员所属部门(工作空间)判断其是否允许下载数据。

    • 当查询SQL中包含敏感字段时阻断下载。

    • 分段风控,当下载条数超过2W条时需要审批,超过5W时条则阻断。

    • 针对空间角色定义下载条数。例如,开发角色允许下载N条,超过则阻断;分析师角色允许下载M条,超过则阻断。

    • 需针对数据开发、数据分析场景分别设置不同的下载条数策略。

  • 当前已支持进行实时风险响应的高危操作:文件提交、代码运行、文件删除、表提交到开发环境、表提交到生产环境、文件发布、节点冻结、节点解冻、节点下线、补数据、删除工作空间、删除数据源、其他(按需支持)。

  • 当前可实施的常见实时阻断场景:

    • 运行代码中包含Select敏感数据。

    • 删除核心业务场景代码文件。

    • 下线、冻结核心业务场景代码文件。

    • 删除核心业务所调用的数据源。

    • 一次性运行N个补数据任务(消耗资源、影响业务数据准时产出)。

    • 删除核心业务所在工作空间。

场景二:数据违规流转准实时告警

开发者在开发环境中使用数仓数据构建应用时,可能存在ODS层数据同步至分析层项目空间将分析层数据同步至数据仓库之外的存储介质(业务数据库或对象存储)等情况,此类行为极易造成数仓分析层数据可用性、完整性受损,或明细数据泄露。管理员可通过监控DataWorks操作审计日志及时发现此类行为,步骤如下:

  1. 登录至操作行为审计ActionTrail控制台

  2. 查看运行数据集成任务ExecuteFile事件的审计报文。

    image.pngimage.png

    审计报文详情。

    报文中,Readerodps,但WriteMysql,表示该同步任务的源端为MaxCompute,目的端为Mysql

    {
      "eventId": "0bc1746317041210600372496e6191",
      "eventVersion": 1,
      "eventSource": "dataworks.aliyuncs.com",
      "requestParameters": {
        "codeContent": {
          "transform": false,
          "type": "job",
          "version": "2.0",
          "steps": [
            {
              "stepType": "odps",
              "copies": 1,
              "parameter": {
                "partition": [
                  "pt=${bizdate}"
                ],
                "envType": 0,
                "datasource": "0_odps_xc_DPE_E2_engine",
                "tunnelQuota": "default",
                "isSupportThreeModel": false,
                "column": [
                  "spcode",
                  "hjstatus",
                  "sncode",
                  "spname",
                  "id",
                  "spcard",
                  "spkhrq",
                  "spperm",
                  "spgz",
                  "spmfact",
                  "spmfactzg",
                  "spjym",
                  "dwbfye",
                  "grbfye",
                  "spmend",
                  "bchjny"
                ],
                "tableComment": "智慧城市人口财产主题分析-公积金信息数据",
                "table": "ods_t_ss_persons_delta_d"
              },
              "name": "Reader",
              "gui": {
                "x": 100,
                "y": 100
              },
              "category": "reader"
            },
            {
              "stepType": "mysql",
              "copies": 1,
              "parameter": {
                "postSql": [],
                "envType": 0,
                "datasource": "smartcity",
                "column": [
                  "spcode",
                  "hjstatus",
                  "sncode",
                  "spname",
                  "id",
                  "spcard",
                  "spkhrq",
                  "spperm",
                  "spgz",
                  "spmfact",
                  "spmfactzg",
                  "spjym",
                  "dwbfye",
                  "grbfye",
                  "spmend",
                  "bchjny"
                ],
                "tableComment": "",
                "writeMode": "insert",
                "batchSize": 256,
                "table": "t_ss_persons_delta",
                "preSql": []
              },
              "name": "Writer",
              "gui": {
                "x": 100,
                "y": 200
              },
              "category": "writer"
            },
            {
              "copies": 1,
              "parameter": {
                "nodes": [],
                "edges": [],
                "groups": [],
                "version": "2.0"
              },
              "name": "Processor",
              "gui": {
                "x": 100,
                "y": 300
              },
              "category": "processor"
            }
          ],
          "order": {
            "hops": [
              {
                "from": "Reader",
                "gui": {
                  "sourceAnchor": 1,
                  "targetAnchor": 0
                },
                "to": "Writer"
              }
            ]
          },
          "setting": {
            "errorLimit": {
              "record": ""
            },
            "speed": {
              "throttle": false,
              "concurrent": 2
            }
          }
        }
      },
      "sourceIpAddress": "58.100.XXX.XXX, 11.193.XXX.XX",
      "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.X.X Safari/537.36",
      "eventRW": "Write",
      "eventType": "ConsoleOperation",
      "referencedResources": {
        "ACS::DataWorks::File": [
          "502990524"
        ],
        "ACS::DataWorks::Project": [
          "94864"
        ]
      },
      "userIdentity": {
        "sessionContext": {
          "attributes": {
            "mfaAuthenticated": "false",
            "creationDate": "1704119017735"
          }
        },
        "accountId": "1912232488744735",
        "principalId": "1912232488744735",
        "type": "root-account",
        "userName": "root"
      },
      "serviceName": "DataWorks",
      "additionalEventData": {
        "CallerBid": "26842"
      },
      "requestId": "0bc1746317041210600372496e6191",
      "eventTime": "2024-01-01T14:57:42Z",
      "isGlobal": false,
      "acsRegion": "cn-shanghai",
      "eventName": "ExecuteFile"
    }
  3. 配置告警规则。

    • 方式一:通过日志服务进行告警。

      通过特定语法配置告警规则“当ReaderodpsWrite不为odps时则告警”,实现事后告警。配置详情请参见创建自定义告警规则

      语法示例参考如下。

      event.eventName: ExecuteFile and event.serviceName: DataWorks | select * from (select json_extract_scalar(json_parse("event.requestParameterJson"), '$.codeContent.steps.0.stepType') as src, json_extract_scalar(json_parse("event.requestParameterJson"), '$.codeContent.steps.1.stepType') as dst from log) where src='odps' and dst != 'odps'
    • 方式二:通过自建告警系统进行告警。

      通过ActionTrail OpenAPI(LookupEvents)将审计事件明细内容拉取至本地解析,若审计报文内容符合“当ReaderodpsWrite不为odps时则告警”规则,则可通过自建告警系统发出告警。

其他场景说明

  • 管理员也可基于审计报文,从其他维度进行风险判断,例如:

    • 通过表前缀、表后缀判断来源表与目标表所在的数仓分层,以及数据在分层间的流向是否符合预期。

    • 通过审计报文中源端与目的端的字段映射,判断字段流向是否符合预期。

    • 结合本地维护的库/表的敏感级别、重要程度,判断是否存在低密级区域数据流转至高密级区域。

  • 判断生产环境中的同步任务是否存在风险:通过SubmitFile事件与DeployFile事件的审计报文获取File ID,并调用GetDISyncTask接口获取文件详细配置,判断同步配置是否存在风险。

  • 其他可落地的常见准实时风险告警事件:

    • 发布可直接返回敏感数据字段的数据服务API。

    • 大批量查询敏感数据。

    • 修改MaxCompute表字段的Label值。

    • 其他(按需支持)。