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

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

最終更新日:Jun 02, 2026

ファイルのアップロード、コードのリリース、データ共有パイプラインを通じて、ランサムウェア、マイニングプログラム、Web シェルなど、システムとデータを脅かす悪意のあるファイルが持ち込まれる可能性があります。Security Center の悪意のあるファイル検出機能は、マルチエンジン プラットフォームを使用してサーバーまたは Object Storage Service (OSS) バケットからファイルをスキャンし、被害が発生する前に脅威にフラグを立てます。

ユースケース

シナリオ

説明

サーバーの攻撃防止

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

標的型攻撃対策

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

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

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

システム環境全体の検出

ランサムウェアや感染型ウイルスをスキャンして削除し、データが人質に取られることや広範囲なシステムの麻痺を防ぎます。

検出方法

Security Center は、SDK 統合コンソール操作の 2 つの検出方法をサポートしています。

機能

SDK 統合

コンソール操作

使用方法

SDK を業務コード (Java または Python) に統合し、プログラムから呼び出します。

Security Center コンソールを使用し、グラフィカルインターフェイス上でバケットをスキャンします。

対応ファイルソース

サーバーファイル (ローカルパス) と OSS ファイル (有効なダウンロード URL 経由)。

OSS ファイルのみ。

適用範囲

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

    カテゴリ

    拡張子

    圧縮パッケージ

    .7z, .zip, .rar, .tar, .gz, .bz2, .xz, .lzma, .ar, .tar.gz

    スクリプトと Web シェル

    .php, .jsp, .jspx, .asp, .aspx, .sh, .py, .ps1, .pl, .bat, .html

    ドキュメント

    .doc, .pdf, .ppt, .xsl, .rtf, .hta, .chm, .docx

    実行可能ファイルとバイナリ

    .apk, .exe, .dll, .ocx, .com, .so, .sys, .ko, .obj

    画像

    .jpg, .jpeg, .png

  • 圧縮ファイルと暗号化ファイルの検出

    • 圧縮パッケージ: Security Center は、暗号化されていない圧縮パッケージを最大 5 階層まで展開してスキャンできます。 パッケージあたりのファイル数は最大 1,000 個、展開後のサイズは合計で最大 1 GB です。 展開はデフォルトで無効になっています。

    • 暗号化されたファイル: Security Center は、OSS のサーバー側の暗号化 (SSE-KMS または SSE-OSS) で暗号化されたファイルを自動的に復号してスキャンします。

  • ストレージクラスの制約

    サポートされるのは、標準および低頻度アクセスのストレージクラスに属する OSS ファイルのみです。 アーカイブのストレージクラスに属するファイルはサポートされません。

  • OSS バケット検出のサポート対象リージョン

    • China (Qingdao), China (Beijing), China (Zhangjiakou), China (Hohhot), China (Ulanqab)

    • China (Hangzhou), China (Shanghai)

    • China (Shenzhen), China (Heyuan), China (Guangzhou)

    • China (Chengdu), China (Hong Kong)

    • Singapore, Malaysia (Kuala Lumpur), Indonesia (Jakarta), Philippines (Manila), Thailand (Bangkok), Japan (Tokyo), South Korea (Seoul), US (Silicon Valley), US (Virginia), Germany (Frankfurt), UK (London)

  • サポートされるウイルスの種類

    検出可能なウイルスの種類の一覧については、付録の「サポートされるウイルスの種類」をご参照ください。

サービスの購入と有効化

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

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

    • [Try Now]: お客様の Alibaba Cloud アカウントが企業実名認証に合格している場合、悪意のあるファイル検出の無料トライアルを有効化できます。

      • 各 Alibaba Cloud アカウントは、1 回のみ無料トライアルを利用できます。

      • トライアルには、10,000 回分の悪意のあるファイル検出が含まれます。

    • サブスクリプション:購入ページに移動します。以下を設定します。

      • 不正ファイル検出 セクションで、購入するかどうかYes に設定します。

      • 必要な検出回数を入力します (最小購入数:100,000)。

    • 従量課金

      • 従量課金の有効化ダイアログで、Activate Pay-as-you-go をクリックします。

      • (任意) Enable Policy:このオプションを選択すると、選択したバケットに新しくアップロードされたファイルが自動的に定期検出されます。このポリシーは即時有効になります。ポリシー設定で検出範囲を変更できます。

