Partilhar via


Migrar regras de deteção do Splunk para o Microsoft Sentinel

As regras de deteção do Splunk são componentes de gerenciamento de eventos e informações de segurança (SIEM) que se comparam às regras de análise no Microsoft Sentinel. Este artigo descreve os conceitos para identificá-los, compará-los e migrá-los para o Microsoft Sentinel. A melhor maneira é começar com a experiência de migração SIEM, que identifica regras de análise prontas para uso (OOTB) para traduzir automaticamente.

Se você quiser migrar sua implantação do Splunk Observability, saiba mais sobre como migrar do Splunk para os Logs do Azure Monitor.

Regras de auditoria

O Microsoft Sentinel usa análises de aprendizado de máquina para criar incidentes acionáveis e de alta fidelidade. Algumas das suas deteções existentes do Splunk podem ser redundantes no Microsoft Sentinel, por isso não as migre todas cegamente. Analise estas considerações à medida que identifica as regras de deteção existentes.

  • Certifique-se de selecionar casos de uso que justifiquem a migração de regras, considerando a prioridade e a eficiência do negócio.
  • Verifique se você entende os tipos de regras do Microsoft Sentinel.
  • Verifique se você entende a terminologia da regra.
  • Analise regras desatualizadas que não tenham alertas nos últimos 6 a 12 meses e determine se elas ainda são relevantes.
  • Elimine ameaças ou alertas de baixo nível que você ignora rotineiramente.
  • Confirme as fontes de dados conectadas e revise seus métodos de conexão de dados. O Microsoft Sentinel Analytics exige que o tipo de dados esteja presente no espaço de trabalho do Log Analytics antes que uma regra seja habilitada. Revisite as conversas de coleta de dados para garantir a profundidade e a amplitude dos dados nos casos de uso que você planeja detetar. Em seguida, use a experiência de migração do SIEM para garantir que as fontes de dados sejam mapeadas adequadamente.

Migrar regras

Depois de identificar as deteções do Splunk a serem migradas, revise estas considerações para o processo de migração:

  • Compare a funcionalidade existente das regras de análise OOTB do Microsoft Sentinel com seus casos de uso atuais. Use a experiência de migração SIEM para ver quais deteções do Splunk são convertidas automaticamente em modelos OOTB.
  • Traduza deteções que não estão alinhadas às regras de análise OOTB. A melhor maneira de traduzir as deteções do Splunk automaticamente é com a experiência de migração SIEM.
  • Descubra mais algoritmos para seus casos de uso explorando recursos da comunidade, como o SOC Prime Threat Detection Marketplace.
  • Traduza manualmente as deteções se as regras incorporadas não estiverem disponíveis ou não forem traduzidas automaticamente. Crie as novas consultas KQL e revise o mapeamento de regras.

Para obter mais informações, consulte Práticas recomendadas para migrar regras de deteção.

