DataWorks通過OpenEvent能力為您提供訊息訂閱能力,您可以將服務程式註冊為DataWorks的擴充程式,通過擴充程式來捕捉並響應訂閱的事件訊息,以此實現對特定事件進行訊息通知與流程管控。本文以“即時阻斷或審批超過1000條資料的下載行為”事件為例,為您介紹風險識別規則從開發到驗證的全流程。
背景資訊
資料下載在企業風險管控中舉足輕重。通常情況下,只有企業資料開發人員和分析人員可以在資料平台上瀏覽和使用資料,而不允許將詳細資料下載到本地進行分析。一旦資料匯出到本地,就無法對其使用行為進行審計。同時,如果資料被不當使用或者受到別有用心者的攻擊,就可能導致資料濫用和泄露,甚至可能引發資料安全事件和風險輿情。本情境將向您展示如何?即時阻斷資料匯出行為。
情境目標
當使用者一次性匯出資料超過1000行時,系統將自動阻止或審批該操作。
前提條件
已開通DataWorks企業版,本方案需依賴DataWorks企業版的開放平台能力實現。
已開通事件匯流排EventBridge,用於接收使用者操作行為的訊息體,並用於風險行為擴充程式消費。
已建立ECS執行個體或本地IDC裝置,用於部署風險行為擴充程式。
步驟一:開啟並配置訊息訂閱
由於查詢結果下載非工作空間操作,因此本案例使用default匯流排承接操作事件訊息。
查詢事件類型為
dataworks:ResourcesDownload:DownloadResources的事件。單擊操作列的事件詳情,查看事件訊息體,樣本如下:
{ "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" }關鍵參數欄位說明:
參數
說明
sqlText
查詢SQL。
queryDwProjectId
查詢資料來源所在的工作空間ID。
moduleType
下載來源,取值:
develop_query:資料開發查詢。
sqlx_query:資料分析查詢。
dw_excel:資料分析試算表。
operatorBaseId
操作者的UID。
datasourceId
查詢的資料來源ID。
queryDwProjectName
查詢資料來源所在的工作空間名稱。
dataRowSize
下載的資料量。
datasourceName
查詢的資料來源名稱。
步驟二:開發並部署擴充程式
準備工作:
開啟訊息訂閱並註冊擴充程式,擷取開發擴充程式所需的必要資訊,詳情請參見開發部署擴充程式:自建服務方式。
開發並部署擴充程式。
根據已擷取的資訊,開發擴充程式並將其部署為一個應用服務,詳情請參見開發部署擴充程式:Function Compute方式。關鍵參數配置和樣本如下:
註冊擴充程式時,處理的擴充點選擇資料下載前置事件。
開發擴充程式範例程式碼如下:
重要此擴充程式樣本基於步驟一中事件訊息體中的
dataRowSize欄位實現下載行數風險判斷。在配置響應時,如需實現“審批”,則需保證擴充程式在識別到使用者風險行為時
callbackExtensionRequest.setCheckResult()返回WARN;如需實現“阻斷”,則callbackExtensionRequest.setCheckResult()應返回FAIL。本文擴充程式碼以下載1000條資料進行判斷舉例說明,如果希望不同的下載條數觸發不同的審批流,您可以配置多個擴充程式,詳情請參見步驟三:配置風險識別規則。例如:
第一個擴充程式僅在下載條數為0~2000時命中,對應審批次程序1。
第二個擴充程式僅在下載條數為2001及以上時命中,對應審批次程序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.aliyun.dataworks_public20200518.Client; import com.aliyun.dataworks_public20200518.models.CallbackExtensionRequest; import com.aliyun.dataworks_public20200518.models.CallbackExtensionResponse; import com.aliyun.dataworks_public20200518.models.GetOptionValueForProjectRequest; import com.aliyun.dataworks_public20200518.models.GetOptionValueForProjectResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @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 Client 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.getOptionValueForProject(getOptionValueForProjectRequest); JSONObject jsonObject = JSON.parseObject(getOptionValueForProjectResponse.getBody().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.callbackExtension(callbackExtensionRequest); // 請求的唯一標識,用於後續錯誤排查使用 System.out.println("acsResponse:" + acsResponse.getBody().getRequestId()); } catch (Exception e) { // 錯誤描述資訊 System.out.println("ErrMsg:" + e.getMessage()); } } else { System.out.println("未能過濾其他事件,請檢查配置步驟"); } } }
步驟三:配置風險識別規則
進入資訊安全中心頁面。
登入DataWorks控制台,切換至目標地區後,單擊左側導覽列的,在右側頁面中單擊進入資訊安全中心。
在左側導覽列單擊。
為已上線的擴充程式設定審批次程序。具體操作,請參見配置風險響應。

步驟四:啟用風險識別規則
單擊啟用開關,根據提示開啟擴充程式。
步驟五:結果驗證
進入資料下載頁面。
單擊指定檔案操作列的下載。
如果檢測通過,則可繼續下載。
如果檢測不通過,則下載被阻斷或提示發起申請操作。
其他同類情境說明
你可以基於下載事件中的其他欄位,例如工作空間名稱、SQL明細、資料來源名稱、人員UID等,實現其他符合實際業務的即時風控情境,例如:
按人員所屬部門(工作空間)判斷是否允許下載資料。
當查詢SQL中包含敏感欄位時阻斷下載。
分段風控,當下載條數超過2萬條時需要審批,超過5萬條時則阻斷。
針對空間角色定義下載條數,例如開發角色允許下載N條,超過則阻斷;分析師角色允許下載M條,超過則阻斷(需結合ListProjectMembers - 查詢工作空間成員介面實現)。
需針對資料開發、資料分析情境分別設定不同的下載數量策略。