説明

Security Center の購入ページからサービスを有効化することもできます。詳細については、「Security Center の購入」をご参照ください。

通知の設定 (オプション)

Security Center は、DingTalk チャットボット通知を提供し、不正なファイルのアラート情報を DingTalk グループに自動的にプッシュすることで、検出されたリスクに迅速に対応できます。

  1. セキュリティセンターコンソール - システム設定 - 通知設定にアクセスします。ページの左上隅で、保護対象のアセットが配置されているリージョンとしてChinese Mainland または Outside Chinese Mainland を選択します。

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

検出の実行

  • コンソール操作: 検出対象のファイルが Alibaba Cloud OSS のバケットに保存されている場合は、Security Center コンソールからバッチスキャンまたは定期スキャンを直接実行できます。

  • SDK 統合: 悪意のあるファイルの検出 SDK をビジネスコードに統合し、サーバーファイル、または URL 経由で OSS ファイルをスキャンします。

コンソール操作

  • 手動検出:既存のファイルに対する 1 回限りのスキャンで、フルスキャンと増分スキャンの両方をサポートします。

  • 自動検出:ポリシーに基づいて、新しくアップロードされたファイルを継続的にスキャンします。

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

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

    セキュリティセンターコンソール - リスク管理 - 悪意のあるファイルの検出にアクセスします。ページの左上隅で、保護対象のアセットが配置されているリージョンとして、Chinese Mainland または Outside Chinese Mainland を選択します。そして、OSS ファイルの検出 タブを開きます。

  2. 検出タスクの開始

    重要

    バケットが一覧に表示されない場合は、バケットの同期 をクリックして、最新のバケット一覧を更新します。

    • フルスキャン:

      • 説明:1 つまたは複数のバケット内のすべてのファイルを検出します。

      • 手順:

        • 単一のバケットの場合は、操作する 列の 検出 をクリックします。

        • 複数のバケットの場合、バケットを選択してリストの下にある [一括検出] をクリックします。

    • 増分スキャン:

      • 説明:スキャン済みで、かつ前回のスキャン以降にファイルが更新されたバケットを対象に、前回のタスク以降に追加または変更されたファイルのみを検出します。

      • 手順:対象バケットの [操作] 列で、[増分スキャン] をクリックします。

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

    ダイアログボックスで、次のパラメータを設定します。

    1. [ファイル検出タイプ]: スキャンする拡張子を選択します。デフォルトでは、すべての種類のファイルが検出されます。

    2. Decompression LevelExtraction Limit:圧縮パッケージをスキャンするには、解凍レベル (最大 5 階層) と圧縮パッケージあたりのファイル数 (最大 1,000) を設定します。デフォルトでは、解凍は無効になっています。

    3. [File Decryption Type]:OSS ファイルがサーバーサイド暗号化 (SSE-OSS または SSE-KMS) を使用している場合、セキュリティセンターがファイルを復号および検出できるように、対応する復号方法を選択します。

    4. [スキャンパス]:

      • [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]:

      説明

      増分リアルタイム検出は、中国本土リージョンでのみサポートされています。中国本土以外のリージョンでは、この機能はサポートされていません。

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

      • [無効]:設定された検出サイクル (例:毎日または 3 日ごと) とファイルチェック時間ウィンドウ (例:02:00~04:00) に基づいて新しいファイルをスキャンします。

    • [バケットの有効化]:このポリシーに適用するバケットを 1 つ以上選択します。バケットが別のポリシーで既に使用されている場合、重複して選択することはできません。

      説明

      ポリシーが有効になった後、新たに追加されたバケット内のファイルは自動的に検出されません。検出が必要な場合は、手動でポリシーを編集して [対象バケット] リストに追加してください。

    • [検出サイクル]: 検出タスクの実行サイクルを選択します。

    • [ファイル検出時間]:検出タスクの実行時間を選択します。間隔は 1 時間未満に設定できません。

      説明

      検出タスクが設定された時間ウィンドウを超えて実行される場合、自動的に一時停止し、次の検出サイクルで再開されます。

    • その他のパラメータ (解凍、復号化、スキャンパスなど) については、「手動検出」をご参照ください。

