風(fēng)險識別規(guī)則響應(yīng)案例
DataWorks通過OpenEvent能力為您提供消息訂閱能力,您可以將服務(wù)程序注冊為DataWorks的擴展程序,通過擴展程序來捕捉并響應(yīng)訂閱的事件消息,以此實現(xiàn)對特定事件進行消息通知與流程管控。本文以“實時阻斷或?qū)徟^1000條數(shù)據(jù)的下載行為”事件為例,為您介紹風(fēng)險識別規(guī)則從開發(fā)到驗證的全流程。
背景信息
數(shù)據(jù)下載在企業(yè)風(fēng)險管控中舉足輕重。通常情況下,只有企業(yè)數(shù)據(jù)開發(fā)人員和分析人員可以在數(shù)據(jù)平臺上瀏覽和使用數(shù)據(jù),而不允許將詳細數(shù)據(jù)下載到本地進行分析。一旦數(shù)據(jù)導(dǎo)出到本地,就無法對其使用行為進行審計。同時,如果數(shù)據(jù)被不當(dāng)使用或者受到別有用心者的攻擊,就可能導(dǎo)致數(shù)據(jù)濫用和泄露,甚至可能引發(fā)數(shù)據(jù)安全事件和風(fēng)險輿情。本場景將向您展示如何實現(xiàn)實時阻斷數(shù)據(jù)導(dǎo)出行為。
場景目標(biāo)
當(dāng)用戶一次性導(dǎo)出數(shù)據(jù)超過1000行時,系統(tǒng)將自動阻止或?qū)徟摬僮鳌?/p>
前提條件
已開通DataWorks企業(yè)版,本方案需依賴DataWorks企業(yè)版的開放平臺能力實現(xiàn)。
已開通事件總線EventBridge,用于接收用戶操作行為的消息體,并用于風(fēng)險行為擴展程序消費。
已創(chuàng)建ECS實例或本地IDC設(shè)備,用于部署風(fēng)險行為擴展程序。
步驟一:開啟并配置消息訂閱
由于查詢結(jié)果下載非工作空間操作,因此本案例使用default總線承接操作事件消息。
查詢事件類型為
dataworks:ResourcesDownload:DownloadResources
的事件。單擊操作列的事件詳情,查看事件消息體,示例如下:
重要消息體中的內(nèi)容可作為您進行風(fēng)險判斷的上下文信息,例如您可以將以下表格中關(guān)鍵字段作為其他同類場景風(fēng)險判斷的上下文信息。
如果您需要通過RAM子賬號、RAM角色讀取default總線中的事件,需進行RAM授權(quán)。
{ "datacontenttype": "application/json;charset=utf-8", "aliyunaccountid": "110755000425****", "aliyunpublishtime": "2023-12-05T07:25:31.708Z", "data": { "eventCode": "download-resources", "extensionBizId": "audit_4d7ebb42b805428483148295a97a****", "extensionBizName": "DataWorks_IDE_Query_20231205152530.csv", "requestId": "77cac0c2fc12cecbf1d289128897****@@ac15054317017611303051804e****", "appId": ****, "tenantId": 52425742456****, "blockBusiness": true, "eventBody": { "sqlText": "SELECT * FROM table_1", "queryDwProjectId": "****", "moduleType": "develop_query", "operatorBaseId": "110755000425****", "datasourceId": "1****", "queryDwProjectName": "yongxunQA_emr_chen****", "dataRowSize": 4577, "datasourceName": "odps_source", "operatorUid": "110755000425****" }, "operator": "110755000425****" }, "aliyunoriginalaccountid": "110755000425****", "specversion": "1.0", "aliyuneventbusname": "default", "id": "169d171c-d523-4370-a874-bb0fa083****", "source": "acs.dataworks", "time": "2023-12-05T15:25:31.588Z", "aliyunregionid": "cn-chengdu", "type": "dataworks:ResourcesDownload:DownloadResources" }
關(guān)鍵參數(shù)字段說明:
參數(shù)
說明
sqlText
查詢SQL。
queryDwProjectId
查詢數(shù)據(jù)源所在的工作空間ID。
moduleType
下載來源,取值:
develop_query:數(shù)據(jù)開發(fā)查詢。
sqlx_query:數(shù)據(jù)分析查詢。
dw_excel:數(shù)據(jù)分析電子表格。
operatorBaseId
操作者的UID。
datasourceId
查詢的數(shù)據(jù)源ID。
queryDwProjectName
查詢數(shù)據(jù)源所在的工作空間名稱。
dataRowSize
下載的數(shù)據(jù)量。
datasourceName
查詢的數(shù)據(jù)源名稱。
步驟二:開發(fā)并部署擴展程序
準(zhǔn)備工作:
開啟消息訂閱并注冊擴展程序,獲取開發(fā)擴展程序所需的必要信息,詳情請參見開發(fā)部署擴展程序:自建服務(wù)方式。
開發(fā)并部署擴展程序。
根據(jù)已獲取的信息,開發(fā)擴展程序并將其部署為一個應(yīng)用服務(wù),詳情請參見開發(fā)部署擴展程序:函數(shù)計算方式。關(guān)鍵參數(shù)配置和示例如下:
注冊擴展程序時,處理的擴展點選擇數(shù)據(jù)下載前置事件。
開發(fā)擴展程序示例代碼如下:
重要此擴展程序示例基于步驟一中事件消息體中的
dataRowSize
字段實現(xiàn)下載行數(shù)風(fēng)險判斷。在配置響應(yīng)時,如需實現(xiàn)“審批”,則需保證擴展程序在識別到用戶風(fēng)險行為時
callbackExtensionRequest.setCheckResult()
返回WARN
;如需實現(xiàn)“阻斷”,則callbackExtensionRequest.setCheckResult()
應(yīng)返回FAIL
。本文擴展程序代碼以下載1000條數(shù)據(jù)進行判斷舉例說明,如果希望不同的下載條數(shù)觸發(fā)不同的審批流,您可以配置多個擴展程序,詳情請參見步驟三:配置風(fēng)險識別規(guī)則。例如:
第一個擴展程序僅在下載條數(shù)為0~2000時命中,對應(yīng)審批流程1。
第二個擴展程序僅在下載條數(shù)為2001及以上時命中,對應(yīng)審批流程2。
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 { //當(dāng)前事件參數(shù)信息 String messageId = jsonObj.getString("id"); JSONObject data = jsonObj.getObject("data", JSONObject.class); // Long projectId = data.getLong("appId"); //初始化事件回調(diào) 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(); //全局?jǐn)U展點事件的配置信息所屬projectId默認(rèn)為-1 getOptionValueForProjectRequest.setProjectId("-1"); getOptionValueForProjectRequest.setExtensionCode(extensionParamProperties.getExtensionCode()); GetOptionValueForProjectResponse getOptionValueForProjectResponse = client.getAcsResponse(getOptionValueForProjectRequest); JSONObject jsonObject = JSON.parseObject(getOptionValueForProjectResponse.getOptionValue()); //注意:這里需根據(jù)在DataWorks上實際設(shè)置格式來填寫 Long maxDataRowSize = jsonObject.getLong("dataRowSize"); //判斷代碼是否包含限制函數(shù) if(dataRowSize > 1000){ callbackExtensionRequest.setCheckResult(EventCheckEnum.FAIL.getCode()); callbackExtensionRequest.setCheckMessage("下載的行數(shù)超過限制數(shù)"); }else{//成功回調(diào) callbackExtensionRequest.setCheckResult(EventCheckEnum.OK.getCode()); } //回調(diào)DataWorks CallbackExtensionResponse acsResponse = client.getAcsResponse(callbackExtensionRequest); //請求的唯一標(biāo)識,用于后續(xù)錯誤排查使用 System.out.println("acsResponse:" + acsResponse.getRequestId()); } catch (ClientException e) { //請求的唯一標(biāo)識,用于后續(xù)錯誤排查使用 System.out.println("RequestId:" + e.getRequestId()); //錯誤狀態(tài)碼 System.out.println("ErrCode:" + e.getErrCode()); //錯誤描述信息 System.out.println("ErrMsg:" + e.getErrMsg()); } }else{ System.out.println("未能過濾其他事件,請檢查配置步驟"); } } }
步驟三:配置風(fēng)險識別規(guī)則
進入安全中心頁面。
登錄DataWorks控制臺,切換至目標(biāo)地域后,單擊左側(cè)導(dǎo)航欄的 ,在右側(cè)頁面中單擊進入安全中心。
在左側(cè)導(dǎo)航欄單擊
。為已上線的擴展程序設(shè)置審批流程。具體操作,請參見配置風(fēng)險響應(yīng)。
步驟四:啟用風(fēng)險識別規(guī)則
單擊啟用開關(guān),根據(jù)提示開啟擴展程序。
步驟五:結(jié)果驗證
進入數(shù)據(jù)下載頁面。
單擊指定文件操作列的下載。
如果檢測通過,則可繼續(xù)下載。
如果檢測不通過,則下載被阻斷或提示發(fā)起申請操作。
其他同類場景說明
你可以基于下載事件中的其他字段,例如工作空間名稱、SQL明細、數(shù)據(jù)源名稱、人員UID等,實現(xiàn)其他符合實際業(yè)務(wù)的實時風(fēng)控場景,例如:
按人員所屬部門(工作空間)判斷是否允許下載數(shù)據(jù)。
當(dāng)查詢SQL中包含敏感字段時阻斷下載。
分段風(fēng)控,當(dāng)下載條數(shù)超過2萬條時需要審批,超過5萬條時則阻斷。
針對空間角色定義下載條數(shù),例如開發(fā)角色允許下載N條,超過則阻斷;分析師角色允許下載M條,超過則阻斷(需結(jié)合ListProjectMembers - 查詢工作空間成員接口實現(xiàn))。
需針對數(shù)據(jù)開發(fā)、數(shù)據(jù)分析場景分別設(shè)置不同的下載數(shù)量策略。