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

Security Center:悪意のあるファイルの検出

最終更新日:Feb 11, 2026

ユーザーによるファイルのアップロード、コードのリリース、データ共有などのシナリオでは、ランサムウェア、マイニングプログラム、Webshel​​l などの悪意のあるファイルが持ち込まれる可能性があります。これらのファイルは、業務システムとデータのセキュリティに脅威をもたらします。悪意のあるファイルの検出機能は、Security Center のマルチエンジン検出プラットフォームを活用し、これらの脅威を特定して対処するための複数の方法を提供します。このドキュメントは、さまざまな役割のユーザーが、特定のビジネスシナリオに最適な検出方法を迅速に選択できるように設計されています。

機能概要

利用シーン

利用シーン

説明

サーバー攻撃の防止

ワームやマイニングトロイの木馬を防ぎ、サーバーリソースの消費や DDoS 攻撃での使用を回避します。

標的型攻撃の防御

バックドアやハッキングツールを検出し、データ窃取やリモートシステム制御を防ぎます。

オフィスネットワークとファイルストレージ

悪意のあるマクロやスクリプトを含むドキュメントや圧縮ファイルを特定し、フィッシングや認証情報窃取を防ぎます。

システム環境全体の検出

ランサムウェアや感染性ウイルスをスキャンして駆除し、データが身代金目的で保持されたり、広範囲なシステム麻痺が発生したりするのを防ぎます。

検出方法

Security Center は、検出タスクを実行するための 2 つの方法を提供します:SDK 統合コンソール操作です。

機能

SDK 統合

コンソール操作

使用方法

SDK を業務コードに統合して呼び出します。Java と Python がサポートされています。

Security Center コンソールにログインし、グラフィカルユーザーインターフェイス (GUI) で操作を実行します。

検出対象ファイル

  • サーバーファイル:直接アクセスして処理できます。例として、リアルタイムでアップロードされたファイルや、サーバー上の特定のローカルファイルなどがあります。

  • Object Storage Service (OSS) ファイル:OSS に保存されているファイルの有効なダウンロードリンクを生成し、システムがそれをフェッチして検出できるようにします。

Object Storage Service (OSS) ファイルのみがサポートされています。

適用範囲

  • サポートされるファイルタイプ

    • 圧縮ファイルの検出: Security Center は、暗号化されていない圧縮パッケージを展開してスキャンできます。展開の深さとスキャンするファイル数は設定可能です。

    • 暗号化ファイルの検出: Security Center は、OSS のサーバー側暗号化 (SSE-KMS または SSE-OSS) を使用して暗号化されたデータの自動復号とスキャンをサポートしています。

  • サポートされるファイル形式:

    • 圧縮パッケージ: .7z.zip.rar.tar.gz.bz2.xz.lzma.ar.tar.gz

    • スクリプト/Webshel​​l: .php.jsp.jspx.asp.aspx.sh.py.ps1.pl.bat.html

    • ドキュメントタイプ: .doc.pdf.ppt.xsl.rtf.hta.chm

    • 実行可能/バイナリファイル: .apk.exe.dll.ocx.com.so.sys.ko.obj

    • 画像.jpg

  • サポートされるウイルスファイル: Security Center は、リバースシェルバックドア、DDoS トロイの木馬、マイニングプログラムなどのウイルスファイルの検出をサポートしています。詳細については、「検出でサポートされるウイルスの種類」をご参照ください。

  • ストレージクラスの制限: 標準ストレージと低頻度アクセスストレージクラスの OSS ファイルのみがサポートされています。アーカイブストレージクラスのファイルはサポートされていません。

  • OSS バケット検出でサポートされるリージョン:

    • 中国 (青島)、中国 (北京)、中国 (張家口)、中国 (フフホト)、中国 (ウランチャブ)

    • 中国 (杭州)、中国 (上海)

    • 中国 (深セン)、中国 (河源)、中国 (広州)

    • 中国 (成都)、中国 (香港)

    • シンガポール、マレーシア (クアラルンプール)、インドネシア (ジャカルタ)、フィリピン (マニラ)、タイ (バンコク)、日本 (東京)、韓国 (ソウル)、米国 (シリコンバレー)、米国 (バージニア)、ドイツ (フランクフルト)、イギリス (ロンドン)

サービスのアクティブ化と通知設定

サービスの購入とアクティブ化

  1. Security Center コンソール - リスク管理 - 悪意のあるファイルの検出ページに移動します。左上隅で、アセットが配置されているリージョンを選択します:Chinese MainlandまたはOutside Chinese Mainland

  2. 画面の指示に従って、Try Now今すぐ購入 (サブスクリプション)、またはActivate Pay-as-you-goを選択して、機能をアクティブ化します。

    • Try NowAlibaba Cloud アカウントが企業の本人確認を完了している場合、悪意のあるファイルの検出機能の無料トライアルをアクティブ化できます。

      重要
      • 各 Alibaba Cloud アカウントは、1 回の無料トライアルの対象となります。

      • 無料トライアルには、10,000 回のファイル検出クォータが含まれます。

    • 今すぐ購入 (サブスクリプション)購入ページにリダイレクトされます。以下で説明するように、サブスクリプションを構成して支払います。

      • 不正ファイル検出エリアで、購入するかどうかYesに設定できます。

      • Quantityフィールドにファイル検出数を入力できます。最小は 100,000 検出です。

    • Activate Pay-as-you-go

      1. Activate Pay-as-you-goダイアログボックスで、Activate Pay-as-you-goをクリックします。

      2. Enable Policy (オプション):このオプションは、選択したバケットに新しくアップロードされたファイルに対して定期的な検出ポリシーを自動的に有効にします。ポリシーはすぐに有効になります。「ポリシー構成」で検出範囲を調整できます。

説明

これらの操作は、Security Center 購入ページでも実行できます。詳細については、「Security Center の購入」をご参照ください。

通知設定 (オプション)

Security Center は、検出された悪意のあるファイルに関するアラート情報を DingTalk グループに自動的にプッシュして、迅速な対応を可能にする DingTalk ロボット通知機能を提供します。この機能を設定するには、次の手順に従います:

  1. Security Center コンソール - システム設定 - 通知設定ページに移動します。左上隅で、アセットが配置されているリージョンを選択します:Chinese MainlandまたはOutside Chinese Mainland

  2. DingTalk チャットボットタブで、新しいロボットを追加するをクリックします。

    1. 通知スコープ:悪意のあるファイルを検出するために、すべてのレベルを選択することを推奨します。

    2. その他の情報:詳細については、「DingTalk ロボット通知の設定」をご参照ください。

検出タスクの設定と実行

コンソール操作

検出したいファイルが Alibaba Cloud Object Storage Service (OSS) バケットに保存されている場合、Security Center コンソールから直接バッチまたは定期的なスキャンを実行できます。

  • 手動検出:この方法は、既存ファイルの 1 回限りのスキャンに適しており、完全検出増分検出の両方をサポートしています。

  • 自動検出:この方法は、新しいファイルの継続的で自動的なスキャンに適しています。