SDK 統合

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

AccessKey の作成

アカウントのセキュリティを確保するため、Alibaba Cloud アカウントの AccessKey を使用しないでください。API アクセス専用の RAM ユーザーを作成し、必要最小限の権限を付与することを推奨します。詳細については、「RAM ユーザーの作成」および「AccessKey の作成」をご参照ください。

新規アカウント

  1. Alibaba Cloud アカウントまたは RAM 管理者としてRAM コンソールにログインします。ユーザー ページで、Create User をクリックします。

  2. 次の項目を設定します:

    • [ユーザーアカウント情報]:ログイン名、タグ、およびその他の情報を入力します。

    • [Direct Access]: [永続的な AccessKey を使用してアクセス] を選択します。

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

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

既存の RAM アカウント

  1. Alibaba Cloud アカウントまたは RAM 管理者として RAM コンソールにログインし、対象ユーザーの詳細ページに移動します。

  2. Logon-free Configuration タブの AccessKey Pair セクションで、[AccessKey の作成] をクリックします。

  3. ビジネスニーズに基づいてユースケースを選択し、[AccessKey を作成する必要があることを確認します] を選択してから、[続行] をクリックします。

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

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

権限ポリシーの設定

  1. 「ユーザー」ページで、目的の RAM ユーザーを見つけ、操作する 列の 操作する をクリックします。

  2. [ポリシー] セクションで、AliyunYundunSASFullAccess を選択してから、[権限付与の確認] をクリックします。

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

環境変数の設定

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

Linux/macOS

# yourAccessKeyID と yourAccessKeySecret を実際の値に置き換えてください。
export ALIBABA_CLOUD_ACCESS_KEY_ID=yourAccessKeyID
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=yourAccessKeySecret
重要

export で設定した環境変数は、現在のセッションでのみ有効です。セッション間で永続化するには、export コマンドをシェルの起動ファイル (例: ~/.bashrc または ~/.zshrc) に追加してください。

Windows

GUI を使用する

  • 手順

    Windows 10 で GUI を使用して環境変数を構成する場合は、次の手順を実行します。

    Windows デスクトップで、[PC] を右クリックし、[プロパティ] を選択します。表示されたページで、[システムの詳細設定] をクリックします。[システムのプロパティ] ダイアログボックスの [詳細設定] タブで、[環境変数] をクリックします。[環境変数] ダイアログボックスの [ユーザー環境変数] または [システム環境変数] セクションで、[新規] をクリックします。次に、次の表に示す変数を構成します。

    変数

    AccessKey ID

    • 変数名: ALIBABA_CLOUD_ACCESS_KEY_ID

    • 変数の値: LTAI****************

    AccessKey シークレット

    • 変数名: 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 XXXXXXX /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', 'XXXXXXX', [System.EnvironmentVariableTarget]::User)

すべてのユーザーの環境変数を構成します。次のコマンドは、管理者として実行する必要があります。

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

現在のセッションに一時的な環境変数を設定します。

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

PowerShell で、Get-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_IDGet-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_SECRET コマンドを実行します。構成が成功すると、正しい AccessKey が返されます。

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

お使いの開発言語に基づいて、適切なインストール方法を選択してください。現在、Java と Python の統合にのみ対応しています。

Java

  • 前提条件:JDK 1.8 以降。

  • Java SDK リポジトリにアクセスして最新リリースをダウンロードし、ダウンロードした SDK ファイルをプロジェクトの依存関係として追加してください。

