すべてのプロダクト
Search
ドキュメントセンター

DataWorks:,

最終更新日:Aug 26, 2026

DataWorks の OpenEvent 機能を使用すると、イベントメッセージをサブスクライブできます。サービスを DataWorks 拡張として登録してこれらのイベントをキャプチャし、応答することで、カスタム通知とプロセス制御を実装できます。このトピックでは、1,000 行を超えるデータダウンロードのブロックまたは承認を必須とするシナリオを例に、リスク識別ルールを開発および検証する方法を説明します。

背景

データダウンロードの制御は、エンタープライズリスク管理の重要な部分です。通常、データ開発者やアナリストはプラットフォーム内でデータを閲覧および使用できますが、分析のために詳細なデータをローカルマシンにダウンロードすることは許可されていません。データがエクスポートされると、その使用状況を監査または制御することはできません。これにより、データの不正利用、漏洩、または悪意のある攻撃のリスクが生じ、セキュリティインシデントを引き起こす可能性があります。このガイドでは、データエクスポート操作をリアルタイムでブロックする方法を説明します。

目的

1,000 行を超えるデータダウンロードを自動的にブロックするか、承認プロセスをトリガーします。

前提条件

  • EventBridge をアクティブ化していること。このサービスはユーザー操作に関するイベントメッセージを受信し、リスク検出拡張がそれらを消費します。

  • リスク検出拡張をデプロイするための ECS インスタンスまたはオンプレミスサーバーがあること。

ステップ 1:メッセージサブスクリプションの設定

  1. メッセージサブスクリプションを有効にして設定します。

    クエリ結果のダウンロードはワークスペース固有の操作ではないため、この例ではデフォルトのバスを使用してイベントメッセージを受信します。

  2. タイプがdataworks:ResourcesDownload:DownloadResourcesのイベントをクエリします。

  3. 「操作」列で イベントの詳細 をクリックすると、イベントメッセージの本文が表示されます。以下に例を示します。

    重要
    • メッセージ本文は、リスク評価のコンテキストを提供します。次の表の主要なフィールドを、他のユースケースにおけるリスク評価のコンテキスト情報として使用できます。

    • RAM ユーザーまたは RAM ロールを使用してデフォルトバスからイベントを読み取る必要がある場合は、必要な RAM 権限を付与する必要があります。

    {
      "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:DataStudio からのクエリ。

    • sqlx_query:DataAnalysis からのクエリ。

    • dw_excel:DataAnalysis のワークブック。

    operatorBaseId

    オペレーターのユーザー ID (UID)。

    datasourceId

    クエリ対象のデータソースの ID。

    queryDwProjectName

    データソースのワークスペースの名前。

    dataRowSize

    ダウンロードするデータ行数。

    datasourceName

    クエリ対象のデータソースの名前。

ステップ 2:拡張の開発とデプロイ

  1. 開発の準備:

    メッセージサブスクリプションを有効にし、拡張を登録し、開発に必要な情報を取得します。詳細については、「拡張の開発とデプロイ:セルフマネージドサービス」をご参照ください。

  2. 拡張を開発してデプロイします。

    取得した情報を使用して、アプリケーションサービスとして拡張を開発およびデプロイします。詳細については、「拡張の開発とデプロイ:Function Compute」をご参照ください。次のセクションでは、主要なパラメーターについて説明し、サンプルコードを提供します。

    • 拡張機能を登録する際は、処理の拡張ポイント パラメーターで [リソースダウンロードの事前イベント] を選択します。

    • 次のサンプルコードは、拡張を開発する方法を示しています。

      重要
      • このサンプル拡張では、「ステップ 1」のイベントメッセージ本文にある dataRowSize フィールドを使用して、ダウンロードされる行数に基づいてリスクを評価します。

      • 応答を設定する際、承認を実装するには、拡張がユーザーのリスクのある行動を識別したときに callbackExtensionRequest.setCheckResult() が WARN を返すようにします。ブロックを実装するには、callbackExtensionRequest.setCheckResult() が FAIL を返すようにします。

      • このトピックのサンプルコードでは、1,000 行の制限を例として使用しています。ダウンロードサイズに応じて異なる承認ワークフローをトリガーしたい場合は、複数の拡張を設定できます。詳細については、「ステップ 3:リスク識別ルールの設定」をご参照ください。例:

        • 最初の拡張は 0〜2,000 行のダウンロードに対してトリガーされ、承認ワークフロー 1 にマッピングされます。

        • 2 番目の拡張は 2,001 行以上のダウンロードに対してトリガーされ、承認ワークフロー 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 デモ
       */
      @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 = 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();
                      // グローバル拡張ポイントイベントの設定のプロジェクト ID は、デフォルトで -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 > maxDataRowSize) {
                          callbackExtensionRequest.setCheckResult(EventCheckEnum.FAIL.getCode());
                          callbackExtensionRequest.setCheckMessage("The number of rows to download exceeds the limit.");
                      } else { // コールバック成功。
                          callbackExtensionRequest.setCheckResult(EventCheckEnum.OK.getCode());
                      }
                      // コールバックを DataWorks に送信します。
                      CallbackExtensionResponse acsResponse = client.callbackExtension(callbackExtensionRequest);
                      // リクエストの一意の ID。トラブルシューティングに使用できます。
                      System.out.println("acsResponse:" + acsResponse.getBody().getRequestId());
                  } catch (Exception e) {
                      // エラーの説明。
                      System.out.println("ErrMsg:" + e.getMessage());
                  }
              } else {
                  // 他のイベントのフィルタリングに失敗しました。設定を確認してください。
                  System.out.println("Failed to filter other events. Check your configuration.");
              }
          }
      }