Etapas de migração de regras

  1. Verifique se você tem um sistema de teste em vigor para cada regra que deseja migrar.

    1. Prepare um processo de validação para suas regras migradas, incluindo cenários de teste completos e scripts.

    2. Certifique-se de que sua equipe tenha recursos úteis para testar suas regras migradas.

    3. Confirme se você tem as fontes de dados necessárias conectadas e revise seus métodos de conexão de dados.

  2. Verifique se suas deteções estão disponíveis como modelos OOTB no Microsoft Sentinel:

    • Use a experiência de migração SIEM para automatizar a tradução e a instalação dos modelos OOTB.

      Para obter mais informações, consulte Usar a experiência de migração do SIEM.

    • Se você tiver casos de uso não refletidos nas deteções, crie regras para seu próprio espaço de trabalho com modelos de regras OOTB.

      No Microsoft Sentinel, vá para o hub de conteúdo.

      Filtrar Tipo de conteúdo para modelos de regras do Google Analytics.

      Encontre e instale/atualize cada solução de hub de conteúdo correspondente ou modelo de regra de análise independente.

      Para obter mais informações, consulte Detetar ameaças prontas para uso.

    • Se você tiver deteções que não são cobertas pelas regras OOTB do Microsoft Sentinel, primeiro tente a experiência de migração SIEM para tradução automática.

    • Se nem as regras OOTB nem a migração SIEM traduzirem completamente a deteção, crie a regra manualmente. Nesses casos, use as seguintes etapas para criar sua regra:

      1. Identifique as fontes de dados que você deseja usar em sua regra. Identifique as tabelas do Microsoft Sentinel que você deseja consultar criando uma tabela de mapeamento entre fontes de dados e tabelas de dados.

      2. Identifique quaisquer atributos, campos ou entidades em seus dados que você deseja usar em suas regras.

      3. Identifique os critérios e a lógica da regra. Nesta etapa, considere encontrar modelos de regras como exemplos de como construir suas consultas KQL.

        Considere filtros, regras de correlação, listas ativas, conjuntos de referências, listas de observação, anomalias de deteção, agregações e assim por diante. Você pode usar referências fornecidas pelo SIEM herdado para entender a melhor forma de mapear a sintaxe da consulta.

      4. Identifique a condição de gatilho e a ação da regra e, em seguida, construa e revise sua consulta KQL. Ao revisar sua consulta, considere os recursos de orientação de otimização do KQL.

  3. Teste a regra com cada um dos seus casos de uso relevantes. Se não fornecer os resultados esperados, revise e edite o KQL e teste-o novamente.

  4. Quando estiver satisfeito, considere a regra migrada. Crie um manual para sua ação de regra, conforme necessário. Para obter mais informações, consulte Automatizar a resposta a ameaças com playbooks no Microsoft Sentinel.

Saiba mais sobre as regras de análise:

Comparar terminologia de regras

Esta tabela ajuda você a esclarecer o conceito de uma regra baseada em Kusto Query Language (KQL) no Microsoft Sentinel em comparação com uma deteção Splunk baseada em Search Processing Language (SPL).

Splunk Microsoft Sentinel
Tipo de regra • Agendado
• Em tempo real
• Consulta agendada
• Fusão
• Segurança Microsoft
• Análise de Comportamento de Machine Learning (ML)
Critérios Definir em SPL Definir em KQL
Condição do gatilho • Número de resultados
• Número de anfitriões
• Número de fontes
• Personalizado
Limite: Número de resultados da consulta
Ação • Adicionar aos alertas acionados
• Registrar evento
• Resultados de saída para pesquisa
• E muito mais
• Criar alerta ou incidente
• Integra-se com Aplicativos Lógicos

Mapear e comparar exemplos de regras

Use esses exemplos para comparar e mapear regras do Splunk para o Microsoft Sentinel em vários cenários.

Comandos de pesquisa comuns

Comando SPL Description Operador KQL Exemplo de KQL
chart/ timechart Retorna resultados em uma saída tabular para gráficos de séries temporais. operador de renderização … | render timechart
dedup Remove resultados subsequentes que correspondem a um critério especificado. • distinto
• resumir
… | summarize by Computer, EventID
eval Calcula uma expressão. Saiba mais sobre comandos comunseval. estender T | extend duration = endTime - startTime
fields Remove campos dos resultados da pesquisa. • Projeto
• Projeto Fora
T | project cost=price*quantity, price
head/tail Devolve o primeiro ou o último N resultados. Início T | top 5 by Name desc nulls last
lookup Adiciona valores de campo de uma fonte externa. • dados externos
• pesquisa
Exemplo de KQL
rename Renomeia um campo. Use curingas para especificar vários campos. projeto-renomear T | project-rename new_column_name = column_name
rex Especifica nomes de grupos usando expressões regulares para extrair campos. corresponde regex … | where field matches regex "^addr.*"
search Filtra os resultados para resultados que correspondem à expressão de pesquisa. search search "X"
sort Classifica os resultados da pesquisa pelos campos especificados. sort T | sort by strlen(country) asc, price desc
stats Fornece estatísticas, opcionalmente agrupadas por campos. Saiba mais sobre comandos comuns de estatísticas. resumir Exemplo de KQL
mstats Semelhante às estatísticas, usadas em métricas em vez de eventos. resumir Exemplo de KQL
table Especifica quais campos devem ser mantidos no conjunto de resultados e retém dados em formato tabular. projeto T | project columnA, columnB
top/rare Exibe os valores mais ou menos comuns de um campo. Início T | top 5 by Name desc nulls last
transaction Agrupa os resultados da pesquisa em transações.