Python

  • 前提条件:Python 3.6 以降。

  • オンラインインストール:

    pip install -U alibabacloud_filedetect
    
  • オフラインインストール:Python SDK リポジトリから最新リリースをダウンロードし、お使いの環境にアップロードして解凍し、以下を実行してください:

    # ディレクトリ名はバージョンによって異なります (例: alibabacloud_filedetect-1.0.0)。
    cd alibabacloud_filedetect-x.x.x/
    python setup.py install
    

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

環境を設定した後、以下の Python および Java のコード例を参照してください。SDK は、同期ファイル検出、非同期ファイル検出、同期 URL 検出、非同期 URL 検出の 4 つの検出モードをサポートしています。すべての例では、認証に ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数を使用します。

重要

実行する前に、サンプルコード内の path、url、md5 のプレースホルダーを実際の値に置き換えてください。

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 ファイルまたはディレクトリのパス。ディレクトリの場合は、その内容が再帰的にトラバースされます。
	 * @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 ファイルまたはディレクトリのパス。ディレクトリの場合は、その内容が再帰的にトラバースされます。
	 * @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: ファイルまたはディレクトリのパス。ディレクトリの場合は、その内容が再帰的にトラバースされます。
    """
    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: ファイルまたはディレクトリのパス。ディレクトリの場合は、その内容が再帰的にトラバースされます。
    """
    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()

        # 環境変数から AccessKey ID と AccessKey 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 = "a767f*************6e21d000000" # スキャン対象ファイルの MD5 ハッシュ。
            # 同期スキャン。非同期スキャンを実行するには、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:検出結果の解析

各検出では DetectResult オブジェクトが返されます。次のフィールドを使用して結果を解釈します。

結果フィールド

フィールド

説明

md5

文字列

ファイルの MD5 ハッシュ。

time

long

検出時間 (ミリ秒)。

error_code

ERR_CODE

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

error_string

文字列

エラーの詳細。

result

RESULT (enum)

RES_WHITE:安全、RES_BLACK:不審または悪意のある、RES_PENDING:検出中。

score

int

0~100 のリスクスコア。スコアが高いほどリスクが高くなります。

virus_type

文字列

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

ext_info

文字列

検出コンテキストの詳細を含む JSON 形式の拡張情報。

compresslist

List

圧縮パッケージ内の各ファイルの検出結果 (展開が有効な場合)。

スコアの解釈

スコア

リスクレベル

推奨アクション

0-60

安全

対応は不要です。

61-70

低リスク

手動レビューを推奨します。

71-80

中 (不審)

ファイルを隔離するか削除します。

81-100

高 (悪意のある)

直ちに隔離するか削除します。

説明

RES_BLACK としてマークされたファイルは、マルチエンジン検出システムによって不審または悪意のあるとしてフラグが立てられます。検出結果の virus_type および score フィールドを確認し、適切なアクションを判断してください。検出結果の処理の詳細については、「Handle detection results」をご参照ください。

エラーコード

エラーコード

説明

原因

推奨アクション

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 フォーマットを修正してください。

検出結果の表示と対応

  1. 結果の表示

    • [リスクファイルの概要]:すべての検出方法 (OSS 検出および SDK/API 呼び出し) で検出されたリスクファイル を一元的に表示します。ここでは、リスクレベル、脅威タグ、その他の属性で検索およびフィルタリングできます。圧縮パッケージ の場合、ファイル名の横にある展開アイコンをクリックすると、パッケージ 内のリスクファイル のリストを表示できます。

    • [OSS ファイルの検出]:バケットディメンション 別にリスク統計 を表示します。統計には、各バケットのリスクファイル 数や検出の進捗状況などが含まれます。[操作] 列 の [詳細] をクリックすると、関連する悪意のあるファイル のリストを表示できます。

  2. 結果の配信

    セキュリティセンターで ログ分析 または ログ管理 を有効にすると、悪意のあるファイル検出ログは、詳細なクエリおよびトレース分析のために、専用の Logstore に自動的に保存されます。 詳細については、「悪意のあるファイル検出ログ」および「ログ管理」をご参照ください。

  3. 結果の対応

    検出結果 には、[ホワイトリスト登録][無視][アクセス拒否] などの操作 を実行できます。詳細については、「検出結果の対応」および「リスクファイルの対応」をご参照ください。

