A detecção de arquivos maliciosos é um service de segurança de arquivos do Security Center. Esse recurso identifica ameaças como ransomware, programas de mineração e web shells que podem ser introduzidas em cenários de upload de arquivos, publicação de código e compartilhamento de dados, protegendo seus sistemas e informações contra riscos de segurança. Baseado em uma plataforma de detecção multimotor, o service analisa arquivos no Object Storage Service (OSS) e em servidores, oferecendo métodos como operações no console e integração via SDK. A detecção agêntica de arquivos maliciosos, ativada sob o modelo de pagamento conforme o uso, adiciona suporte a detecção por modelos de linguagem de IA, detecção de arquivos Skill e detecção de arquivos NAS. Este tópico ajuda usuários de diferentes funções a escolher rapidamente o método de detecção mais adequado para seus cenários de negócio.
Antes de começar
Ative o malicious file detection. As capacidades de detecção disponíveis variam conforme o método de faturamento escolhido na ativação do service.
Ao ativar a detecção de arquivos maliciosos no modelo de assinatura, você tem acesso a recursos básicos como detecção multimotor, análise de arquivos compactados e verificação de arquivos criptografados. A detecção por modelos de linguagem de IA, a detecção de arquivos Skill e a detecção de arquivos NAS não são suportadas.
Caso opte pela detecção agêntica de arquivos maliciosos no modelo de pagamento conforme o uso, além das funcionalidades padrão, você também poderá utilizar a detecção por modelos de linguagem de IA, a detecção de arquivos Skill e a detecção de arquivos NAS.
Escopo
-
Tipos de arquivo suportados
Detecção de arquivos compactados: Permite descompactar e verificar pacotes não criptografados. É possível configure o nível de descompactação e a quantidade máxima de arquivos. Essa configuração aplica-se apenas a arquivos do OSS.
Detecção de arquivos criptografados: Oferece descriptografia automática e verificação de dados protegidos com criptografia no lado do servidor do OSS (SSE-KMS, SSE-OSS). Aplica-se exclusivamente a arquivos do OSS.
Detecção de arquivos NAS (apenas pagamento conforme o uso): Analisa arquivos armazenados no Apsara File Storage NAS. Os tipos de sistema de arquivos, zonas e limites suportados dependem do que é exibido no console.
Detecção de arquivos Skill (apenas pagamento conforme o uso): Fornece capacidades especializadas para analisar arquivos Skill, abrangendo mais formatos e cenários de ataque.
-
Formatos de arquivo suportados: Diversos tipos são aceitos, incluindo pacotes compactados, scripts/web shells, imagens e executáveis/binários. Apenas os formatos mais comuns estão listados aqui. Para a lista completa, consulte o console.
Pacotes compactados:
.7z,.zip,.rar,.tar,.gz,.bz2,.xz,.lzma,.ar,.tar.gz, entre outros.Scripts/WebShell:
.php,.jsp,.jspx,.asp,.aspx,.sh,.py,.ps1,.pl,.bat,.html, entre outros.Documentos:
.doc,.pdf,.ppt,.xsl,.rtf,.hta,.chm,.docx, entre outros.Imagens:
.jpg,.jpeg,.png, entre outros.Executáveis e binários:
.apk,.exe,.dll,.ocx,.com,.so,.sys,.ko,.obj, entre outros.
Tipos de vírus suportados: Identifica backdoors de reverse shell, trojans DDoS, programas de mineração e outros arquivos virais. Para mais detalhes, consulte Supported virus types.
Restrições de classe de armazenamento: Apenas arquivos armazenados no OSS com classe de armazenamento Standard ou Infrequent Access podem ser analisados. A classe Archive não é suportada.
-
Regiões suportadas:
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)
Configure e execute tarefas de detecção
O Security Center oferece duas formas de execute tarefas de detecção: operações no console e integração via SDK.
Recurso | Operação no console | Integração via SDK |
Como usar | Faça login no console do Security Center e execute as operações por meio de uma interface gráfica. | Integre e invoque o SDK diretamente no seu código de aplicação. Há suporte para Java e Python. |
Arquivos suportados | Suporta arquivos do Object Storage Service (OSS) e do Apsara File Storage NAS. Abas distintas exibem as listas de recursos correspondentes, mas as operações permanecem as mesmas. Nota A detecção de arquivos NAS está disponível apenas no modelo de pagamento conforme o uso (detecção agêntica de arquivos maliciosos). |
|
Operações no console
Se os arquivos a serem analisados estiverem em buckets do Alibaba Cloud Object Storage Service (OSS) ou em sistemas de arquivos NAS, utilize o console do Security Center para verificá-los em lote ou periodicamente.
Detecção manual: Ideal para varreduras únicas de arquivos existentes. Suporta detecção completa e detecção incremental.
Detecção automática: Recomendada para varredura contínua e automatizada de novos arquivos.
Detecção manual (arquivos existentes)
-
Acesse a página de detecção de arquivos
Acesse o console do Security Center - Risk Governance - Malicious File Detection. No canto superior esquerdo da página, selecione a região dos seus ativos: Chinese Mainland ou Outside Chinese Mainland.
-
Inicie uma tarefa de detecção
OSS File Check
Clique em na aba OSS File Check.
Sincronize os arquivos (opcional): Caso o bucket não apareça na lista de OSS File Check, clique em Synchronize Buckets para atualizar a lista de buckets.
-
Crie uma tarefa de detecção:
-
Detecção completa:
Descrição: Analisa todos os arquivos em um ou mais buckets.
-
Entrada da operação:
Detecção individual: Na coluna Actions do bucket desejado, clique em Check.
Detecção em lote: Selecione vários buckets e clique em Batch Check abaixo da lista.
-
Detecção incremental
Descrição: Em buckets já verificados que receberam atualizações, analisa apenas os arquivos adicionados ou modificados desde a última tarefa.
Entrada da operação: Na coluna Actions do bucket alvo, clique em Incremental Check.
-
-
Configure os parâmetros de detecção: Na caixa de diálogo exibida, defina os seguintes parâmetros.
File Check Type: Escolha as extensões de arquivo a serem verificadas. Por padrão, todos os tipos são analisados.
Decompression Level e Max Files per Archive: Para verificar o conteúdo de pacotes compactados, defina o nível de descompactação (até 5 níveis) e a quantidade máxima de arquivos por pacote (até 1.000). A descompactação vem desativada por padrão.
File Decryption Type: Se os arquivos do OSS utilizarem criptografia no lado do servidor (SSE-OSS ou SSE-KMS), selecione o método de descriptografia correspondente para que o Security Center possa analisá-los.
Escopo de arquivos para detecção: Defina o intervalo de data e hora da análise. Somente arquivos dentro desse período serão verificados.
-
Scan Path:
Match by Prefix: Insira um prefixo de nome de arquivo para verificar arquivos específicos.
Configure for Entire Bucket: Verifica todos os arquivos presentes no bucket.
NAS File Detection (apenas pagamento conforme o uso)
Clique em na aba NAS File Detection.
Sincronize os arquivos (opcional): Se o sistema de arquivos não constar na lista de NAS File Detection, clique em Synchronize File System para obter a lista mais recente.
-
Crie uma tarefa de detecção:
-
Detecção completa:
Descrição: Verifica todos os arquivos em um ou mais sistemas de arquivos.
-
Entrada da operação:
Detecção individual: Na coluna Actions do sistema de arquivos desejado, clique em Check.
Detecção em lote: Selecione múltiplos sistemas de arquivos e clique em Batch Check abaixo da lista.
-
Detecção incremental
Descrição: Para sistemas de arquivos já verificados e com atualizações recentes, analisa somente os arquivos adicionados ou alterados desde a última execução.
Entrada da operação: Na coluna Actions do sistema de arquivos alvo, clique em Incremental Check.
-
-
Configure os parâmetros de detecção: Na caixa de diálogo aberta, ajuste os parâmetros abaixo.
File Check Type: Selecione as extensões de arquivo a serem escaneadas. O padrão inclui todos os tipos.
Detection File Scope: Defina o intervalo de data e hora para a análise. Apenas arquivos nesse período serão processados.
-
Aguarde a conclusão da tarefa de detecção: Acompanhe o File Check Status na lista de buckets ou sistemas de arquivos. Quando o status mudar de Not Checked para Checked, a detecção estará finalizada.
NotaApós o término da tarefa, estatísticas e sincronização de dados ocorrem em segundo plano. Os resultados geralmente apresentam um atraso de 1 a 2 horas. Aguarde esse período.
Detecção automática (arquivos incrementais)
-
Acesse a página de gerenciamento de políticas
Acesse o console do Security Center - Risk Governance - Malicious File Detection. No canto superior esquerdo, escolha a região dos seus ativos: Chinese Mainland ou Outside Chinese Mainland.
Clique em Policy Management no canto superior direito.
-
Crie ou modifique uma política de detecção
Criar nova política: No painel Policy Management, clique em Create Policy.
Modificar política existente: Na coluna Actions da política desejada, clique em Edit para adicionar o bucket ou sistema de arquivos ao escopo de atuação da política.
-
Configure as informações básicas: Na página Policy Configuration, preencha os dados fundamentais da política.
Effective Products: Selecione OSS.
Policy Name: Insira um nome para a política.
Policy Status: Ative ou desative a política.
Produto efetivo: Escolha OSS/NAS.
-
Configure os detalhes da política: Os itens de configuração variam conforme o product selecionado. Ajuste os parâmetros de acordo com sua escolha.
Política OSS
-
Increment Real-time Detection:
NotaA detecção incremental em tempo real pode ser configurada apenas nas regiões de Chinese Mainland. Não há suporte para regiões Outside Chinese Mainland.
Ativar: Ao fazer upload de um novo arquivo no bucket especificado, a detecção é acionada imediatamente.
Desativar: Verifica novos arquivos com base no ciclo de detecção configurado (como diariamente ou a cada 3 dias) e no horário de detecção (por exemplo, 02:00-04:00).
Scan Path: Escolha entre correspondência por prefixo ou aplicação em todo o bucket.
Escopo de arquivos para detecção: Defina o intervalo de data e hora da análise. Somente arquivos dentro desse período serão verificados.
File Check Type: Selecione as extensões a serem verificadas. Por padrão, todos os tipos são incluídos.
Decompression Level e Max Files per Archive: Para analisar o conteúdo de pacotes compactados, configure o nível de descompactação (até 5 níveis) e o limite de arquivos por pacote (até 1.000). A descompactação é desativada por padrão.
File Decryption Type: Caso os arquivos do OSS usem criptografia no lado do servidor (SSE-OSS ou SSE-KMS), selecione o método de descriptografia adequado para permitir a análise pelo Security Center.
-
Effective Bucket: Escolha um ou mais buckets aos quais esta política se aplica. Se o bucket já estiver vinculado a outra política, não será possível selecioná-lo novamente.
AvisoDepois que a política entrar em vigor, arquivos em buckets recém-adicionados não serão detectados automaticamente. Para incluí-los, edite manualmente a política e adicione-os à lista Effective Bucket.
Política NAS (apenas pagamento conforme o uso)
Detection Cycle: Defina o ciclo de execução da tarefa de detecção.
-
Check Time: Escolha o horário de execução da tarefa. O intervalo não pode ser inferior a 1 hora.
AvisoSe a tarefa ultrapassar o tempo de detecção configurado, ela será pausada automaticamente e retomada no próximo ciclo.
Detection File Scope: Selecione o intervalo de data e hora para a análise. Apenas arquivos nesse período serão escaneados.
File Check Type: Escolha as extensões de arquivo a serem verificadas. Todos os tipos são detectados por padrão.
Effective File System: Selecione um ou mais sistemas de arquivos NAS para aplicar esta política. Sistemas já vinculados a outras políticas não podem ser selecionados novamente.
-
Após concluir a configuração, clique em OK.
Integração via SDK
Integre o service de detecção de arquivos maliciosos ao seu código de aplicação para obter informações sobre ameaças nos resultados retornados e implementar a verificação de arquivos. A detecção agêntica de arquivos maliciosos, ativada sob pagamento conforme o uso, oferece adicionalmente detecção por modelos de linguagem de IA, detecção de arquivos Skill e outras capacidades.
Etapa 1: Preparar credenciais de acesso e permissões
-
Crie uma chave de acesso
Para garantir a segurança da conta, evite usar o AccessKey da sua conta Alibaba Cloud principal. Recomendamos crie um usuário RAM dedicado para acesso à API, concedendo apenas as permissões mínimas necessárias. Para mais informações, consulte Create a RAM user e Create an AccessKey.
Criar uma nova conta
Faça login no console RAM usando sua conta Alibaba Cloud ou uma conta de administrador RAM. Na página Users, clique em Create User.
-
Preencha a configuração conforme as informações abaixo:
User Account Information: Insira o nome de login, tags e demais dados.
Direct Access: Marque Use Permanent AccessKey to Access.
-
Conclua a verificação de segurança. O sistema gera automaticamente um AccessKey ID e um AccessKey Secret para o usuário RAM. Mantenha essas informações em local seguro.
NotaBaixe o arquivo CSV da chave ou copie o conteúdo e salve-o localmente. Para mais detalhes, consulte Create an AccessKey pair.
Conta RAM existente
Faça login no console RAM com sua conta Alibaba Cloud ou administrador RAM e acesse a página de detalhes do usuário alvo.
Na aba Logon-free Configuration, dentro da seção AccessKey Pair, clique em Create AccessKey.
Escolha um cenário de uso conforme sua necessidade, marque I confirm that I must create an AccessKey pair e clique em Continue to Create.
-
Complete a verificação de segurança. O sistema gerará automaticamente um AccessKey ID e um AccessKey Secret para o usuário RAM. Guarde essas informações com segurança.
NotaÉ possível baixe o arquivo CSV da chave ou copiar o conteúdo para salvá-lo localmente. Consulte Create an AccessKey para mais informações.
-
Configure políticas de permissão
Na página Users, clique em no usuário RAM desejado. Na coluna Actions, clique em Grant permissions to the user..
-
Na seção Policy, selecione AliyunYundunSASFullAccess e clique em Confirm Authorization.
NotaPara mais detalhes, consulte Grant permissions to a RAM user.
-
Configure variáveis de ambiente
Os SDKs da Alibaba Cloud permitem crie credenciais de acesso padrão definindo as variáveis de ambiente
ALIBABA_CLOUD_ACCESS_KEY_IDeALIBABA_CLOUD_ACCESS_KEY_SECRET. Ao invocar uma API, o programa acessa diretamente essas credenciais, lê a chave de acesso (AccessKey) e conclui a autenticação automaticamente. Para mais informações, consulte Configure environment variables.Linux/macOS
-
Configure o AccessKey ID e pressione Enter.
# Replace yourAccessKeyID with your AccessKey ID. export ALIBABA_CLOUD_ACCESS_KEY_ID=yourAccessKeyID -
Configure o AccessKey secret e pressione Enter.
# Replace yourAccessKeySecret with your AccessKey secret. export ALIBABA_CLOUD_ACCESS_KEY_SECRET=yourAccessKeySecret -
Verifique a configuração.
Execute o comando
echo $ALIBABA_CLOUD_ACCESS_KEY_ID. Se o retorno for o AccessKey ID correto, a configuração foi bem-sucedida.
Windows
Usar a interface gráfica do usuário (GUI)
-
Procedimento
Os passos a seguir descrevem como defina variáveis de ambiente via GUI no Windows 10.
Na área de trabalho, clique em com o botão direito em This PC e escolha Properties > Advanced system settings > Environment Variables > New em System variables ou User variables. Em seguida, preencha a configuração.
Variável
Valor de exemplo
AccessKey ID
Nome da variável: ALIBABA_CLOUD_ACCESS_KEY_ID
Valor da variável: yourAccessKeyID
AccessKey secret
Nome da variável: ALIBABA_CLOUD_ACCESS_KEY_SECRET
Valor da variável: yourAccessKeySecret
-
Teste a configuração
Clique em Start (ou use o atalho Win+R), clique em Run, digite
cmde clique em OK (ou pressione Enter) para abrir o prompt de comando. Execute os comandosecho %ALIBABA_CLOUD_ACCESS_KEY_ID%eecho %ALIBABA_CLOUD_ACCESS_KEY_SECRET%. Se os comandos retornarem o AccessKey correto, a configuração foi bem-sucedida.
Usar o prompt de comando (CMD)
-
Procedimento
Abra o prompt de comando como administrador e execute os comandos abaixo para adicionar novas variáveis de ambiente ao sistema.
setx ALIBABA_CLOUD_ACCESS_KEY_ID yourAccessKeyID /M setx ALIBABA_CLOUD_ACCESS_KEY_SECRET yourAccessKeySecret /MO parâmetro
/Mindica uma variável de ambiente do sistema. Você pode omitir esse parâmetro ao defina uma variável de ambiente de usuário. -
Teste a configuração
Clique em Start (ou use o atalho Win+R), clique em Run, digite
cmde clique em OK (ou pressione Enter) para abrir o prompt de comando. Execute os comandosecho %ALIBABA_CLOUD_ACCESS_KEY_ID%eecho %ALIBABA_CLOUD_ACCESS_KEY_SECRET%. Se o retorno for o AccessKey correto, a configuração está correta.
Usar o Windows PowerShell
No PowerShell, defina novas variáveis de ambiente válidas para todas as novas sessões:
[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_ID', 'yourAccessKeyID', [System.EnvironmentVariableTarget]::User) [System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_SECRET', 'yourAccessKeySecret', [System.EnvironmentVariableTarget]::User)Para defina variáveis de ambiente para todos os usuários, são necessárias permissões administrativas:
[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_ID', 'yourAccessKeyID', [System.EnvironmentVariableTarget]::Machine) [System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_SECRET', 'yourAccessKeySecret', [System.EnvironmentVariableTarget]::Machine)Defina variáveis de ambiente temporárias, válidas apenas para a sessão atual:
$env:ALIBABA_CLOUD_ACCESS_KEY_ID = "yourAccessKeyID" $env:ALIBABA_CLOUD_ACCESS_KEY_SECRET = "yourAccessKeySecret"No PowerShell, execute os comandos
Get-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_IDeGet-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_SECRET. Se o retorno for o AccessKey correto, a configuração foi bem-sucedida. -
Etapa 2: Instale o SDK
Escolha o método de instalação conforme sua linguagem de desenvolvimento. Atualmente, apenas Java e Python são suportados.
Java
Pré-requisito: JDK 1.8 ou superior.
-
Instalação:
Acesse o repositório do SDK Java para baixe a versão mais recente do arquivo do SDK Java.
Adicione o arquivo do SDK baixado ao seu projeto.
Python
Pré-requisito: Python 3.6 ou superior.
-
Instalação:
-
Instalação online: Instale rapidamente usando pip.
<BASH> pip install -U alibabacloud_filedetect -
Instalação offline:
Em um ambiente com rede, acesse o repositório do SDK Python para baixe a versão mais recente do SDK Python.
Faça upload do pacote de código-fonte baixado para o ambiente do seu projeto e descompacte-o.
-
Navegue até o diretório raiz do SDK descompactado e execute o comando de instalação:
<BASH> # Change to the Python SDK root directory # The directory name may vary by version, e.g., alibabacloud_filedetect-1.0.0 cd alibabacloud_filedetect-x.x.x/ # Install using your Python version python setup.py install
-
Etapa 3: Escrever o código e execute a detecção
Com o ambiente configurado, utilize os exemplos de código Python e Java abaixo como referência para escrever seu próprio código.
Substitua os parâmetros path, URL e MD5 nos códigos de exemplo pelos seus valores reais.
package com.aliyun.filedetect.sample;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import com.aliyun.filedetect.*;
public class Sample {
/**
* Synchronous file detection interface
* @param detector Detector object
* @param path Path of the file to be detected
* @param timeout_ms Set the timeout period in milliseconds
* @param wait_if_queuefull If the detection queue is full, false indicates returning an error immediately without waiting, while true indicates waiting until the queue has space.
* @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;
}
/**
* Asynchronous file detection interface
* @param detector Detector object
* @param path Path of the file to be detected
* @param timeout_ms Set the timeout period in milliseconds
* @param wait_if_queuefull If the detection queue is full, false indicates returning an error immediately without waiting, while true indicates waiting until the queue has space.
* @param callback Callback function for the result
* @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;
}
/**
* Synchronous URL file detection interface
* @param detector Detector object
* @param url URL of the file to be detected
* @param md5 MD5 hash of the file to be detected
* @param timeout_ms Set the timeout period in milliseconds
* @param wait_if_queuefull If the detection queue is full, false indicates returning an error immediately without waiting, while true indicates waiting until the queue has space.
* @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;
}
/**
* Asynchronous URL file detection interface
* @param detector Detector object
* @param url URL of the file to be detected
* @param md5 MD5 hash of the file to be detected
* @param timeout_ms Set the timeout period in milliseconds
* @param wait_if_queuefull If the detection queue is full, false indicates returning an error immediately without waiting, while true indicates waiting until the queue has space.
* @param callback Callback function for the result
* @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;
}
/**
* Format the detection result
* @param result Detection result object
* @return Formatted string
*/
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;
}
/**
* Synchronously detect a directory or file
* @param path The specified path can be a file or a directory. If it is a directory, its content is recursively traversed.
* @param is_sync Specifies whether to use the synchronous interface. We recommend using the asynchronous interface. true: synchronous, false: asynchronous
* @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);
}
/**
* Asynchronously detect a directory or file
* @param path The specified path can be a file or a directory. If it is a directory, its content is recursively traversed.
* @param is_sync Specifies whether to use the synchronous interface. We recommend using the asynchronous interface. true: synchronous, false: asynchronous
* @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));
}
/**
* Start detecting a file or directory
* @param path The specified path can be a file or a directory. If it is a directory, its content is recursively traversed.
* @param is_sync Specifies whether to use the synchronous interface. We recommend using the asynchronous interface. true: synchronous, false: asynchronous
* @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);
}
});
// Wait for the task to complete.
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 {
// Get the detector instance.
OpenAPIDetector detector = OpenAPIDetector.getInstance();
// Initialize.
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());
// Set decompression parameters (optional, compressed packages are not decompressed by default).
boolean decompress = true; // Specifies whether to identify and decompress compressed files. Default is false.
int decompressMaxLayer = 5; // Maximum decompression level. Effective when decompress is true.
int decompressMaxFileCount = 1000; // Maximum number of decompressed files. Effective when decompress is true.
ERR_CODE initdec_ret = detector.initDecompress(decompress, decompressMaxLayer, decompressMaxFileCount);
System.out.println("INIT_DECOMPRESS RET: " + initdec_ret.name());
if (true) {
// Example 1: Scan a local directory or file.
boolean is_sync_scan = false; // Specifies whether to use asynchronous or synchronous detection. Asynchronous detection offers better performance. false indicates asynchronous detection.
int timeout_ms = 500000; // Detection time for a single sample, in milliseconds.
String path = "test2.php"; // The file or directory to be scanned.
// Start the scan and wait for it to finish.
scan(detector, path, timeout_ms, is_sync_scan);
}
if (true) {
// Example 2: Scan a URL file.
int timeout_ms = 500000; // Detection time for a single sample, in milliseconds.
String url = "https://xxxxxxxx.oss-cn-hangzhou-1.aliyuncs.com/xxxxx/xxxxxxxxxxxxxx?Expires=1*****25&OSSAccessKeyId=xxx"; // The URL file to be scanned.
String md5 = "a767f*************6e21d000000"; // The MD5 hash of the file to be scanned.
// Synchronous scan. To perform an asynchronous scan, call the detectUrl interface.
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)));
}
// Deinitialize.
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
"""
Synchronous file detection interface
@param detector: Detector object
@param path: Path of the file to be detected
@param timeout_ms: Set the timeout period in milliseconds
@param wait_if_queuefull: If the detection queue is full, False indicates returning an error immediately without waiting, while True indicates waiting until the queue has space.
"""
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
"""
Asynchronous file detection interface
@param detector: Detector object
@param path: Path of the file to be detected
@param timeout_ms: Set the timeout period in milliseconds
@param wait_if_queuefull: If the detection queue is full, False indicates returning an error immediately without waiting, while True indicates waiting until the queue has space.
@param callback: Callback function for the result
"""
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
"""
Synchronous URL file detection interface
@param detector: Detector object
@param url: URL of the file to be detected
@param md5: MD5 hash of the file to be detected
@param timeout_ms: Set the timeout period in milliseconds
@param wait_if_queuefull: If the detection queue is full, False indicates returning an error immediately without waiting, while True indicates waiting until the queue has space.
"""
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
"""
Asynchronous URL file detection interface
@param detector: Detector object
@param url: URL of the file to be detected
@param md5: MD5 hash of the file to be detected
@param timeout_ms: Set the timeout period in milliseconds
@param wait_if_queuefull: If the detection queue is full, False indicates returning an error immediately without waiting, while True indicates waiting until the queue has space.
@param callback: Callback function for the result
"""
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
"""
Format the detection result
@param result: Detection result object
@return: Formatted string
"""
@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
"""
Synchronously detect a directory or file
@param path: The specified path can be a file or a directory. If it is a directory, its content is recursively traversed.
@param is_sync: Specifies whether to use the synchronous interface. We recommend using the asynchronous interface. True: synchronous, False: asynchronous
"""
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
"""
Asynchronously detect a directory or file
@param path: The specified path can be a file or a directory. If it is a directory, its content is recursively traversed.
@param is_sync: Specifies whether to use the synchronous interface. We recommend using the asynchronous interface. True: synchronous, False: asynchronous
"""
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
"""
Start detecting a file or directory
@param path: The specified path can be a file or a directory. If it is a directory, its content is recursively traversed.
@param is_sync: Specifies whether to use the synchronous interface. We recommend using the asynchronous interface. True: synchronous, False: asynchronous
"""
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())
# Wait for the task to complete.
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):
# Get the detector instance.
detector = OpenAPIDetector.get_instance()
# Read the AccessKey ID and AccessKey Secret from environment variables.
access_key_id = os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID')
access_key_secret = os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
# Initialize.
init_ret = detector.init(access_key_id, access_key_secret)
print("INIT RET: {}".format(init_ret.name))
# Set decompression parameters (optional, compressed packages are not decompressed by default).
decompress = True # Specifies whether to identify and decompress compressed files. Default is false.
decompressMaxLayer = 5 # Maximum decompression level. Effective when decompress is true.
decompressMaxFileCount = 1000 # Maximum number of decompressed files. Effective when decompress is true.
initdec_ret = detector.initDecompress(decompress, decompressMaxLayer, decompressMaxFileCount)
print("INIT_DECOMPRESS RET: {}".format(initdec_ret.name))
if True:
# Example 1: Scan a local directory or file.
is_sync_scan = False # Specifies whether to use asynchronous or synchronous detection. Asynchronous detection offers better performance. False indicates asynchronous detection.
timeout_ms = 500000 # Detection time for a single sample, in milliseconds.
path = "test.bin" # The file or directory to be scanned.
# Start the scan and wait for it to finish.
self.scan(detector, path, timeout_ms, is_sync_scan)
if True:
# Example 2: Scan a URL file.
timeout_ms = 500000
url = "https://xxxxxxxx.oss-cn-hangzhou-1.aliyuncs.com/xxxxx/xxxxxxxxxxxxxx?Expires=1671448125&OSSAccessKeyId=xxx" # The URL file to be scanned.
md5 = "a767ffc59d93125c7505b6e21d000000"
# Synchronous scan. To perform an asynchronous scan, call the detectUrl interface.
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)))
# Deinitialize.
print("Over.")
detector.uninit()
if __name__ == "__main__":
sample = Sample()
sample.main()
Etapa 4: Interpretar os resultados retornados
Após invocar o SDK para detectar arquivos maliciosos, visualize os resultados na saída do programa. Essas informações também são sincronizadas com o console do Security Center.
-
Estrutura de dados do resultado: Cada detecção retorna um objeto
DetectResult. Os campos principais são:Campo
Tipo
Descrição
md5String
O valor de hash MD5 do arquivo.
timelong
Tempo gasto nesta detecção (em milissegundos).
error_codeERR_CODE
Código de erro.
ERR_SUCCindica sucesso.error_stringString
Informações detalhadas sobre o erro.
resultRESULT (enum)
Enumeração do resultado da detecção:
RES_WHITE: SeguroRES_BLACK: Suspeito/MaliciosoRES_PENDING: Pendente.
scoreint
Pontuação da detecção. Faixa: 0-100. Quanto maior a pontuação, maior o risco.
0 ~ 60: Seguro. O arquivo é confiável e geralmente não requer ação.
61 ~ 70: Risco (Baixo). O arquivo apresenta risco leve. Recomenda-se revisão manual.
71 ~ 80: Suspeito (Médio). Provavelmente malicioso. Recomenda-se isolamento ou exclusão.
81 ~ 100: Malicioso (Alto). Quase certamente malicioso. Isole ou exclua imediatamente.
virus_typeString
Tipo de vírus, como WebShell, MalScript, Hacktool, entre outros.
ext_infoString
Informações estendidas, geralmente uma string JSON contendo contexto mais detalhado da detecção.
compresslistList
Se o arquivo analisado for compactado e a descompactação estiver ativada, esta lista contém os resultados de detecção de cada arquivo dentro do pacote.
-
Códigos de erro e solução de problemas
Código de erro
Descrição
Causa
Solução sugerida
ERR_SUCCSucesso
Detecção concluída com êxito.
Nenhuma
ERR_INITErro de inicialização
O SDK precisa ser inicializado ou foi inicializado repetidamente.
Certifique-se de que
init()foi chamado com sucesso antes de invocar a interface de detecção.ERR_FILE_NOT_FOUNDArquivo não encontrado
O caminho do arquivo local especificado não existe.
Verifique se o caminho do arquivo está correto e se o programa possui permissões de leitura.
ERR_CALL_APIErro na chamada da API
Ocorreu um erro desconhecido ao chamar a API cloud.
Revise o código e os valores dos parâmetros.
ERR_TIMEOUTTimeout
O tempo de detecção excedeu o
timeout_msconfigurado.Aumente o valor do parâmetro
timeout_msou verifique a conexão de rede.ERR_UPLOADFalha no upload
Não foi possível fazer upload do arquivo para análise na nuvem. Tente novamente.
Geralmente é um problema de rede. Recomendamos adicionar lógica de nova tentativa.
ERR_ABORTTarefa abortada
O programa encerrou antes da conclusão da detecção. A cota pré-paga de detecções pode ter sido excedida ou o saldo da conta é insuficiente para pagamento conforme o uso.
Adquira mais detecções ou recarregue sua conta.
ERR_DETECT_QUEUE_FULLFila de detecção cheia
Tarefas de detecção foram enviadas com muita frequência e a fila no servidor está cheia.
Isso pode ocorrer em horários de pico. Invoque
waitQueueAvailable()para aguardar a liberação da fila ou tente novamente mais tarde.ERR_TIMEOUT_QUEUETimeout na fila
O tempo de espera na fila foi excessivo.
ERR_MD5Erro de formato MD5
O formato da string MD5 fornecida está incorreto.
Corrija o formato do MD5.
ERR_URLErro de formato URL
O formato da string URL fornecida está incorreto.
Corrija o formato da URL.
Visualize e tratar resultados de detecção
-
Visualize os resultados
-
Aba At-risk File Overview:
Exibe centralmente todos os arquivos de risco detectados por todos os métodos (detecção OSS e chamadas de API). Pesquise, filtre arquivos de risco e visualize seus níveis de risco, tags de ameaça e outras informações.
Para arquivos compactados, clique em no ícone de expansão
antes do nome do arquivo para ver a lista de arquivos de risco dentro do pacote.
-
Aba OSS File Check/NAS File Detection:
Mostra estatísticas de risco por bucket ou sistema de arquivos, incluindo quantidade de arquivos de risco e progresso da detecção para cada item.
Na coluna Actions, clique em Details para visualize a lista associada de arquivos maliciosos.
-
Entrega de resultados: Se você ativou os recursos de Log Analysis ou Log Management do Security Center, os logs de detecção de arquivos maliciosos são armazenados automaticamente em um Logstore dedicado para consultas avançadas e análise de rastreamento. Para mais informações, consulte SAS log delivery e SIEM logs.
Trate os resultados: Execute operações nos resultados da detecção, incluindo Add to Whitelist, Ignore, Denied Access, entre outras. Para detalhes sobre as operações, consulte Handle malicious file detection results.
Acesse o console do Security Center - System Settings - Notifications. No canto superior esquerdo da página, selecione a região dos seus ativos: Chinese Mainland ou Outside Chinese Mainland.
-
Na aba DingTalk Chatbot, clique em Add Chatbot.
Notify On: Recomendamos selecione todos os níveis de severidade para detecção de arquivos maliciosos.
Outras informações: Consulte Configure DingTalk chatbot notifications.
-
Limites de tamanho de arquivo:
Tamanho total por tarefa: Sem limite.
-
Limite de tamanho por arquivo individual:
Detecção offline via SDK: arquivo único não pode exceder 100 MB.
Detecção de arquivos OSS via console: arquivo único não pode exceder 1 GB.
-
Descrição de excesso de limite:
Quando o tamanho do arquivo ultrapassa o limite ou os arquivos descompactados excedem a quantidade ou tamanho máximo, esses arquivos não serão analisados. Arquivos não detectados não contam para fins de faturamento.
Se as solicitações de detecção excederem a capacidade da fila, será necessário aguardar ou otimizar a capacidade de processamento simultâneo.
Limites para detecção de arquivos compactados: Até 5 níveis de descompactação, 1.000 arquivos e 1 GB de tamanho total.
Restrições de ambiente: Ambientes Financial Cloud e Government Cloud não são suportados.
-
Taxa padrão de requisições API (QPS): Versão de teste: 10 requisições/segundo. Versão paga: 20 requisições/segundo.
NotaA velocidade de detecção varia conforme condições de rede, desempenho do servidor, especificações de products cloud e outros fatores.
O SDK utiliza um mecanismo de fila assíncrona para lidar com picos de requisição e melhorar a concorrência. Quando a fila interna enche, novas requisições são pausadas até haver espaço disponível.
-
Preços:
Assinatura (Detecção de Arquivos Maliciosos): USD 1,5 por 10.000 detecções mensais. A assinatura suporta apenas o recurso básico de detecção de arquivos maliciosos. Detecção por modelos de IA, detecção de arquivos Skill e detecção de arquivos NAS não são suportadas.
-
Pagamento conforme o uso (Detecção Agêntica de Arquivos Maliciosos): USD 0,0012 por arquivo. O pagamento conforme o uso oferece todas as capacidades da detecção agêntica. Além da detecção básica, inclui detecção por modelos de IA, detecção de arquivos Skill e detecção de arquivos NAS.
NotaAo ative o service de pagamento conforme o uso, o sistema cobra uma taxa base adicional de service (USD 0,0072 por hora).
-
Faturamento de arquivos compactados: Se a detecção de arquivos compactados estiver ativada, as detecções consumidas são calculadas com base na quantidade de arquivos descompactados.
Exemplo: Analisar um pacote compactado contendo 1.000 pequenos arquivos conta como 1.000 arquivos e consome 1.000 detecções.
Tratamento de resultados de detecção: Incluído na taxa do service. Sem cobrança adicional.
-
Lista de buckets vazia ou bucket alvo não encontrado
-
Causa: A região do bucket não está entre as regiões suportadas para detecção de arquivos maliciosos.
Solução: Confirme se a região do bucket consta na lista de regiões suportadas em Scope. Se não for suportada, copie os arquivos para um bucket em uma região compatível.
-
Causa: A lista de buckets não foi sincronizada.
Solução: Na aba OSS File Check, clique em Synchronize Buckets para sincronizar a lista mais recente de buckets.
-
-
Permissões insuficientes ou falha na autorização
Causa: A função vinculada ao service do Security Center não foi criada ou a política de permissões está incompleta.
Solução: Certifique-se de que a conta Alibaba Cloud atual possui permissões de gerenciamento RAM. Ao ative a detecção de arquivos maliciosos pela primeira vez, o sistema cria automaticamente a função vinculada ao service
AliyunServiceRoleForSasFileDetect. Para crie manualmente, consulte Create a RAM user.
-
Impossível iniciar tarefa de detecção ou cota insuficiente
-
Causa: O pacote de recursos de assinatura expirou ou o saldo da conta de pagamento conforme o uso é insuficiente.
Solução: Acesse a página Overview do Security Center para verificar a contagem de detecções disponível. Se for insuficiente, consulte Security Center purchase page para renovar ou recarregar.
-
Causa: A fila de detecção está cheia, excedendo o limite de QPS.
Solução: O QPS padrão é de 10 requisições/segundo na versão de teste e 20 requisições/segundo na versão paga. Reduza a frequência de concorrência ou tente novamente mais tarde.
-
-
Arquivos criptografados não podem ser detectados
Causa: O arquivo OSS utiliza um método de criptografia não suportado ou o método de descriptografia foi selecionado incorretamente.
Solução: A detecção de arquivos maliciosos suporta apenas criptografia no lado do servidor do OSS (SSE-KMS, SSE-OSS). Selecione o File Decryption Type correspondente ao método de criptografia do arquivo. Criptografia no lado do cliente ou arquivos criptografados por terceiros não são suportados.
-
É possível reembolsar detecções de arquivos já utilizadas?
Não. Antes de iniciar a detecção, confirme o escopo de arquivos e a política de detecção para evitar desperdício de cotas por operação incorreta.
-
Por que "Total Files" e "Detected Total Files" divergem na aba de detecção de arquivos OSS?
Total Files: Quantidade natural de arquivos no bucket (um pacote compactado conta como 1).
Detected Total Files: Número real de arquivos escaneados. Se a verificação de arquivos compactados estiver ativada, os arquivos internos também são contabilizados. O total depende das configurações de Decompression Level e quantidade máxima de arquivos descompactados. Esse valor representa o acumulado de todas as tarefas históricas de detecção no bucket atual, não apenas de uma única execução. Mesmo que arquivos tenham sido excluídos, seus registros históricos continuam contando no total acumulado, podendo resultar em um número maior que a quantidade atual de arquivos no bucket.
Ao escanear um pacote compactado com muitos arquivos, "Detected Total Files" será muito superior a "Total Files". O faturamento baseia-se na quantidade real de arquivos detectados.
-
O que fazer se a tarefa de detecção for interrompida por cota insuficiente?
No modelo de assinatura, a tarefa de varredura é interrompida quando as detecções restantes são insuficientes. Consulte as soluções abaixo:
Cancele a tarefa de varredura atual: Na página OSS File Check, localize o bucket em análise e clique em no botão Cancel Detection na linha correspondente para cancele a tarefa atual.
Atualizar configuração: Acesse a página console do Security Center - Overview. Na seção Subscription, clique em Change Configuration>Upgrade Now para adquirir detecções adicionais. Para mais informações, consulte Upgrade or downgrade.
-
Modifique política de detecção: Desative a descompactação de arquivos compactados nas configurações de detecção para reduzir o consumo por tarefa e execute a varredura novamente.
Se você não cancele a tarefa atual e apenas renovar continuando a varredura, o sistema ainda descompactará e analisará os arquivos do pacote, consumindo sua cota continuamente.
-
Como visualize os detalhes de autorização do SDK de arquivos maliciosos (como contagem restante e data de expiração)?
Visualize a Personal SDK Authorization da conta atual no console, incluindo versão, status de ativação, limites de autorização, contagem restante, limites de taxa e data de expiração.
Acesse o console do Security Center - Risk Governance - Malicious File Detection. No canto superior esquerdo da página, selecione a região dos seus ativos: Chinese Mainland ou Outside Chinese Mainland.
Clique em SDK and Permissions no canto superior direito.
-
O que fazer ao receber o aviso "Malicious file detection SDK purchased but not yet used" ou "Notification not configured"?
Comprado, mas ainda não utilizado: Significa que a cota de detecção foi adquirida, mas nenhuma tarefa foi executada. Consulte a seção "Configure e execute tarefas de detecção" neste tópico para realizar uma detecção manual via console ou integrar o SDK para iniciar a análise.
Notificação não configurada: Indica que as notificações de resultados não foram configuradas, o que não afeta o funcionamento da detecção. Para receber alertas quando arquivos maliciosos forem detectados, siga as instruções na seção "Configure notificações (opcional)" deste tópico. Após a configuração, o aviso desaparecerá.
-
Preciso configure uma política de detecção se a detecção falhar ao usar API ou SDK?
Ao invocar a detecção de arquivos maliciosos via API ou SDK, não é necessário configure uma política de detecção no console. Políticas de detecção aplicam-se apenas à detecção automática de arquivos armazenados em buckets do Alibaba Cloud Object Storage Service (OSS) ou sistemas de arquivos NAS através do console.
Se uma chamada de API falhar, solucione o problema conforme abaixo:
Certifique-se de que o usuário Resource Access Management (RAM) recebeu a política de acesso
AliyunYundunSASFullAccess. Sem essa autorização, a API retornaForbidden.NoPermission.Verifique se o AccessKey está configurado nas variáveis de ambiente
ALIBABA_CLOUD_ACCESS_KEY_IDeALIBABA_CLOUD_ACCESS_KEY_SECRET.Se o código de erro
ERR_CALL_APIfor retornado, revise o código e os valores dos parâmetros.Caso receba o código de erro
ERR_INIT, garanta queinit()seja chamado antes da operação de detecção.
GetFileDetectApiInvokeInfo: Consulta informações de uso do SDK de detecção de arquivos maliciosos.
CreateFileDetectUploadUrl: Obtém os parâmetros necessários para fazer upload de um arquivo.
CreateFileDetect: Envia arquivos para detecção.
GetFileDetectResult: Obtém o resultado da detecção de arquivos.
ListCompressFileDetectResult: Recupera a lista de resultados de detecção de arquivos dentro de um pacote compactado.
Configure notificações (opcional)
O Security Center oferece recursos de notificação via robô DingTalk, permitindo enviar alertas de arquivos maliciosos detectados automaticamente para grupos do DingTalk, facilitando uma resposta rápida aos riscos. Siga o procedimento abaixo:
Cotas e limites
Faturamento
A detecção de arquivos maliciosos (incluindo a detecção agêntica) é cobrada com base na quantidade de arquivos analisados (contagem de detecções). Utilize o modelo de assinatura para ative a Detecção de Arquivos Maliciosos ou o pagamento conforme o uso para ative a Detecção Agêntica de Arquivos Maliciosos.
Para mais detalhes sobre modelos e lógica de faturamento, consulte Subscription e Pay-as-you-go.
Solução de problemas
FAQ
Faturamento e cota
Gerenciamento de autorizações
Apêndice
Referência de API
Utilize o recurso de detecção de arquivos maliciosos invocando operações de API. Alguns documentos de referência estão listados abaixo:
Tipos de vírus suportados
|
Tipo de vírus (virus_type) |
Nome do vírus |
|
Backdoor |
Backdoor de reverse shell |
|
DDoS |
Trojan DDoS |
|
Downloader |
Trojan downloader |
|
Engtest |
Programa de teste de motor |
|
Hacktool |
Ferramenta de hacking |
|
Trojan |
Programa de alto risco |
|
Malbaseware |
Software base contaminado |
|
MalScript |
Script malicioso |
|
Malware |
Malware |
|
Miner |
Programa de mineração |
|
Proxytool |
Ferramenta de proxy |
|
RansomWare |
Ransomware |
|
RiskWare |
Riskware |
|
Rootkit |
Rootkit |
|
Stealer |
Stealer |
|
Scanner |
Scanner |
|
Suspicious |
Programa suspeito |
|
Virus |
Vírus infeccioso |
|
WebShell |
Web shell |
|
Worm |
Worm |
|
AdWare |
Adware |
|
Patcher |
Patcher |
|
Gametool |
Ferramenta de jogo |