Exemplo de SPL
Exemplo: row_window_session Exemplo de KQL
eventstats Gera estatísticas de resumo a partir de campos em seus eventos e salva essas estatísticas em um novo campo.

Exemplo de SPL
Exemplos:
• aderir
• make_list
• MV-Expandir
Exemplo de KQL
streamstats Encontre a soma cumulativa de um campo.

Exemplo de SPL:
... | streamstats sum(bytes) as bytes _ total \| timechart
row_cumsum ...\| serialize cs=row_cumsum(bytes)
anomalydetection Encontre anomalias no campo especificado.

Exemplo de SPL
series_decompose_anomalies() Exemplo de KQL
where Filtra os resultados da pesquisa usando eval expressões. Usado para comparar dois campos diferentes. em que T | where fruit=="apple"

lookup comando: exemplo KQL

Users 
| where UserID in ((externaldata (UserID:string) [
@"https://storageaccount.blob.core.windows.net/storagecontainer/users.txt" 
h@"?...SAS..." // Secret token to access the blob 
])) | ... 

stats comando: exemplo KQL

Sales 
| summarize NumTransactions=count(), 
Total=sum(UnitPrice * NumUnits) by Fruit, 
StartOfMonth=startofmonth(SellDateTime) 

mstats comando: exemplo KQL

T | summarize count() by price_range=bin(price, 10.0) 

transaction comando: exemplo SPL

sourcetype=MyLogTable type=Event
| transaction ActivityId startswith="Start" endswith="Stop"
| Rename timestamp as StartTime
| Table City, ActivityId, StartTime, Duration

transaction comando: exemplo KQL

let Events = MyLogTable | where type=="Event";
Events
| where Name == "Start"
| project Name, City, ActivityId, StartTime=timestamp
| join (Events
| where Name == "Stop"
| project StopTime=timestamp, ActivityId)
on ActivityId
| project City, ActivityId, StartTime, 
Duration = StopTime – StartTime

Use row_window_session() para calcular valores de início de sessão para uma coluna em um conjunto de linhas serializado.

...| extend SessionStarted = row_window_session(
Timestamp, 1h, 5m, ID != prev(ID))

eventstats comando: exemplo SPL

… | bin span=1m _time
|stats count AS count_i by _time, category
| eventstats sum(count_i) as count_total by _time

eventstats comando: exemplo KQL

Aqui está um exemplo com a join declaração:

let binSize = 1h;
let detail = SecurityEvent 
| summarize detail_count = count() by EventID,
tbin = bin(TimeGenerated, binSize);
let summary = SecurityEvent
| summarize sum_count = count() by 
tbin = bin(TimeGenerated, binSize);
detail 
| join kind=leftouter (summary) on tbin 
| project-away tbin1

Aqui está um exemplo com a make_list declaração:

let binSize = 1m;
SecurityEvent
| where TimeGenerated >= ago(24h)
| summarize TotalEvents = count() by EventID, 
groupBin =bin(TimeGenerated, binSize)
|summarize make_list(EventID), make_list(TotalEvents), 
sum(TotalEvents) by groupBin
| mvexpand list_EventID, list_TotalEvents

anomalydetection comando: exemplo SPL

sourcetype=nasdaq earliest=-10y
| anomalydetection Close _ Price

anomalydetection comando: exemplo KQL

let LookBackPeriod= 7d;
let disableAccountLogon=SignIn
| where ResultType == "50057"
| where ResultDescription has "account is disabled";
disableAccountLogon
| make-series Trend=count() default=0 on TimeGenerated 
in range(startofday(ago(LookBackPeriod)), now(), 1d)
| extend (RSquare,Slope,Variance,RVariance,Interception,
LineFit)=series_fit_line(Trend)
| extend (anomalies,score) = 
series_decompose_anomalies(Trend)