制限事項

  • アカウントごとの課金方法:一度に 1 つ。課金方法を切り替えても、既存のスキャン結果やポリシーの定期実行に影響はありません。

  • ファイルサイズ制限:

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

    • 単一ファイルのサイズ:SDK によるオフラインファイルの検出 - 最大 100 MB。コンソールによる OSS ファイルの検出 - 最大 1 GB。

    • ファイルがサイズ制限を超えた場合、または解凍されたファイルが数量またはサイズの制限を超えた場合、それらのファイルはスキャンされません。スキャンされなかったファイルは課金されません。

  • 圧縮ファイルのスキャン深度:最大 5 階層、1,000 ファイル、合計 1 GB。

  • 環境制限:金融クラウドおよび政府クラウド環境ではサポートされていません。

  • QPS: Trial version は 10 リクエスト/秒、Paid version は 20 リクエスト/秒です。

    説明

    スキャン速度は、ネットワーク状態、サーバーパフォーマンス、クラウド製品の仕様によって異なります。SDK は、内部の非同期キューを使用してピーク負荷を処理し、並行処理を向上させます。内部キューが満杯の場合、新しいリクエストの処理は空きができるまで一時停止します。

トラブルシューティング

このセクションでは、コンソールを使用して不正なファイルの検出を実行する際に発生する可能性のある一般的な問題とその解決方法について説明します。

バケットリストが空、または対象バケットが見つからない

  • 原因:バケットのリージョンが、不正なファイルの検出でサポートされているリージョンではありません。

    解決策:バケットのリージョンが範囲セクションにリストされているかどうかを確認してください。サポートされていない場合は、サポートされているリージョンのバケットにファイルをコピーしてください。

  • 原因:バケットリストがまだ同期されていません。

    解決策: OSS ファイルの検出タブで、バケットの同期をクリックして最新のバケットリストを同期します。

権限不足または承認の失敗

  • 原因:Security Center のサービスリンクロールが作成されていないか、権限ポリシーが不完全です。

    解決策:Alibaba Cloud アカウントに RAM 管理権限があることを確認してください。不正なファイルの検出を初めて有効化すると、システムは自動的にサービスリンクロール AliyunServiceRoleForSasFileDetect を作成します。手動で作成するには、RAM ユーザーの作成 をご参照ください。

検出タスクを開始できない、またはクォータ不足

  • 原因:サブスクリプションリソースパッケージの有効期限が切れているか、従量課金アカウントの残高が不足しています。

    解決策:Security Center の [概要] ページに移動して、利用可能な検出クォータを確認してください。クォータが不足している場合は、Security Center 購入ページ を参照して更新またはチャージしてください。

  • 原因:検出キューが満杯で、QPS 制限を超えています。

    解決策:試用版のデフォルト QPS は 10 リクエスト/秒、有料版は 20 リクエスト/秒です。同時リクエストの頻度を減らすか、後で再試行してください。

暗号化されたファイルを検出できない

  • 原因:OSS ファイルがサポートされていない暗号化方式を使用しているか、選択した復号方法が正しくありません。

    解決策: 悪意のあるファイルの検出は、OSS サーバーサイド暗号化 (SSE-KMS、SSE-OSS) のみをサポートします。 検出パラメーターで、ファイル暗号化方式に一致するFile Decryption Typeを選択します。 クライアントサイド暗号化またはサードパーティ暗号化で暗号化されたファイルはサポートされていません。

課金