ステップ 3:リスク識別ルールの設定

  1. [セキュリティセンター] ページに移動します。

    DataWorks コンソールにログインします。 左側のナビゲーションウィンドウで、[データガバナンス] > [セキュリティセンター] を選択します。 表示されるページで、[セキュリティセンターに移動] をクリックします。

  2. 左側のナビゲーションウィンドウで、セキュリティポリシー > Fraud Detection ルール をクリックします。

  3. 公開された拡張の承認プロセスを設定します。詳細については、「リスク応答の設定」をご参照ください。ページの上部で、[操作イベント] と [拡張名] ドロップダウンリストを使用してルールをフィルタリングできます。テーブルには、各拡張の名前、コード、所有者、ソース、ステータス、および応答が表示されます。[操作] 列で、[応答を設定] をクリックして応答アクションを設定するか、[拡張を作成] をクリックして新しい拡張を追加できます。

ステップ 4:リスク識別ルールの有効化

有効化 スイッチをオンにし、プロンプトに従います。 [リスク識別ルール] ページで、[操作イベント] でフィルターします。 対象のルールと対応する拡張機能 (たとえば、[承認トリガー拡張機能]) を見つけます。 [有効化] 列のスイッチをオンにしてルールを有効にします。 応答方法を変更するには、[応答を設定] をクリックします。

ステップ 5:結果の検証

  1. [データダウンロード] ページに移動します。

  2. 目的のファイルについては、操作 列の ダウンロード をクリックします。

    • チェックに合格した場合、ダウンロードが続行されます。

    • チェックに失敗した場合、ダウンロードはブロックされるか、承認申請の提出を求められます。

その他のユースケース

ダウンロードイベントペイロード内の他のフィールド (ワークスペース名、SQL の詳細、データソース名、ユーザー ID (UID) など) を使用して、ビジネスニーズに合わせた他のリアルタイムリスクコントロールシナリオを実装できます。例:

  • ユーザーの部署 (ワークスペースで表される) に基づいてデータダウンロードを許可または拒否する。

  • SQL クエリに機密フィールドが含まれている場合にダウンロードをブロックする。

  • 階層型リスクコントロールを実装する。たとえば、20,000 行を超えるダウンロードには承認を必須とし、50,000 行を超えるダウンロードはブロックするなど。

  • ワークスペースのロールに基づいてダウンロード制限を定義する。たとえば、開発者ロールのユーザーには N 行、アナリストロールのユーザーには M 行のダウンロードを許可し、それを超えるとアクションをブロックするなど。これには、ListProjectMembers - Query workspace members API を使用する必要があります。

  • DataStudio と DataAnalysis のシナリオで異なるダウンロード制限ポリシーを設定する。