Comandos comuns eval

Comando SPL Description Exemplo de SPL Comando KQL Exemplo de KQL
abs(X) Devolve o valor absoluto de X. abs(number) abs() abs(X)
case(X,"Y",…) Usa pares de X e Y argumentos, onde os X argumentos são expressões booleanas. Quando avaliados para TRUE, os argumentos retornam o argumento correspondente Y . Exemplo de SPL case Exemplo de KQL
ceil(X) Teto de um número X. ceil(1.9) ceiling() ceiling(1.9)
cidrmatch("X",Y) Identifica endereços IP que pertencem a uma sub-rede específica. cidrmatch
("123.132.32.0/25",ip)
ipv4_is_match()
• ipv6_is_match()
ipv4_is_match('192.168.1.1', '192.168.1.255')
== false
coalesce(X,…) Retorna o primeiro valor que não é nulo. coalesce(null(), "Returned val", null()) coalesce() coalesce(tolong("not a number"),
tolong("42"), 33) == 42
cos(X) Calcula o cosseno de X. n=cos(0) cos() cos(X)
exact(X) Avalia uma expressão X usando aritmética de ponto flutuante de precisão dupla. exact(3.14*num) todecimal() todecimal(3.14*2)
exp(X) Devolve eX. exp(3) exp() exp(3)
if(X,Y,Z) Se X avaliado como TRUE, o resultado é o segundo argumento Y. Se X for avaliado como FALSE, o resultado será avaliado para o terceiro argumento Z. if(error==200,
"OK", "Error")
iif() Exemplo de KQL
isbool(X) Retorna TRUE se X for booleano. isbool(field) iif()
gettype
iif(gettype(X) =="bool","TRUE","FALSE")
isint(X) Retorna TRUE se X for um inteiro. isint(field) iif()
gettype
Exemplo de KQL
isnull(X) Retorna TRUE se X for null. isnull(field) isnull() isnull(field)
isstr(X) Retorna TRUE se X for uma cadeia de caracteres. isstr(field) iif()
gettype
Exemplo de KQL
len(X) Esta função retorna o comprimento do caractere de uma cadeia de caracteres X. len(field) strlen() strlen(field)
like(X,"y") Retorna TRUE se e somente se X for como o padrão SQLite em Y. like(field, "addr%") has
contains
startswith
• corresponde regex
Exemplo de KQL
log(X,Y) Retorna o log do primeiro argumento X usando o segundo argumento Y como base. O valor padrão de Y é 10. log(number,2) log
log2
log10
log(X)

log2(X)

log10(X)
lower(X) Devolve o valor minúsculo de X. lower(username) abaixar tolower(username)
ltrim(X,Y) Retorna X com os caracteres no parâmetro Y cortados do lado esquerdo. A saída padrão de Y é espaços e guias. ltrim(" ZZZabcZZ ", " Z") trim_start() trim_start(“ ZZZabcZZ”,” ZZZ”)
match(X,Y) Retorna se X corresponder ao padrão regex Y. match(field, "^\d{1,3}.\d$") matches regex … | where field matches regex @"^\d{1,3}.\d$")
max(X,…) Devolve o valor máximo numa coluna. max(delay, mydelay) max()
arg_max()
… | summarize max(field)
md5(X) Retorna o hash MD5 de um valor Xde cadeia de caracteres. md5(field) hash_md5 hash_md5("X")
min(X,…) Devolve o valor mínimo numa coluna. min(delay, mydelay) min_of()
• min()
• arg_min
Exemplo de KQL
mvcount(X) Devolve o número (total) de X valores. mvcount(multifield) dcount …| summarize dcount(X) by Y
mvfilter(X) Filtra um campo de vários valores com base na expressão booleana X . mvfilter(match(email, "net$")) mv-apply Exemplo de KQL
mvindex(X,Y,Z) Retorna um subconjunto do argumento de vários valores X de uma posição inicial (baseada em zero) Y para Z (opcional). mvindex( multifield, 2) array_slice array_slice(arr, 1, 2)
mvjoin(X,Y) Dado um campo X de vários valores e delimitador Yde cadeia de caracteres , e une os valores individuais do uso Ydo X . mvjoin(address, ";") strcat_array Exemplo de KQL
now() Retorna a hora atual, representada na hora Unix. now() now() now()