課金は、合計ファイルサイズではなく、スキャンしたファイル数に基づきます。

  • 課金方法:無料トライアル、サブスクリプション (前払い) 、および従量課金 (後払い) に対応しています。

    • 無料トライアル:10,000 回のファイル検出。法人確認が完了したアカウントで利用可能です。各アカウントは 1 回のみ無料トライアルの対象となります。無料トライアルのクォータを使い切っていない場合、有料プランを有効化すると、残りの無料検出回数が繰り越され、先に消費されます。

    • サブスクリプション:月額 10,000 検出につき 1.5 米ドル。最小購入数:100,000 回の検出。プランは選択した有効期間にわたって有効です。有効期限が切れると、未使用のリソースは失効します。

    • 従量課金:

      • ファイル検出は、暦日ごとに1 検出につき 0.0002 米ドルで課金されます。

      • 従量課金を有効にすると、基本サービス料金として1 時間あたり 0.0072 米ドルも適用されます。

  • 圧縮ファイルの課金:圧縮パッケージのスキャンが有効な場合、パッケージ内の各ファイルが 1 回の検出としてカウントされます。1,000 ファイルを含む圧縮パッケージをスキャンすると、1,000 回の検出としてカウントされます。

  • 結果の処理:検出結果の処理 (許可リストへの追加、無視、アクセス拒否) は、追加料金なしでサービス料金に含まれます。

説明

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

サービスの解約

サブスクリプション

  1. Security Center コンソール - 概要にログインし、Subscription セクションで、[ダウングレード]設定の変更 > Downgradeをクリックします。

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

従量課金

よくある質問

課金とクォータ

  • 使用したファイルスキャンクォータは返金されますか?

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

  • OSS ファイルスキャン タブで「合計ファイル数」と「合計スキャンファイル数」が異なる数値を表示するのはなぜですか? 合計ファイル数は、各圧縮パッケージを 1 つのファイルとしてカウントします。合計スキャンファイル数は、展開されたパッケージ内の各ファイルを個別にカウントします。多数のファイルを含む圧縮パッケージをスキャンすると、合計スキャンファイル数は合計ファイル数よりもはるかに多くなります。課金は合計スキャンファイル数に基づいて行われます。

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

    サブスクリプションユーザーの場合、残りの検出数が不足すると、スキャン タスクが中断されます。次のいずれかを実行できます:

    • アップグレード: 追加の検出数を購入します。詳細については、「アップグレードとダウングレード」をご参照ください。

    • 検出戦略の変更: スキャン設定で圧縮パッケージの展開を無効にして、タスクあたりの消費量を削減してから、スキャンを再実行します。

権限管理

悪意のあるファイル SDK の残りのクォータと認可の詳細を確認するにはどうすればよいですか?

[個人 SDK 認可] パネルには、バージョン、有効化ステータス、認可制限、残りのクォータ、QPS 制限、有効期限が表示されます。

  1. セキュリティセンターコンソール - リスク管理 - 悪意のあるファイル検出にアクセスします。 ページの左上隅で、保護対象のアセットが配置されているリージョンとして Chinese Mainland または Outside Chinese Mainland を選択します。

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

付録

API リファレンス

プログラム統合には、次の API 操作を使用してください。詳細については、「Malicious File Detection SDK」および「Malicious File Detection OSS」をご参照ください。

サポートされるウイルスの種類

ウイルスの種類 (virus_type)

説明

バックドア

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

DDoS

DDoS トロイの木馬

ダウンローダー

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

Engtest

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

ハッキングツール

ハッキングツール

トロイの木馬

悪意のあるプログラム

マルベースウェア

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

マルスクリプト

悪意のあるスクリプト

マルウェア

悪意のあるプログラム

マイナー

マイニングプログラム

プロキシツール

プロキシツール

ランサムウェア

ランサムウェア

リスクウェア

リスクウェア

ルートキット

ルートキット

スティーラー

情報窃取ツール

スキャナー

スキャナー

不審

不審なプログラム

ウイルス

感染型ウイルス

Web シェル

Web シェルバックドア

ワーム

ワーム

アドウェア

アドウェア

パッチャー

クラッキングプログラム

ゲームツール

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