Crie uma regra de detecção SQL personalizada no Agentic SOC usando o Simple Log Service (SLS) para identificar e gerar alertas sobre logins de contas inativas em tempo real.
Contexto e objetivos
Cenário alvo: Detectar logins provenientes de contas inativas.
Método: Execute consultas SQL agendadas que comparem os logins recentes com uma linha de base histórica para identificar usuários que apareceram recentemente, mas estavam ausentes nos registros históricos.
Lógica principal
A SQL de detecção é composta por três partes:
Definir atividade recente: Consulte eventos de login dos últimos 20 minutos.
Estabelecer uma linha de base histórica: Consulte usuários que fizeram login em um host nas últimas 24 horas, excluindo os 20 minutos mais recentes.
Comparar os conjuntos de dados: Una a atividade recente à linha de base histórica. A presença de um usuário na atividade recente e sua ausência na linha de base indicam um login anormal.
Definir atividade recente
(
select
user_id,
src_ip,
username,
uuid,
start_time
from
log
where
cast(start_time as bigint) >= cast(to_unixtime (current_timestamp) as bigint) - 20 * 60
and cast(start_time as bigint) < cast(to_unixtime (current_timestamp) as bigint)
) a
-
Análise de sintaxe:
from log: Consulta dados da tabelalog.to_unixtime(current_timestamp): Retorna o timestamp Unix atual (em segundos).cast(... as bigint): Converte o timestamp parabigintpara permitir operações aritméticas e comparações.-
where ...: Define uma janela deslizante de 20 minutos terminando no momento atual.>= ... - 20 * 60: Ostart_timedeve ser igual ou posterior ao horário atual menos 20 minutos.< ...: Ostart_timedeve ser anterior ao horário atual.
-
Análise semântica:
Finalidade: Define um conjunto de resultados chamado
apara "atividade recente", que representa os objetos primários da análise.Resultado: Um conjunto de resultados temporário contendo usuários ativos nos últimos 20 minutos, incluindo
user_idesrc_ip.Ponto-chave: O período "recente" corresponde a uma janela deslizante de 20 minutos que termina no momento atual.
Estabelecer uma linha de base histórica
(
select
user_id,
username,
uuid
from
log
where
schema='HOST_LOGIN_ACTIVITY' and
cast(start_time as bigint) >= cast(to_unixtime (current_timestamp) as bigint) - 24 * 3600
and cast(start_time as bigint) < cast(to_unixtime (current_timestamp) as bigint) - 20 * 60
) b
-
Análise de sintaxe:
schema='HOST_LOGIN_ACTIVITY': Filtra apenas logs de atividade de login em hosts, aumentando a precisão da linha de base.-
where ...: Define um intervalo de tempo de 24 horas atrás até 20 minutos atrás.>= ... - 24 * 3600: O horário inicial deve ser igual ou posterior ao horário atual menos 24 horas.< ... - 20 * 60: O horário inicial deve ser anterior ao horário atual menos 20 minutos.
-
Análise semântica:
Finalidade: Constrói um conjunto de "linha de base histórica" denominado
bpara servir como referência na identificação de atividades anormais.Resultado: Um conjunto de resultados temporário com usuários que fizeram login nas últimas 24 horas, excluindo os 20 minutos mais recentes.
Ponto-chave: A janela abrange de 24 horas atrás até 20 minutos atrás, garantindo que não haja sobreposição com os dados de atividade recente e evitando erros de autocomparação.
Usar LEFT JOIN para comparação de diferenças
... a
left join
... b on a.username = b.username and a.uuid = b.uuid and a.user_id = b.user_id
-
Análise de sintaxe:
LEFT JOIN: Utiliza a tabela à esquerda (a, usuários recentes) como base e correlaciona cada registro com a tabela à direita (b, usuários históricos).on a.username = b.username and a.uuid = b.uuid and a.user_id=b.user_id: Realiza a união baseada emusername,uuideuser_idcombinados para identificar exclusivamente uma entidade de usuário.
-
Análise semântica:
Finalidade: Correlaciona a "atividade recente" (
a) com a "linha de base histórica" (b) para localizar registros históricos de login para cada usuário recente.Resultado: Um conjunto de resultados combinado contendo todos os registros da tabela
ae os registros correspondentes da tabelab.Ponto-chave: O
LEFT JOINé assimétrico: se um usuário da tabelaanão tiver correspondência na tabelab, todas as colunas da tabelabretornarãoNULL. Esse é o mecanismo central para identificar novas atividades.
Filtrar o resultado final
where
(
b.username is null
or b.username = ''
)
-
Análise de sintaxe:
b.username is null: Aproveita o comportamento doLEFT JOIN. Quando um usuário recente (tabelaa) não possui correspondência na linha de base histórica (tabelab), o campob.usernameassume o valorNULL.or b.username = '': Uma condição defensiva para casos em que um campo de log contém uma string vazia''em vez deNULL.
-
Análise semântica:
Finalidade: Filtra os resultados da união para isolar atividades que surgiram recentemente, mas não possuem registro histórico.
Resultado: Permanecem apenas os registros sem correspondência do
LEFT JOIN, que representam os eventos anormais buscados.Ponto-chave: A condição
b.username is nullatua como o ponto de decisão central da lógica de detecção. Ela utiliza os valoresNULLresultantes da união para separar do conjunto de dados os registros classificados como "presentes recentemente, ausentes historicamente".
SELECT DISTINCT: Gerar alertas
select distinct
a.user_id,
a.src_ip,
a.username,
a.uuid
-
Análise de sintaxe:
SELECT DISTINCT: Seleciona os campos especificados e remove duplicatas, garantindo apenas um alerta por evento anormal.
-
Análise semântica:
Finalidade: Formata e gera uma lista final de eventos anormais para disparo de alertas.
Resultado: Uma lista de alertas deduplicada. Cada registro contém as informações essenciais de rastreamento: ID do usuário e IP de origem.
Ponto-chave: O uso de
DISTINCTdeduplica os resultados para que o comportamento anormal do mesmo usuário dentro da janela de detecção de 20 minutos dispare apenas um alerta.
Solução completa
Consulta SQL final
*|set session mode=scan;
select distinct
a.user_id,
a.src_ip,
a.username,
a.uuid
from
(
select
user_id,
src_ip,
username,
uuid,
start_time
from
log
where
cast(start_time as bigint) >= cast(to_unixtime (current_timestamp) as bigint) -20 * 60
and cast(start_time as bigint) < cast(to_unixtime (current_timestamp) as bigint)
) a
left join (
select
user_id,
username,
uuid
from
log
where
schema='HOST_LOGIN_ACTIVITY' and
cast(start_time as bigint) >= cast(to_unixtime (current_timestamp) as bigint) - 24 * 3600
and cast(start_time as bigint) < cast(to_unixtime (current_timestamp) as bigint) -20 * 60
) b on a.username = b.username
and a.uuid = b.uuid
and a.user_id=b.user_id
where
(
b.username is null
or b.username = ''
)
Configure a regra no Agentic SOC
-
Adquirir e ative o Agentic SOC
Consulte Adquirir e ativar para visualizar as opções de compra. Para acessar todos os recursos de detecção de ameaças personalizadas, recomendamos adquirir tanto o Log Ingestion Traffic quanto a Log Storage Capacity.
-
Fazer login no console e acesse a página Create Custom Rule
Faça login no .
No painel de navegação à esquerda, escolha . No canto superior esquerdo do Console, selecione a Região onde seus ativos estão localizados: Chinese Mainland ou Outside Chinese Mainland.
Na aba Custom, clique em Create Custom Rule.
-
Configure a regra de geração de alertas
No painel Create Custom Rule, na aba Basic Information, insira um nome e uma descrição para a regra e clique em Next para ir à página Alert Settings.
-
Configure a regra de detecção SQL com as seguintes definições:
Parâmetro
Valor
Rule Body
SQL
Log Scope
Logon Logs - Host Logon Success Log.
SQL Query
Copie o código da seção Consulta SQL final.
Scheduling Interval
Fixed Interval - 20 minutes.
SQL Time Window
24 hours.
Start Time
When the rule is enabled.
Generation Structure
Other Alert Logs.
Alarm Metric
Abnormal Logon.
Alert Severity
Medium.
ATT&CK Tactic
Persistence - T1136 Create Account.
Entity Mapping
-
Network Address
-
is_malware: 1 -
ip:$src_ip -
net_connect_dir: in
-
-
Host
-
is_asset: 1 -
uuid:$uuid
-
-
-
Configure a regra de geração de incidentes
Na página Alert Settings, após concluir a configuração, clique em Next para ir à página Incident Generation Settings.
-
Configure a regra de tempo com as seguintes definições:
Generate Event: Yes.
Incident Generation Method: Aggregate by type.
Aggregation Window: 20 minutes.
-
Validar a regra
Novas regras vêm Disabled por padrão. Teste-as primeiro para avaliar a eficácia. Durante o teste, o sistema calibra automaticamente os campos de alerta. Utilize as sugestões de calibração para otimizar a SQL da regra ou o playbook antes de ativá-la.
Altere o Enabling Status da regra desejada para Testing.
Na coluna de ações da regra alvo, clique em View Alert Test Result.
Visualize o gráfico de tendência de alertas e a lista de alertas gerados na página de detalhes do resultado do teste.
Na coluna Actions de um alerta, clique em Details para visualizar seus resultados de calibração.
-
Ative a regra personalizada
Após a aprovação da regra nos testes, defina seu Enabling Status como
Enabled.ImportanteTeste a regra antes de ativá-la.
Avaliação de riscos
Falso positivo: Usuários que fazem login após longas férias ou viagens de negócios podem ser sinalizados. Reduza os falsos positivos estendendo o limiar de
dormant_hours(por exemplo, para 72 horas) ou configurando uma lista de permissões de usuários.Falso negativo: Interrupções na coleta de logs ou formatos de campo fora do padrão podem causar cálculos incorretos de intervalos de tempo e falhas na detecção. Garanta a integridade e a consistência dos dados de log.
No console do Security Center, escolha Rule Management no painel de navegação à esquerda e clique em na aba Custom. A página exibe estatísticas das regras (regras ativadas, regras em teste e modelos de regras). Clique em na regra desejada (como Abnormal IP Login) para abrir um painel de detalhes que mostra o gráfico de tendência de alertas e os resultados dos testes, incluindo contagem de alertas, resultados de calibração e horários de ocorrência.