now(-2d)
null() Não aceita argumentos e devoluções NULL. null() nulo null
nullif(X,Y) Inclui dois argumentos X e Y, e retorna X se os argumentos forem diferentes. Caso contrário, retorna NULL. nullif(fieldA, fieldB) iif iif(fieldA==fieldB, null, fieldA)
random() Devolve um número pseudoaleatório entre 0 .2147483647 random() rand() rand()
relative_ time(X,Y) Dado um especificador de tempo X de época e tempo relativo, retorna o valor de tempo de época de Y aplicado a X.Y relative_time(now(),"-1d@d") Tempo UNIX Exemplo de KQL
replace(X,Y,Z) Retorna uma cadeia de caracteres formada pela substituição de string Z para cada ocorrência de string Y de expressão regular em string X. Data de retorno com os números de mês e dia trocados.
Por exemplo, para a 4/30/2015 entrada, a saída é 30/4/2009:

replace(date, "^(\d{1,2})/ (\d{1,2})/", "\2/\1/")
replace() Exemplo de KQL
round(X,Y) Devolve X arredondado para o número de casas decimais especificado por Y. O padrão é arredondar para um inteiro. round(3.5) round round(3.5)
rtrim(X,Y) Retorna X com os caracteres de cortados Y do lado direito. Se Y não for especificado, os espaços e as guias serão cortados. rtrim(" ZZZZabcZZ ", " Z") trim_end() trim_end(@"[ Z]+",A)
searchmatch(X) Retorna TRUE se o evento corresponder à cadeia de caracteres Xde pesquisa . searchmatch("foo AND bar") IIF() iif(field has "X","Yes","No")
split(X,"Y") Retorna X como um campo de vários valores, dividido por delimitador Y. split(address, ";") split() split(address, ";")
sqrt(X) Devolve a raiz quadrada de X. sqrt(9) sqrt() sqrt(9)
strftime(X,Y) Retorna o valor X de tempo de época renderizado usando o formato especificado por Y. strftime(_time, "%H:%M") format_datetime() format_datetime(time,'HH:mm')
strptime(X,Y) Dado um tempo representado por uma cadeia de caracteres X, retorna o valor analisado do formato Y. strptime(timeStr, "%H:%M") format_datetime() Exemplo de KQL
substr(X,Y,Z) Retorna um campo X de substring da posição inicial (baseado em um) Y para Z caracteres (opcionais). substr("string", 1, 3) substring() substring("string", 0, 3)
time() Devolve o tempo do relógio de parede com resolução de microssegundos. time() format_datetime() Exemplo de KQL
tonumber(X,Y) Converte a cadeia de caracteres X de entrada em um número, onde Y (opcional, o valor padrão é 10) define a base do número para o qual converter. tonumber("0A4",16) toint() toint("123")
tostring(X,Y) Descrição Exemplo de SPL tostring() tostring(123)
typeof(X) Retorna uma representação de cadeia de caracteres do tipo de campo. typeof(12) gettype() gettype(12)
urldecode(X) Retorna a URL X decodificada. Exemplo de SPL url_decode Exemplo de KQL

case(X,"Y",…) Exemplo de SPL

case(error == 404, "Not found",
error == 500,"Internal Server Error",
error == 200, "OK")

case(X,"Y",…) Exemplo de KQL

T
| extend Message = case(error == 404, "Not found", 
error == 500,"Internal Server Error", "OK") 

if(X,Y,Z) Exemplo de KQL

iif(floor(Timestamp, 1d)==floor(now(), 1d), 
"today", "anotherday")

isint(X) Exemplo de KQL

iif(gettype(X) =="long","TRUE","FALSE")

isstr(X) Exemplo de KQL

iif(gettype(X) =="string","TRUE","FALSE")

like(X,"y") Exemplo

… | where field has "addr"

… | where field contains "addr"

… | where field startswith "addr"

… | where field matches regex "^addr.*"

