O recurso OpenEvent do DataWorks permite assinar mensagens de eventos. Registre seus services como uma extensão do DataWorks para capturar e responder a esses eventos, o que possibilita implementar notificações personalizadas e controles de processo. Este tópico demonstra como desenvolver e verifique uma regra de identificação de riscos por meio de um cenário de exemplo: bloquear ou exigir aprovação para baixe de dados que ultrapassem 1.000 linhas.
Contexto
O controle de baixe de dados é uma parte essencial do gerenciamento de riscos corporativos. Normalmente, desenvolvedores e analistas de dados podem navegar e utilizar dados dentro da plataforma, mas não têm permissão para baixe dados detalhados em máquinas locais para análise. Após a exportação dos dados, seu uso não pode ser auditado ou controlado. Isso gera riscos de uso indevido, vazamentos ou ataques maliciosos que podem causar incidentes de segurança. Este guia demonstra como bloquear operações de exportação de dados em tempo real.
Objetivo
Bloquear automaticamente ou acionar um processo de aprovação para qualquer baixe de dados que exceda 1.000 linhas.
Pré-requisitos
Você possui activated EventBridge. Esse service recebe mensagens de eventos sobre operações de usuários, e a extensão de detecção de riscos as consome.
Você tem uma ECS instance ou um servidor local para implantar a extensão de detecção de riscos.
Etapa 1: Configure a assinatura de mensagens
-
Enable and configure message subscription.
Como o baixe de resultados de consulta não é uma operação específica de workspace, este exemplo utiliza o barramento padrão para receber mensagens de eventos.
Consulte eventos do tipo
dataworks:ResourcesDownload:DownloadResources.-
Na coluna Actions, clique em Details para visualize o corpo da mensagem de evento. Veja um exemplo abaixo:
ImportanteO corpo da mensagem fornece contexto para a avaliação de riscos. Utilize os campos principais da tabela a seguir como informações contextuais para a avaliação de riscos em other use cases.
Caso precise usar um usuário RAM ou uma função RAM para ler eventos do barramento padrão, você deve grant the required RAM permissions.
{ "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" }Descrição dos parâmetros principais:
Parâmetro
Descrição
sqlText
A consulta SQL.
queryDwProjectId
O ID do workspace da fonte de dados.
moduleType
A origem do download. Valores válidos:
-
develop_query: Uma consulta do DataStudio. -
sqlx_query: Uma consulta do DataAnalysis. -
dw_excel: Uma pasta de trabalho no DataAnalysis.
operatorBaseId
O ID de usuário (UID) do operador.
datasourceId
O ID da fonte de dados consultada.
queryDwProjectName
O nome do workspace da fonte de dados.
dataRowSize
O número de linhas de dados a serem baixadas.
datasourceName
O nome da fonte de dados consultada.
Etapa 2: Desenvolver e implantar a extensão
-
Prepare o ambiente de desenvolvimento:
Ative a assinatura de mensagens, registre uma extensão e obtenha as informações necessárias para o desenvolvimento. Para mais informações, consulte Develop and deploy an extension: Self-managed service.
-
Desenvolva e implante a extensão.
Utilize as informações obtidas para desenvolver e implantar a extensão como um service de aplicação. Para mais informações, consulte Develop and deploy an extension: Function Compute. A seção a seguir descreve os parâmetros principais e fornece um código de exemplo:
Ao registrar a extensão, no parâmetro Processed Extension Points, selecione Pre-event for Resources Download.
-
O código de exemplo a seguir mostra como desenvolver a extensão:
ImportanteEsta extensão de exemplo usa o campo
dataRowSizedo corpo da mensagem de evento em Step 1 para avaliar o risco com base no número de linhas a serem baixadas.Ao configurar a resposta, para implementar a aprovação, garanta que
callbackExtensionRequest.setCheckResult()retorneWARNquando a extensão identificar um comportamento de risco do usuário. Para implementar o bloqueio,callbackExtensionRequest.setCheckResult()deve retornarFAIL.-
O código de exemplo neste tópico usa um limite de 1.000 linhas como referência. Se desejar acionar diferentes fluxos de trabalho de aprovação com base em tamanhos de download distintos, configure várias extensões. Para mais informações, consulte Step 3: Configure a risk identification rule. Por exemplo:
A primeira extensão é acionada para downloads de 0 a 2.000 linhas e mapeada para o fluxo de trabalho de aprovação 1.
A segunda extensão é acionada para downloads de 2.001 linhas ou mais e mapeada para o fluxo de trabalho de aprovação 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; /** * Receives messages pushed from 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)) { // Initializes the client. Client client = dataWorksOpenApiClient.createClient(); try { // Retrieves the parameter information of the current event. String messageId = jsonObj.getString("id"); JSONObject data = jsonObj.getObject("data", JSONObject.class); // Long projectId = data.getLong("appId"); // Initializes the event callback. CallbackExtensionRequest callbackExtensionRequest = new CallbackExtensionRequest(); callbackExtensionRequest.setMessageId(messageId); callbackExtensionRequest.setExtensionCode(extensionParamProperties.getExtensionCode()); JSONObject eventBody = data.getJSONObject("eventBody"); Long dataRowSize = eventBody.getLong("dataRowSize"); // Obtains the configurations of the extension option in the workspace. GetOptionValueForProjectRequest getOptionValueForProjectRequest = new GetOptionValueForProjectRequest(); // The project ID for the configuration of a global extension point event is -1 by default. getOptionValueForProjectRequest.setProjectId("-1"); getOptionValueForProjectRequest.setExtensionCode(extensionParamProperties.getExtensionCode()); GetOptionValueForProjectResponse getOptionValueForProjectResponse = client.getOptionValueForProject(getOptionValueForProjectRequest); JSONObject jsonObject = JSON.parseObject(getOptionValueForProjectResponse.getBody().getOptionValue()); // Note: You must set this parameter based on the format configured in DataWorks. Long maxDataRowSize = jsonObject.getLong("dataRowSize"); // Checks if the number of rows to download exceeds the limit. if (dataRowSize > 1000) { callbackExtensionRequest.setCheckResult(EventCheckEnum.FAIL.getCode()); callbackExtensionRequest.setCheckMessage("The number of rows to download exceeds the limit."); } else { // Successful callback. callbackExtensionRequest.setCheckResult(EventCheckEnum.OK.getCode()); } // Sends the callback to DataWorks. CallbackExtensionResponse acsResponse = client.callbackExtension(callbackExtensionRequest); // The unique ID of the request, which can be used for troubleshooting. System.out.println("acsResponse:" + acsResponse.getBody().getRequestId()); } catch (Exception e) { // Error description. System.out.println("ErrMsg:" + e.getMessage()); } } else { System.out.println("Failed to filter other events. Check your configuration."); } } }
Etapa 3: Configure uma regra de identificação de riscos
-
Faça login no console do DataWorks. Na região de destino, clique em no painel de navegação à esquerda. Na página exibida, clique em Go to Security Center.
No painel de navegação à esquerda, clique em .
Configure um processo de aprovação para a extensão publicada. Para mais informações, consulte Configure a risk response. No topo da página, utilize as listas suspensas Operation Event e Extension Name para filtrar regras. A tabela lista o nome, código, proprietário, source, status e resposta de cada extensão. Na coluna Actions, clique em Configure Response para defina a ação de resposta ou em Create Extension para adicionar uma nova extensão.
Etapa 4: Ative a regra de identificação de riscos
Ative a chave Enable e siga as instruções. Na página Risk identification rules, filtre por Operation Event. Localize a regra desejada e a extensão correspondente (por exemplo, Approval-triggering Extension). Ative a chave na coluna Enable para habilitar a regra. Para alterar o método de resposta, clique em Configure Response.
Etapa 5: Verifique os resultados
Acesse a página Data Download.
-
Para o arquivo desejado, clique em Download na coluna Operation.
Se a verificação for aprovada, o download prossegue.
Se a verificação falhar, o download será bloqueado ou você receberá um prompt para envie uma solicitação de aprovação.
Outros casos de uso
É possível utilizar outros campos no payload do evento de download, como nome do workspace, detalhes da SQL, nome da fonte de dados ou ID de usuário (UID), para implementar outros cenários de controle de riscos em tempo real adequados às suas necessidades de negócios. Exemplos incluem:
Permitir ou negar downloads de dados com base no departamento do usuário, representado pelo workspace.
Bloquear downloads caso a consulta SQL contenha campos sensíveis.
Implementar controle de riscos em camadas. Por exemplo, exigir aprovação para downloads superiores a 20.000 linhas e bloquear downloads acima de 50.000 linhas.
Definir limites de download baseados em funções do workspace. Por exemplo, permitir que um usuário com a função Developer baixe N linhas e um usuário com a função Analyst baixe M linhas antes que a ação seja bloqueada. Isso requer o uso da API ListProjectMembers - Query workspace members.
Estabelecer políticas de limite de download diferentes para cenários do DataStudio e do DataAnalysis.