手動検出 (既存ファイル)

  1. OSS ファイル検出ページへの移動

    Security Center コンソール - リスク管理 - 悪意のあるファイルの検出にログインします。ページの左上隅で、アセットが配置されているリージョンを選択します:Chinese MainlandまたはOutside Chinese Mainland次に、OSS ファイルの検出タブに移動します。

  2. 検出タスクの開始

    重要

    バケットがOSS ファイルの検出リストにない場合は、バケットの同期をクリックしてバケットのリストを更新します。

    • 完全検出:

      • 説明:1 つ以上のバケット内のすべてのファイルをスキャンします。

      • 開始方法:

        • 単一スキャン:対象バケットの操作する列で、検出をクリックできます。

        • バッチ検出:複数のバケットを選択し、リストの下にあるバッチ検出をクリックします。

    • 増分検出

      • 説明:すでにスキャンされたバケットについては、このオプションは最後のスキャン以降に新規作成または変更されたファイルのみを検出します。

      • 開始方法:対象バケットの操作列で、増分検出をクリックします。

  3. 検出パラメーターの設定

    表示されるダイアログボックスで、必要に応じてパラメーターを設定します。

    • ファイル検出タイプ:スキャンするファイルの拡張子を指定します。デフォルトでは、すべてのファイルタイプがスキャンされます。

    • Decompression LevelExtraction Limit:これらの設定により、圧縮パッケージ内をスキャンできます。展開レベルは最大 5 階層、ファイル制限はパッケージあたり 1,000 に設定できます。デフォルトでは、展開は無効になっています。

    • File Decryption Type:OSS ファイルがサーバー側暗号化 (SSE-OSS または SSE-KMS) を使用している場合、Security Center がファイルを復号してスキャンできるように、適切な復号方法を選択します。

    • スキャンパス

      • Match by Prefix:スキャンするファイルのプレフィックスを入力します。

      • Configure for Entire Bucket:バケット内のすべてのファイルをスキャンします。

  4. 検出タスクの完了を待機

    説明

    検出タスクが完了すると、システムはデータを収集して同期します。結果は通常、1〜2 時間の遅延後に利用可能になります。プロセスが完了するまでお待ちください。

    バケットリストページでFile Check Statusを表示できます。ステータスがNot CheckedからCheckedに変わると、スキャンは完了です。

自動検出 (増分ファイル)

  1. ポリシー管理ページへの移動

    1. Security Center コンソール - リスク管理 - 悪意のあるファイルの検出ページに移動します。左上隅で、アセットが配置されているリージョンを選択します:Chinese MainlandまたはOutside Chinese Mainland

    2. 右上隅で、ポリシー管理をクリックします。

  2. 検出ポリシーの作成または変更

    • 新しいポリシーを作成するにはポリシー管理パネルに移動し、ポリシーの新規追加をクリックします。

    • 既存のポリシーを変更するには:変更したいポリシーの操作する列で、編集をクリックして、対象のバケットをポリシーの範囲に追加します。

  3. 設定完了後、OK をクリックします。

    • Increment Real-time Detection

      説明

      この機能は、Chinese Mainlandのリージョンでのみサポートされています。Outside Chinese Mainlandのリージョンではサポートされていません。

      • 有効:指定されたバケットに新しいファイルがアップロードされると、検出タスクがすぐにトリガーされます。

      • 無効:新しいファイルは、設定された検出期間 (例:毎日または 3 日ごと) とファイル検出時間 (例:02:00–04:00) に基づいて定期的にスキャンされます。

    • バケットの有効化:このポリシーが適用されるバケット。1 つのバケットは 1 つのポリシーにのみ関連付けることができます。

      警告

      ポリシーが有効になった後、新しく追加されたバケット内のファイルは自動的に検出されません。それらをスキャンするには、ポリシーを手動で編集し、新しいバケットを有効なバケットリストに追加する必要があります。

    • 検出サイクル:検出タスクの頻度を選択します。

    • ファイル検出時間:スキャンタスクの実行時間を選択できます。間隔は少なくとも 1 時間必要です。

      警告

      検出タスクが指定されたタイムウィンドウを超えた場合、自動的に一時停止され、次の検出サイクル中に再開されます。

    • その他のパラメーター (展開、復号、スキャンパスなど):詳細については、手動検出の「検出パラメーターの設定」セクションをご参照ください。

SDK 統合

悪意のあるファイルの検出 SDK を業務コードに統合し、返された結果を使用して悪意のあるファイルに関する情報を取得できます。