min(X,…) Exemplo de KQL

min_of (expr_1, expr_2 ...)

…|summarize min(expr)

…| summarize arg_min(Price,*) by Product

mvfilter(X) Exemplo de KQL

T | mv-apply Metric to typeof(real) on 
(
 top 2 by Metric desc
)

mvjoin(X,Y) Exemplo de KQL

strcat_array(dynamic([1, 2, 3]), "->")

relative time(X,Y) Exemplo de KQL

let toUnixTime = (dt:datetime)
{
(dt - datetime(1970-01-01))/1s 
};

replace(X,Y,Z) Exemplo de KQL

replace( @'^(\d{1,2})/(\d{1,2})/', @'\2/\1/',date)

strptime(X,Y) Exemplo de KQL

format_datetime(datetime('2017-08-16 11:25:10'),
'HH:mm')

time() Exemplo de KQL

format_datetime(datetime(2015-12-14 02:03:04),
'h:m:s')

tostring(X,Y)

Retorna um valor de campo como uma cadeia de X caracteres.

  • Se o valor de for um número, X será reformatado para um valor de cadeia de X caracteres.
  • Se X for um valor booleano, X é reformatado para TRUE ou FALSE.
  • Se X for um número, o segundo argumento Y é opcional e pode ser hex (converte para um hexadecimal), commas (formatos X com vírgulas X X e duas casas decimais) ou duration (converte de um formato de hora em segundos para um formato de hora legível: HH:MM:SS).
tostring(X,Y) Exemplo de SPL

Este exemplo retorna:

foo=615 and foo2=00:10:15:

… | eval foo=615 | eval foo2 = tostring(
foo, "duration")

urldecode(X) Exemplo de SPL

urldecode("http%3A%2F%2Fwww.splunk.com%2Fdownload%3Fr%3Dheader")

Exemplo de KQL de comandos comuns stats

Comando SPL Description Comando KQL Exemplo de KQL
avg(X) Devolve a média dos valores do campo X. média() avg(X)
count(X) Devolve o número de ocorrências do campo X. Para indicar um valor de campo específico a ser correspondido, formate X como eval(field="value"). contagem() summarize count()
dc(X) Devolve a contagem de valores distintos do campo X. dcount() …\| summarize countries=dcount(country) by continent
earliest(X) Devolve o valor Xcronologicamente mais antigo de . arg_min() … \| summarize arg_min(TimeGenerated, *) by X
latest(X) Devolve o valor Xcronologicamente mais recente de . arg_max() … \| summarize arg_max(TimeGenerated, *) by X
max(X) Devolve o valor máximo do campo X. Se os valores de X não forem numéricos, o valor máximo será encontrado por ordem alfabética. máx() …\| summarize max(X)
median(X) Devolve o valor intermédio do campo X. percentil() …\| summarize percentile(X, 50)
min(X) Devolve o valor mínimo do campo X. Se os valores de X não forem numéricos, o valor mínimo será encontrado por ordem alfabética. min() …\| summarize min(X)
mode(X) Devolve o valor mais frequente do campo X. top-hitters() …\| top-hitters 1 of Y by X
perc(Y) Devolve o valor percentil X do campo Y. Por exemplo, perc5(total) retorna o valor do quinto percentil de um campo total. percentil() …\| summarize percentile(Y, 5)
range(X) Devolve a diferença entre os valores máximo e mínimo do campo X. intervalo() range(1, 3)
stdev(X) Devolve o desvio padrão da amostra do campo X. Stdev stdev()
stdevp(X) Devolve o desvio padrão da população do campo X. Stdevp() stdevp()
sum(X) Devolve a soma dos valores do campo X. soma() sum(X)
sumsq(X) Devolve a soma dos quadrados dos valores do campo X.
values(X) Retorna a lista de todos os valores distintos do campo X como uma entrada de vários valores. A ordem dos valores é alfabética. make_set() …\| summarize r = make_set(X)
var(X) Devolve a variância de amostra do campo X. variância variance(X)

Próximos passos

Neste artigo, você aprendeu como mapear suas regras de migração do Splunk para o Microsoft Sentinel.