ステップ 1:アクセス認証情報と権限の準備

  1. AccessKey ペアの作成

    アカウントのセキュリティを確保するため、Alibaba Cloud アカウントの AccessKey ペアは使用しないでください。代わりに、API アクセス用の Resource Access Management (RAM) ユーザーを作成し、最小権限アクセスの原則に基づいて権限を付与します。詳細については、「RAM ユーザーの作成」および「AccessKey ペアの作成」をご参照ください。

    新しいユーザーの作成

    1. Alibaba Cloud アカウントまたは RAM 管理者アカウントでResource Access Management (RAM) コンソールにログインします。ID > ユーザーページで、ユーザーの作成をクリックします。

    2. 次のパラメーターを設定します:

      1. ユーザーアカウント情報:ログイン名やタグなどの詳細を入力します。

      2. アクセスモードには、永続的な AccessKey を使用してアクセスを選択します。

    3. セキュリティ認証を完了します。システムは RAM ユーザーの AccessKey ID と AccessKey Secret を自動的に生成します。この認証情報を安全に保管してください。

      説明

      AccessKey ペアを CSV ファイルとしてダウンロードするか、情報をコピーしてローカルファイルに保存できます。詳細については、「RAM ユーザーの作成」をご参照ください。

    既存の RAM ユーザー

    1. Alibaba Cloud アカウントまたは RAM 管理者アカウントを使用してResource Access Management (RAM) コンソールにログインします。ID > ユーザーページで、対象のユーザーをクリックします。

    2. 認証 > AccessKeyエリアで、AccessKey の作成をクリックします。

    3. シナリオを選択し、AccessKey の作成が必要であることを確認しますを選択し、続行をクリックします。

    4. セキュリティ認証を完了します。システムは RAM ユーザーの AccessKey ID と AccessKey Secret を自動的に生成します。この認証情報を安全に保管してください。

      説明

      AccessKey ペアを CSV ファイルとしてダウンロードするか、情報をコピーしてローカルファイルに保存できます。詳細については、「AccessKey ペアの作成」をご参照ください。

  2. アクセスポリシーの設定

    1. ユーザーページで、対象の RAM ユーザーを見つけ、操作列の権限の追加をクリックします。

    2. ポリシーセクションで、AliyunYundunSASFullAccess を選択し、権限を付与をクリックします。

      説明

      詳細については、「RAM ユーザーに権限を付与する」をご参照ください。

  3. 環境変数の設定

    Alibaba Cloud SDK は、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数を読み取ることで、デフォルトのアクセス認証情報を作成できます。API 操作を呼び出すと、プログラムはこれらの認証情報に直接アクセスし、AccessKey ペアを読み取り、自動的に認証を完了します。詳細については、「環境変数の設定」をご参照ください。

    Linux/macOS

    export コマンドを使用した環境変数の設定

    重要

    export コマンドで設定された一時的な環境変数は、現在のセッションでのみ有効です。セッションが終了すると変数はクリアされます。長期保存 (LTR) のためには、export コマンドをオペレーティングシステムの起動設定ファイルに追加してください。

    • AccessKey ID を設定し、Enter キーを押します。

      # yourAccessKeyID をご自身の AccessKey ID に置き換えてください。
      export ALIBABA_CLOUD_ACCESS_KEY_ID=yourAccessKeyID
    • AccessKey Secret を設定し、Enter キーを押します。

      # yourAccessKeySecret をご自身の AccessKey Secret に置き換えてください。
      export ALIBABA_CLOUD_ACCESS_KEY_SECRET=yourAccessKeySecret
    • 設定の確認

      echo $ALIBABA_CLOUD_ACCESS_KEY_ID コマンドを実行します。コマンドが正しい AccessKey ID を返した場合、設定は成功です。

    Windows

    グラフィカルユーザーインターフェイス (GUI) の使用

    • 手順

      以下の手順は、Windows 10 で GUI を使用して環境変数を設定する方法を説明しています。

      デスクトップで、[この PC] を右クリックし、[プロパティ] > [システムの詳細設定] > [環境変数] > [システム環境変数] または [ユーザー環境変数] の下にある [新規] を選択します。その後、設定を完了します。

      変数

      値の例

      AccessKey ID

      • 変数名:ALIBABA_CLOUD_ACCESS_KEY_ID

      • 変数値:yourAccessKeyID

      AccessKey Secret

      • 変数名:ALIBABA_CLOUD_ACCESS_KEY_SECRET

      • 変数値:yourAccessKeySecret

    • 設定のテスト

      [スタート] をクリック (または Win+R キーボードショートカットを使用)、[ファイル名を指定して実行] をクリックし、`cmd` と入力して [OK] をクリック (または Enter キーを押す) してコマンドプロンプトを開きます。echo %ALIBABA_CLOUD_ACCESS_KEY_ID% および echo %ALIBABA_CLOUD_ACCESS_KEY_SECRET% コマンドを実行します。コマンドが正しい AccessKey を返した場合、設定は成功です。

    コマンドプロンプト (CMD) の使用

    • 手順

      管理者としてコマンドプロンプトを開き、次のコマンドを実行してシステムに新しい環境変数を追加します。

      setx ALIBABA_CLOUD_ACCESS_KEY_ID yourAccessKeyID /M
      setx ALIBABA_CLOUD_ACCESS_KEY_SECRET yourAccessKeySecret /M

      /M パラメーターはシステム環境変数を示します。ユーザー環境変数を設定する際には、このパラメーターを省略できます。

    • 設定のテスト

      [スタート] をクリック (または Win+R キーボードショートカットを使用)、[ファイル名を指定して実行] をクリックし、`cmd` と入力して [OK] をクリック (または Enter キーを押す) してコマンドプロンプトを開きます。echo %ALIBABA_CLOUD_ACCESS_KEY_ID% および echo %ALIBABA_CLOUD_ACCESS_KEY_SECRET% コマンドを実行します。コマンドが正しい AccessKey を返した場合、設定は成功です。

    Windows PowerShell の使用

    PowerShell では、すべての新しいセッションで有効な新しい環境変数を設定できます:

    [System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_ID', 'yourAccessKeyID', [System.EnvironmentVariableTarget]::User)
    [System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_SECRET', 'yourAccessKeySecret', [System.EnvironmentVariableTarget]::User)

    すべてのユーザーに対して環境変数を設定するには、管理者権限が必要です:

    [System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_ID', 'yourAccessKeyID', [System.EnvironmentVariableTarget]::Machine)
    [System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_SECRET', 'yourAccessKeySecret', [System.EnvironmentVariableTarget]::Machine)

    現在のセッションでのみ有効な一時的な環境変数を設定できます:

    $env:ALIBABA_CLOUD_ACCESS_KEY_ID = "yourAccessKeyID"
    $env:ALIBABA_CLOUD_ACCESS_KEY_SECRET = "yourAccessKeySecret"

    PowerShell で、Get-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_ID および Get-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_SECRET コマンドを実行します。コマンドが正しい AccessKey を返した場合、設定は成功です。

ステップ 2:SDK のインストール

開発言語に基づいてインストール方法を選択します。現在、Java と Python がサポートされています。

Java アクセス
  • 前提条件: JDK 1.8 以降。

  • インストール方法:

    1. Java SDK コードリポジトリにアクセスし、最新バージョンの Java SDK ファイルをダウンロードします。

    2. ダウンロードした SDK ファイルへの参照をプロジェクトに追加します。

Python アクセス
  • 前提条件: Python 3.6 以降。

  • 取得方法

    • オンラインインストール: `pip` コマンドを使用して迅速にインストールします。

      <BASH>
      
      pip install -U alibabacloud_filedetect
    • オフラインインストール:

      1. ネットワーク接続のある環境で、Python コードリポジトリにアクセスし、最新バージョンの Python SDK をダウンロードします。

      2. ダウンロードしたソースパッケージをプロジェクト環境にアップロードし、パッケージを展開します。

      3. 展開した SDK のルートディレクトリに移動し、インストールコマンドを実行します:

        <BASH>
        
        # Python SDK のルートディレクトリに切り替えます。
        # ディレクトリ名はバージョンによって異なる場合があります (例: alibabacloud_filedetect-1.0.0)。
        cd alibabacloud_filedetect-x.x.x/
        
        # ご利用の Python バージョンを使用してインストールします。
        python setup.py install

ステップ 3:コードの記述と検出の実行

環境を設定した後、以下の Python および Java のコードサンプルを参照してコードを記述できます。

重要

検出するファイルまたはディレクトリの pathURLMD5 など、サンプルコード内のパラメーターを必要に応じて変更してください。

package com.aliyun.filedetect.sample;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import com.aliyun.filedetect.*;

public class Sample {

	/**
	 * 同期ファイル検出インターフェイス
	 * @param detector Detector オブジェクト
	 * @param path 検出対象ファイルのパス
	 * @param timeout_ms タイムアウト時間をミリ秒単位で設定
	 * @param wait_if_queuefull 検出キューが満杯の場合、false は待たずにすぐにエラーを返し、true はキューに空きができるまで待機
	 * @throws InterruptedException 
	 */
	public static DetectResult detectFileSync(OpenAPIDetector detector, String path, int timeout_ms, boolean wait_if_queuefull) throws InterruptedException {
		if (null == detector || null == path) return null;
		DetectResult result = null;
		while(true) {
			result = detector.detectSync(path, timeout_ms);
			if (null == result) break;
			if (result.error_code != ERR_CODE.ERR_DETECT_QUEUE_FULL) break;
			if (!wait_if_queuefull) break;
			detector.waitQueueAvailable(-1);
		}
		return result;
	}
	
	/**
	 * 非同期ファイル検出インターフェイス
	 * @param detector Detector オブジェクト
	 * @param path 検出対象ファイルのパス
	 * @param timeout_ms タイムアウト時間をミリ秒単位で設定
	 * @param wait_if_queuefull 検出キューが満杯の場合、false は待たずにすぐにエラーを返し、true はキューに空きができるまで待機
	 * @param callback 結果のコールバック関数
	 * @throws InterruptedException 
	 */
	public static int detectFile(OpenAPIDetector detector, String path, int timeout_ms, boolean wait_if_queuefull, IDetectResultCallback callback) throws InterruptedException {
		if (null == detector || null == path || null == callback) return ERR_CODE.ERR_INIT.value();
		int result = ERR_CODE.ERR_INIT.value();
		if (wait_if_queuefull) {
			final IDetectResultCallback real_callback = callback;
			callback = new IDetectResultCallback() {
				public void onScanResult(int seq, String file_path, DetectResult callback_res) {
					if (callback_res.error_code == ERR_CODE.ERR_DETECT_QUEUE_FULL) return;
					real_callback.onScanResult(seq, file_path, callback_res);
				}
			};
		}
		while(true) {
			result = detector.detect(path, timeout_ms, callback);
			if (result != ERR_CODE.ERR_DETECT_QUEUE_FULL.value()) break;
			if (!wait_if_queuefull) break;
			detector.waitQueueAvailable(-1);
		}
		return result;
	}
	
	/**
	 * 同期 URL ファイル検出インターフェイス
	 * @param detector Detector オブジェクト
	 * @param url 検出対象ファイルの URL
	 * @param md5 検出対象ファイルの MD5 ハッシュ
	 * @param timeout_ms タイムアウト時間をミリ秒単位で設定
	 * @param wait_if_queuefull 検出キューが満杯の場合、false は待たずにすぐにエラーを返し、true はキューに空きができるまで待機
	 * @throws InterruptedException 
	 */
	public static DetectResult detectUrlSync(OpenAPIDetector detector, String url, String md5, int timeout_ms, boolean wait_if_queuefull) throws InterruptedException {
		if (null == detector || null == url || null == md5) return null;
		DetectResult result = null;
		while(true) {
			result = detector.detectUrlSync(url, md5, timeout_ms);
			if (null == result) break;
			if (result.error_code != ERR_CODE.ERR_DETECT_QUEUE_FULL) break;
			if (!wait_if_queuefull) break;
			detector.waitQueueAvailable(-1);
		}
		return result;
	}
	
	/**
	 * 非同期 URL ファイル検出インターフェイス
	 * @param detector Detector オブジェクト
	 * @param url 検出対象ファイルの URL
	 * @param md5 検出対象ファイルの MD5 ハッシュ
	 * @param timeout_ms タイムアウト時間をミリ秒単位で設定
	 * @param wait_if_queuefull 検出キューが満杯の場合、false は待たずにすぐにエラーを返し、true はキューに空きができるまで待機
	 * @param callback 結果のコールバック関数
	 * @throws InterruptedException 
	 */
	public static int detectUrl(OpenAPIDetector detector, String url, String md5, int timeout_ms, boolean wait_if_queuefull, IDetectResultCallback callback) throws InterruptedException {
		if (null == detector || null == url || null == md5 || null == callback) return ERR_CODE.ERR_INIT.value();
		int result = ERR_CODE.ERR_INIT.value();
		if (wait_if_queuefull) {
			final IDetectResultCallback real_callback = callback;
			callback = new IDetectResultCallback() {
				public void onScanResult(int seq, String file_path, DetectResult callback_res) {
					if (callback_res.error_code == ERR_CODE.ERR_DETECT_QUEUE_FULL) return;
					real_callback.onScanResult(seq, file_path, callback_res);
				}
			};
		}
		while(true) {
			result = detector.detectUrl(url, md5, timeout_ms, callback);
			if (result != ERR_CODE.ERR_DETECT_QUEUE_FULL.value()) break;
			if (!wait_if_queuefull) break;
			detector.waitQueueAvailable(-1);
		}
		return result;
	}
	
	/**
	 * 検出結果のフォーマット
	 * @param result 検出結果オブジェクト
	 * @return フォーマットされた文字列
	 */
	public static String formatDetectResult(DetectResult result) {
		if (result.isSucc()) {
			DetectResult.DetectResultInfo info = result.getDetectResultInfo();
			String msg = String.format("[DETECT RESULT] [SUCCEED] %s", formatDetectResultInfo(info));
			if (info.compresslist != null) {
				int idx = 1;
				for (DetectResult.CompressFileDetectResultInfo comp_res : info.compresslist) {
					msg += String.format("\n\t\t\t [COMPRESS FILE] [IDX:%d] %s", idx++, formatCompressFileDetectResultInfo(comp_res));
				}
			}
			return msg;
		} 
		DetectResult.ErrorInfo info = result.getErrorInfo();
		return String.format("[DETECT RESULT] [FAIL] md5: %s, time: %d, error_code: %s, error_message: %s"
				, info.md5, info.time, info.error_code.name(), info.error_string);
	}
	
	private static String formatDetectResultInfo(DetectResult.DetectResultInfo info) {
		String msg = String.format("MD5: %s, TIME: %d, RESULT: %s, SCORE: %d", info.md5, info.time, info.result.name(), info.score);
		if (info.compresslist != null) {
			msg += String.format(", COMPRESS_FILES: %d", info.compresslist.size());
		}
		DetectResult.VirusInfo vinfo = info.getVirusInfo();
		if (vinfo != null) {
			msg += String.format(", VIRUS_TYPE: %s, EXT_INFO: %s", vinfo.virus_type, vinfo.ext_info);
		}
		return msg;
	}
	private static String formatCompressFileDetectResultInfo(DetectResult.CompressFileDetectResultInfo info) {
		String msg = String.format("PATH: %s, \t\t RESULT: %s, SCORE: %d", info.path, info.result.name(), info.score);
		DetectResult.VirusInfo vinfo = info.getVirusInfo();
		if (vinfo != null) {
			msg += String.format(", VIRUS_TYPE: %s, EXT_INFO: %s", vinfo.virus_type, vinfo.ext_info);
		}
		return msg;
	}
	
	/**
	 * ディレクトリまたはファイルを同期的に検出
	 * @param path 指定されたパスはファイルまたはディレクトリ。ディレクトリの場合、その内容を再帰的に走査。
	 * @param is_sync 同期インターフェイスを使用するかどうかを指定。非同期インターフェイスの使用を推奨。true: 同期、false: 非同期
	 * @throws InterruptedException 
	 */
	public static void detectDirOrFileSync(OpenAPIDetector detector, String path, int timeout_ms, Map<String, DetectResult> result_map) throws InterruptedException {
		File file = new File(path);
		String abs_path = file.getAbsolutePath();
		if (file.isDirectory()) {
			String[] ss = file.list();
	        if (ss == null) return;
	        for (String s : ss) {
	        	String subpath = abs_path + File.separator + s;
	        	detectDirOrFileSync(detector, subpath, timeout_ms, result_map);
	        }
			return;
		}

    	System.out.println(String.format("[detectFileSync] [BEGIN] queueSize: %d, path: %s, timeout: %d", detector.getQueueSize(), abs_path, timeout_ms));
		DetectResult res = detectFileSync(detector, abs_path, timeout_ms, true);
    	System.err.println(String.format("                 [ END ] %s", formatDetectResult(res)));
		result_map.put(abs_path, res);
	}
	
	/**
	 * ディレクトリまたはファイルを非同期的に検出
	 * @param path 指定されたパスはファイルまたはディレクトリ。ディレクトリの場合、その内容を再帰的に走査。
	 * @param is_sync 同期インターフェイスを使用するかどうかを指定。非同期インターフェイスの使用を推奨。true: 同期、false: 非同期
	 * @throws InterruptedException 
	 */
	public static void detectDirOrFile(OpenAPIDetector detector, String path, int timeout_ms, IDetectResultCallback callback) throws InterruptedException {
		File file = new File(path);
		String abs_path = file.getAbsolutePath();
		if (file.isDirectory()) {
			String[] ss = file.list();
	        if (ss == null) return;
	        for (String s : ss) {
	        	String subpath = abs_path + File.separator + s;
	        	detectDirOrFile(detector, subpath, timeout_ms, callback);
	        }
	        return;
		}

    	
		int seq = detectFile(detector, abs_path, timeout_ms, true, callback);
		System.out.println(String.format("[detectFile] [BEGIN] seq: %d, queueSize: %d, path: %s, timeout: %d", seq, detector.getQueueSize(), abs_path, timeout_ms));
	}
	
	/**
	 * ファイルまたはディレクトリの検出を開始
	 * @param path 指定されたパスはファイルまたはディレクトリ。ディレクトリの場合、その内容を再帰的に走査。
	 * @param is_sync 同期インターフェイスを使用するかどうかを指定。非同期インターフェイスの使用を推奨。true: 同期、false: 非同期
	 * @throws InterruptedException 
	 */
	public static void scan(final OpenAPIDetector detector, String path, int detect_timeout_ms, boolean is_sync) throws InterruptedException {
		System.out.println(String.format("[SCAN] [START] path: %s, detect_timeout_ms: %d, is_sync: %b", path, detect_timeout_ms, is_sync));
		long start_time = System.currentTimeMillis();
		final Map<String, DetectResult> result_map = new HashMap<>();
		if (is_sync) {
			detectDirOrFileSync(detector, path, detect_timeout_ms, result_map);
		} else {
			detectDirOrFile(detector, path, detect_timeout_ms, new IDetectResultCallback() {
				public void onScanResult(int seq, String file_path, DetectResult callback_res) {
			    	System.err.println(String.format("[detectFile] [ END ] seq: %d, queueSize: %d, %s", seq, detector.getQueueSize(), formatDetectResult(callback_res)));
					result_map.put(file_path, callback_res);
				}
			});
			// タスクが完了するのを待機
			detector.waitQueueEmpty(-1);
		}
		long used_time = System.currentTimeMillis() - start_time;
		System.out.println(String.format("[SCAN] [ END ] used_time: %d, files: %d", used_time, result_map.size()));
		
		int fail_count = 0;
		int white_count = 0;
		int black_count = 0;
		for (Map.Entry<String, DetectResult> entry : result_map.entrySet()) {
			DetectResult res = entry.getValue();
			if (res.isSucc()) {
				if (res.getDetectResultInfo().result == DetectResult.RESULT.RES_BLACK) {
					black_count ++;
				} else {
					white_count ++;
				}
			} else {
				fail_count ++;
			}
		}
		System.out.println(String.format("             fail_count: %d, white_count: %d, black_count: %d"
				, fail_count, white_count, black_count));
	}
	
    public static void main(String[] args_) throws Exception {
    	// detector インスタンスを取得
    	OpenAPIDetector detector = OpenAPIDetector.getInstance();
    	
    	// 初期化
    	ERR_CODE init_ret = detector.init(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
    	System.out.println("INIT RET: " + init_ret.name());
    	
    	// 展開パラメーターを設定 (オプション、デフォルトでは圧縮パッケージは展開されない)
    	boolean decompress = true; // 圧縮ファイルを識別して展開するかどうかを指定。デフォルトは false。
    	int decompressMaxLayer = 5; // 最大展開レベル。decompress が true の場合に有効。
    	int decompressMaxFileCount = 1000; // 最大展開ファイル数。decompress が true の場合に有効。
    	ERR_CODE initdec_ret = detector.initDecompress(decompress, decompressMaxLayer, decompressMaxFileCount);
    	System.out.println("INIT_DECOMPRESS RET: " + initdec_ret.name());
    	
    	if (true) {
    		// 例 1:ローカルのディレクトリまたはファイルをスキャン
    		boolean is_sync_scan = false; // 非同期または同期検出を使用するかどうかを指定。非同期検出の方がパフォーマンスが良い。false は非同期検出を示す。
        	int timeout_ms = 500000;  // 単一サンプルの検出時間 (ミリ秒)
        	String path = "test2.php"; // スキャン対象のファイルまたはディレクトリ
        	// スキャンを開始し、完了を待機
        	scan(detector, path, timeout_ms, is_sync_scan);
    	}
    	
    	if (true) {
    		// 例 2:URL ファイルをスキャン
        	int timeout_ms = 500000;  // 単一サンプルの検出時間 (ミリ秒)
        	String url = "https://xxxxxxxx.oss-cn-hangzhou-1.aliyuncs.com/xxxxx/xxxxxxxxxxxxxx?Expires=1*****25&OSSAccessKeyId=xxx"; // スキャン対象の URL ファイル
        	String md5 = "a767f*************6e21d000000"; // スキャン対象ファイルの MD5 ハッシュ
        	// 同期スキャン。非同期スキャンを実行するには、detectUrl インターフェイスを呼び出す
        	System.out.println(String.format("[detectUrlSync] [BEGIN] URL: %s, MD5: %s, TIMEOUT: %d", url, md5, timeout_ms));
        	DetectResult result = detectUrlSync(detector, url, md5, timeout_ms, true);
        	System.err.println(String.format("[detectUrlSync] [ END ] %s", formatDetectResult(result)));
    	}
    	
    	
		// 初期化解除
		System.out.println("Over.");
    	detector.uninit();
    }
}
# -*- coding: utf-8 -*-
import os
import sys
from typing import List
import threading
import time
import traceback

from alibabacloud_filedetect.OpenAPIDetector import OpenAPIDetector
from alibabacloud_filedetect.IDetectResultCallback import IDetectResultCallback
from alibabacloud_filedetect.ERR_CODE import ERR_CODE
from alibabacloud_filedetect.DetectResult import DetectResult

class Sample(object):
    
    def __init__(self):
        pass


    """
    同期ファイル検出インターフェイス
    @param detector: Detector オブジェクト
    @param path: 検出対象ファイルのパス
    @param timeout_ms: タイムアウト時間をミリ秒単位で設定
    @param wait_if_queuefull: 検出キューが満杯の場合、False は待たずにすぐにエラーを返し、True はキューに空きができるまで待機
    """
    def detectFileSync(self, detector, path, timeout_ms, wait_if_queuefull):
        if detector is None or path is None:
            return None
        result = None
        while True:
            result = detector.detectSync(path, timeout_ms)
            if result is None:
                break
            if result.error_code != ERR_CODE.ERR_DETECT_QUEUE_FULL:
                break
            if wait_if_queuefull is False:
                break
            detector.waitQueueAvailable(-1)
        return result


    """
    非同期ファイル検出インターフェイス
    @param detector: Detector オブジェクト
    @param path: 検出対象ファイルのパス
    @param timeout_ms: タイムアウト時間をミリ秒単位で設定
    @param wait_if_queuefull: 検出キューが満杯の場合、False は待たずにすぐにエラーを返し、True はキューに空きができるまで待機
    @param callback: 結果のコールバック関数
    """
    def detectFile(self, detector, path, timeout_ms, wait_if_queuefull, callback):
        if detector is None or path is None or callback is None:
            return ERR_CODE.ERR_INIT.value
        result = ERR_CODE.ERR_INIT.value
        if wait_if_queuefull:
            real_callback = callback
            class AsyncTaskCallback(IDetectResultCallback):
                def onScanResult(self, seq, file_path, callback_res):
                    if callback_res.error_code == ERR_CODE.ERR_DETECT_QUEUE_FULL:
                        return
                    real_callback.onScanResult(seq, file_path, callback_res)
            callback = AsyncTaskCallback()
        while True:
            result = detector.detect(path, timeout_ms, callback)
            if result != ERR_CODE.ERR_DETECT_QUEUE_FULL.value:
                break
            if wait_if_queuefull is False:
                break
            detector.waitQueueAvailable(-1)
        return result
    

    """
    同期 URL ファイル検出インターフェイス
    @param detector: Detector オブジェクト
	@param url: 検出対象ファイルの URL
	@param md5: 検出対象ファイルの MD5 ハッシュ
	@param timeout_ms: タイムアウト時間をミリ秒単位で設定
	@param wait_if_queuefull: 検出キューが満杯の場合、false は待たずにすぐにエラーを返し、true はキューに空きができるまで待機
    """
    def detectUrlSync(self, detector, url, md5, timeout_ms, wait_if_queuefull):
        if detector is None or url is None or md5 is None:
            return None
        result = None
        while True:
            result = detector.detectUrlSync(url, md5, timeout_ms)
            if result is None:
                break
            if result.error_code != ERR_CODE.ERR_DETECT_QUEUE_FULL:
                break
            if wait_if_queuefull is False:
                break
            detector.waitQueueAvailable(-1)
        return result


    """
    非同期 URL ファイル検出インターフェイス
	@param detector: Detector オブジェクト
	@param url: 検出対象ファイルの URL
	@param md5: 検出対象ファイルの MD5 ハッシュ
	@param timeout_ms: タイムアウト時間をミリ秒単位で設定
	@param wait_if_queuefull: 検出キューが満杯の場合、false は待たずにすぐにエラーを返し、true はキューに空きができるまで待機
	@param callback: 結果のコールバック関数
    """
    def detectUrl(self, detector, url, md5, timeout_ms, wait_if_queuefull, callback):
        if detector is None or url is None or md5 is None or callback is None:
            return ERR_CODE.ERR_INIT.value
        result = ERR_CODE.ERR_INIT.value
        if wait_if_queuefull:
            real_callback = callback
            class AsyncTaskCallback(IDetectResultCallback):
                def onScanResult(self, seq, file_path, callback_res):
                    if callback_res.error_code == ERR_CODE.ERR_DETECT_QUEUE_FULL:
                        return
                    real_callback.onScanResult(seq, file_path, callback_res)
            callback = AsyncTaskCallback()
        while True:
            result = detector.detectUrl(url, md5, timeout_ms, callback)
            if result != ERR_CODE.ERR_DETECT_QUEUE_FULL.value:
                break
            if wait_if_queuefull is False:
                break
            detector.waitQueueAvailable(-1)
        return result


    """
    検出結果のフォーマット
    @param result: 検出結果オブジェクト
    @return: フォーマットされた文字列
    """
    @staticmethod
    def formatDetectResult(result):
        msg = ""
        if result.isSucc():
            info = result.getDetectResultInfo()
            msg = "[DETECT RESULT] [SUCCEED] {}".format(Sample.formatDetectResultInfo(info))
            if info.compresslist is not None:
                idx = 1
                for comp_res in info.compresslist:
                    msg += "\n\t\t\t [COMPRESS FILE] [IDX:{}] {}".format(idx, Sample.formatCompressFileDetectResultInfo(comp_res))
                    idx += 1
        else:
            info = result.getErrorInfo()
            msg = "[DETECT RESULT] [FAIL] md5: {}, time: {}, error_code: {}, error_message: {}".format(info.md5,
                info.time, info.error_code.name, info.error_string)
        return msg


    @staticmethod
    def formatDetectResultInfo(info):
        msg = "MD5: {}, TIME: {}, RESULT: {}, SCORE: {}".format(info.md5, info.time, info.result.name, info.score)
        if info.compresslist is not None:
            msg += ", COMPRESS_FILES: {}".format(len(info.compresslist))
        vinfo = info.getVirusInfo()
        if vinfo is not None:
            msg += ", VIRUS_TYPE: {}, EXT_INFO: {}".format(vinfo.virus_type, vinfo.ext_info)
        return msg


    @staticmethod
    def formatCompressFileDetectResultInfo(info):
        msg = "PATH: {}, \t\t RESULT: {}, SCORE: {}".format(info.path, info.result.name, info.score)
        vinfo = info.getVirusInfo()
        if vinfo is not None:
            msg += ", VIRUS_TYPE: {}, EXT_INFO: {}".format(vinfo.virus_type, vinfo.ext_info)
        return msg


    """
    ディレクトリまたはファイルを同期的に検出
    @param path: 指定されたパスはファイルまたはディレクトリ。ディレクトリの場合、その内容を再帰的に走査。
    @param is_sync: 同期インターフェイスを使用するかどうかを指定。非同期インターフェイスの使用を推奨。True: 同期、False: 非同期
    """
    def detectDirOrFileSync(self, detector, path, timeout_ms, result_map):
        abs_path = os.path.abspath(path)
        if os.path.isdir(abs_path):
            sub_files = os.listdir(abs_path)
            if len(sub_files) == 0:
                return
            for sub_file in sub_files:
                sub_path = os.path.join(abs_path, sub_file)
                self.detectDirOrFileSync(detector, sub_path, timeout_ms, result_map)
            return
        
        print("[detectFileSync] [BEGIN] queueSize: {}, path: {}, timeout: {}".format(
            detector.getQueueSize(), abs_path, timeout_ms))
        res = self.detectFileSync(detector, abs_path, timeout_ms, True)
        print("                 [ END ] {}".format(Sample.formatDetectResult(res)))
        result_map[abs_path] = res
        return


    """
    ディレクトリまたはファイルを非同期的に検出
    @param path: 指定されたパスはファイルまたはディレクトリ。ディレクトリの場合、その内容を再帰的に走査。
    @param is_sync: 同期インターフェイスを使用するかどうかを指定。非同期インターフェイスの使用を推奨。True: 同期、False: 非同期
    """
    def detectDirOrFile(self, detector, path, timeout_ms, callback):
        abs_path = os.path.abspath(path)
        if os.path.isdir(abs_path):
            sub_files = os.listdir(abs_path)
            if len(sub_files) == 0:
                return
            for sub_file in sub_files:
                sub_path = os.path.join(abs_path, sub_file)
                self.detectDirOrFile(detector, sub_path, timeout_ms, callback)
            return
        
        seq = self.detectFile(detector, abs_path, timeout_ms, True, callback)
        print("[detectFile] [BEGIN] seq: {}, queueSize: {}, path: {}, timeout: {}".format(
            seq, detector.getQueueSize(), abs_path, timeout_ms))   
        return

    
    """
    ファイルまたはディレクトリの検出を開始
    @param path: 指定されたパスはファイルまたはディレクトリ。ディレクトリの場合、その内容を再帰的に走査。
    @param is_sync: 同期インターフェイスを使用するかどうかを指定。非同期インターフェイスの使用を推奨。True: 同期、False: 非同期
    """
    def scan(self, detector, path, detect_timeout_ms, is_sync):
        try:
            print("[SCAN] [START] path: {}, detect_timeout_ms: {}, is_sync: {}".format(path, detect_timeout_ms, is_sync))
            start_time = time.time()
            result_map = {}
            if is_sync:
                self.detectDirOrFileSync(detector, path, detect_timeout_ms, result_map)
            else:
                class AsyncTaskCallback(IDetectResultCallback):
                    def onScanResult(self, seq, file_path, callback_res):
                        print("[detectFile] [ END ] seq: {}, queueSize: {}, {}".format(seq,
                            detector.getQueueSize(), Sample.formatDetectResult(callback_res)))
                        result_map[file_path] = callback_res
                self.detectDirOrFile(detector, path, detect_timeout_ms, AsyncTaskCallback())
                # タスクが完了するのを待機
                detector.waitQueueEmpty(-1)
            
            used_time_ms = (time.time() - start_time) * 1000 
            print("[SCAN] [ END ] used_time: {}, files: {}".format(int(used_time_ms), len(result_map)))
            
            failed_count = 0
            white_count = 0
            black_count = 0
            for file_path, res in result_map.items():
                if res.isSucc():
                    if res.getDetectResultInfo().result == DetectResult.RESULT.RES_BLACK:
                        black_count += 1
                    else:
                        white_count += 1
                else:
                    failed_count += 1
            
            print("               fail_count: {}, white_count: {}, black_count: {}".format(
                failed_count, white_count, black_count))

        except Exception as e:
            print(traceback.format_exc(), file=sys.stderr)


    def main(self):

        # detector インスタンスを取得
        detector = OpenAPIDetector.get_instance()

        # 環境変数から Access Key ID と Access Key Secret を読み取る
        access_key_id = os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID')
        access_key_secret = os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET')

        # 初期化
        init_ret = detector.init(access_key_id, access_key_secret)
        print("INIT RET: {}".format(init_ret.name))

        # 展開パラメーターを設定 (オプション、デフォルトでは圧縮パッケージは展開されない)
        decompress = True # 圧縮ファイルを識別して展開するかどうかを指定。デフォルトは false。
        decompressMaxLayer = 5 # 最大展開レベル。decompress が true の場合に有効。
        decompressMaxFileCount = 1000 # 最大展開ファイル数。decompress が true の場合に有効。
        initdec_ret = detector.initDecompress(decompress, decompressMaxLayer, decompressMaxFileCount)
        print("INIT_DECOMPRESS RET: {}".format(initdec_ret.name))

        if True:
            # 例 1:ローカルのディレクトリまたはファイルをスキャン
            is_sync_scan = False # 非同期または同期検出を使用するかどうかを指定。非同期検出の方がパフォーマンスが良い。False は非同期検出を示す。
            timeout_ms = 500000 # 単一サンプルの検出時間 (ミリ秒)
            path = "test.bin" # スキャン対象のファイルまたはディレクトリ
            # スキャンを開始し、完了を待機
            self.scan(detector, path, timeout_ms, is_sync_scan)

        if True:
            # 例 2:URL ファイルをスキャン
            timeout_ms = 500000
            url = "https://xxxxxxxx.oss-cn-hangzhou-1.aliyuncs.com/xxxxx/xxxxxxxxxxxxxx?Expires=1671448125&OSSAccessKeyId=xxx" # スキャン対象の URL ファイル
            md5 = "a767ffc59d93125c7505b6e21d000000"
            # 同期スキャン。非同期スキャンを実行するには、detectUrl インターフェイスを呼び出す
            print("[detectUrlSync] [BEGIN] URL: {}, MD5: {}, TIMEOUT: {}".format(url, md5, timeout_ms))
            result = self.detectUrlSync(detector, url, md5, timeout_ms, True)
            print("[detectUrlSync] [ END ] {}".format(Sample.formatDetectResult(result)))

        # 初期化解除
        print("Over.")
        detector.uninit()
        

if __name__ == "__main__":
    sample = Sample()
    sample.main()

ステップ 4:返された結果の解析

SDK を呼び出して悪意のあるファイルを検出した後、プログラムの出力で検出結果を表示できます。結果は Security Center コンソールとも同期されます。

  • 結果のデータ構造:各検出は DetectResult オブジェクトを返します。このオブジェクトのコアフィールドは次のとおりです:

    フィールド名

    タイプ

    説明

    md5

    String

    ファイルの MD5 ハッシュ値。

    time

    long

    この検出にかかった時間 (ミリ秒)。

    error_code

    ERR_CODE

    エラーコード。ERR_SUCC は成功を示します。

    error_string

    String

    エラーメッセージの詳細な説明。

    result

    RESULT (enum)

    検出結果の列挙:

    • RES_WHITE:安全

    • RES_BLACK:不審/悪意あり

    • RES_PENDING:検出中

    score

    int

    検出スコア、0 から 100 の範囲。スコアが高いほどリスクが高いことを示します。

    • 0〜60:安全。ファイルは信頼されており、通常は対応不要です。

    • 61〜70:リスク (低)。ファイルはわずかなリスクをもたらします。手動での確認を推奨します。

    • 71〜80:不審 (中)。ファイルは悪意のある可能性が高いです。隔離または削除を推奨します。

    • 81〜100:悪意あり (高)。ファイルはほぼ確実に悪意があります。直ちに隔離または削除してください。

    virus_type

    String

    WebShell、MalScript、Hacktool などのウイルスの種類。

    ext_info

    String

    拡張情報。通常は JSON 形式の文字列で、より詳細な検出コンテキストが含まれます。

    compresslist

    List

    圧縮パッケージが検出され、展開が有効になっている場合、このリストにはパッケージ内の各ファイルの検出結果が含まれます。

  • エラーコードとトラブルシューティング

    エラーコード

    説明

    原因

    推奨される操作

    ERR_SUCC

    成功

    検出が正常に完了しました。

    なし

    ERR_INIT

    初期化エラー

    SDK の初期化が必要、または初期化が繰り返し実行されました。

    init() が検出インターフェイスを呼び出す前に正常に呼び出されていることを確認してください。

    ERR_FILE_NOT_FOUND

    ファイルが見つかりません

    指定されたローカルファイルパスが存在しません。

    ファイルパスが正しいか、プログラムにファイルの読み取り権限があるかを確認してください。

    ERR_CALL_API

    API 呼び出しエラー

    クラウド API の呼び出し時に不明なエラーが発生しました。

    コードとパラメーター値を確認してください。

    ERR_TIMEOUT

    タイムアウト

    検出時間が設定された timeout_ms を超えました。

    timeout_ms パラメーターの値を増やすか、ネットワーク接続を確認してください。

    ERR_UPLOAD

    アップロード失敗

    ファイルをクラウドにアップロードして分析できませんでした。リトライできます。

    これは通常、ネットワークの問題です。リトライロジックを追加することを推奨します。

    ERR_ABORT

    タスクが中止されました

    検出が完了する前にプログラムが終了しました。検出中のファイル数が購入したサブスクリプションクォータを超えているか、従量課金のアカウント残高が不足している可能性があります。

    ファイル検出数を追加購入するか、アカウントにチャージしてください。

    ERR_DETECT_QUEUE_FULL

    検出キューが満杯です

    検出タスクが頻繁に送信されすぎ、サーバー側のキューが満杯です。

    これは、ビジネスのピーク時にトリガーされる可能性があります。waitQueueAvailable() を呼び出してキューが利用可能になるのを待つか、後でリトライしてください。

    ERR_TIMEOUT_QUEUE

    キューのタイムアウト

    キューでの待機時間が長すぎました。

    ERR_MD5

    MD5 形式エラー

    提供された MD5 文字列の形式が正しくありません。

    MD5 形式を修正してください。

    ERR_URL

    URL 形式エラー

    提供された URL 文字列の形式が正しくありません。

    URL 形式を修正してください。

検出結果の表示と処理

  • 結果の表示

    • リスクファイルの概要 タブ:

      • このタブには、OSS 検出や API 呼び出しなどの検出方法で検知されたすべての危険なファイルが表示されます。危険なファイルの検索、絞り込み、およびリスクレベルや脅威タグなどの情報を表示できます。

      • 圧縮パッケージの場合、ファイル名の横にある展開 image アイコンをクリックすると、パッケージ内の危険なファイルのリストを表示できます。

    • OSS ファイルの検出 タブ:

      • このタブには、各バケットの危険なファイルの数や検出の進捗など、バケットごとのリスク統計が表示されます。

      • 操作する 列で 詳細 をクリックして、関連する悪意のあるファイルのリストを表示します。

  • 結果の配信:Security Center で ログ分析 または ログ管理 機能を有効にすると、悪意のあるファイル検出ログは専用の Logstore に自動的に保存されます。これにより、詳細なクエリやトレース分析を実行できます。詳細については、「悪意のあるファイル検出ログ」および「ログ管理」をご参照ください。

  • 結果の処理:検出結果は、ファイルを Add to Whitelist[無視]、または Denied Access に追加することで処理できます。これらの操作の詳細については、「検出結果の処理」をご参照ください。

サービスの解約

  • サブスクリプション

    1. Security Center コンソール - 概要 ページの Subscription セクションで、設定の変更 > Downgrade をクリックします。

    2. Order Downgrade タブの 不正ファイル検出 セクションで、購入するかどうかNo に設定し、その後 Order Now をクリックします。

  • 従量課金

課金

悪意のあるファイルの検出は、ファイル検出回数に基づいて課金されます。検出回数は、スキャン対象ファイル数と等しくなります。

  • 悪意のあるファイルの検出では、以下の課金方法が利用可能です:無料トライアルサブスクリプション、および従量課金

    • 無料トライアル:企業向け本人確認を完了した Alibaba Cloud アカウントは、10,000 回のファイル検出を上限とする無料トライアルをご利用いただけます。

      重要

      無料トライアルのクォータが消費される前に有料プランを有効化した場合、残りの無料検出回数は継続して利用可能であり、優先的に消費されます。

    • サブスクリプション:リソースプランを購入できます。単価は、検出 10,000 回あたり月額 1.5 USDです。最低購入単位は検出 100,000 回です。購入後、選択した有効期間中プランが有効になります。有効期限が切れた時点で未使用のリソースは失効します。

    • 従量課金

      • ファイル検出の課金サイクルは暦日であり、単価は検出 1 回あたり 0.0002 USDです。

      • 従量課金サービスを有効化すると、基本サービス料金も Security Center に対して課金されます(USD 0.0072/時間)。

  • 圧縮ファイルの課金:圧縮ファイルの検出を有効化した場合、消費される検出回数は圧縮ファイル内のファイル数に基づきます。

    たとえば、1,000 個の小ファイルを含む圧縮ファイルをスキャンすると、1,000 回の検出が消費されます。

  • 検出結果の処理:検出結果の処理はサービス料金に含まれており、追加の課金は発生しません。

説明

詳細については、「課金の詳細」をご参照ください。

クォータと制限

  • 購入制限: Alibaba Cloud アカウントは、一度に1つの課金方法のみを使用できます。

    説明

    課金方法を切り替えても、既存のスキャン結果や定期的なポリシーの実行には影響しません。

  • ファイルサイズ制限

    • タスクあたりの合計ファイルサイズ: 無制限。

    • 単一ファイルサイズ制限:

      • SDK を使用したオフラインファイルスキャン: 単一ファイルは 100 MB を超えることはできません。

      • コンソールを使用した OSSファイルスキャン: 単一ファイルは 1 GB を超えることはできません。

    • 制限超過

      • ファイルがサイズ制限を超過した場合、または展開されたファイルが数量またはサイズ制限を超過した場合、そのファイルはスキャンされません。未スキャンファイルに対しては課金されません。

      • 悪意のあるファイルのスキャンリクエストがキュー容量を超過した場合、それらはキューに格納されます。待機時間を短縮するには、同時処理を最適化できます。

  • 圧縮ファイルスキャン制限: 圧縮ファイルスキャンは、展開レイヤーが 5 層、ファイル数が 1,000 個、合計サイズが 1 GB に制限されます。

  • デフォルトの API リクエスト頻度 (クエリ/秒、QPS): トライアル版は 10 QPS をサポートします。有料版は 20 QPS をサポートします。

    説明
    • スキャン速度は、ネットワーク条件、サーバー性能、クラウドプロダクトの仕様など、複数の要因によって影響を受けます。

    • SDK は内部非同期キューを使用してピークリクエストを管理し、同時処理を改善します。キューが満杯の場合、キューにスペースが利用可能になるまで新しいリクエストは一時停止されます。

附録

API リファレンス

API オペレーションを呼び出して、悪意のあるファイル検出機能を使用できます。関連する API オペレーションを以下に示します。詳細については、「ファイル検出」および「悪意のあるファイル検出 OSS」をご参照ください。

サポートされているウイルスタイプ

ウイルスタイプ (virus_type)

ウイルス名

Backdoor

リバースシェルバックドア

DDoS

DDoS Trojan

Downloader

ダウンローダートロイの木馬

Engtest

DPI エンジンテストプログラム

Hacktool

ハッキングツール

Trojan

クリティカルなプログラム

Malbaseware

汚染された基本ソフトウェア

MalScript

悪意のあるスクリプト

Malware

悪意のあるプログラム

Miner

マイニングプログラム

Proxytool

プロキシツール

RansomWare

ランサムウェア

RiskWare

リスクウェア

Rootkit

ルートキット

Stealer

情報窃取ツール

Scanner

スキャナー

Suspicious

不審なプログラム

Virus

感染性ウイルス

WebShell

Webシェル

Worm

ワーム

AdWare

アドウェア

Patcher

クラッキングプログラム

Gametool

プライベートサーバーツール

よくある質問

課金とクォータに関する問題

  • 使用済みファイルスキャンクォータは返金可能ですか?

    いいえ。ファイルスキャンクォータを無駄にしないために、スキャンを開始する前にファイルの範囲とスキャンポリシーを確認してください。

  • OSSファイルスキャンタブで「合計ファイル数」と「合計スキャン済みファイル数」の値が異なるのはなぜですか?

    • 合計ファイル数:バケット内のファイル数です。圧縮パッケージは 1 ファイルとしてカウントされます。

    • 合計スキャン済みファイル数:実際にスキャンされたファイル数です。圧縮パッケージスキャンを有効にすると、パッケージ内のファイルもカウントされます。合計数は、解凍レベル最大解凍ファイル数の設定によって異なります。

    多数のファイルを含む圧縮パッケージをスキャンすると、「合計スキャン済みファイル数」の値は「合計ファイル数」の値よりもはるかに大きくなります。課金は、実際にスキャンされたファイル数に基づいて行われます。

  • クォータ不足のためスキャンジョブが中断された場合、どうすればよいですか?

    サブスクリプション課金方法を使用している場合、ご利用の残りのスキャンクォータが不足していると、スキャンジョブは中断されます。以下のいずれかのソリューションを試すことができます。

    • 構成のアップグレード: Security Center コンソール - 概要 ページで、Subscription セクションを探します。設定の変更 > Upgrade Now をクリックして、十分な不正ファイルのスキャンクォータを購入します。詳細については、「スペックアップとスペックダウン」をご参照ください。

    • スキャンポリシーを変更:スキャン設定で、[圧縮パッケージ解凍] を無効にして、単一ジョブで消費されるクォータを削減します。その後、再度スキャンを実行します。

権限管理

悪意のあるファイルSDKの権限付与の詳細 (残りのクォータ、有効期限など) を表示するにはどうすればよいですか?

コンソールで、現在の利用アカウントの SDK Authorization for User を表示できます。このステータスには、バージョン、アクティベーションステータス、権限付与制限、残りのクォータ、頻度制限、有効期限などの情報が含まれます。

  1. Security Center コンソール - 脅威管理 - 悪意のあるファイル SDKSecurity Center コンソール - リスクガバナンス - 悪意のあるファイル検出用 SDK ページに移動します。ページの左上隅で、資産が配置されているリージョンを選択します:Chinese Mainland または Outside Chinese Mainland

  2. 右上隅で、SDK and Permissions をクリックします。