O componente DataFormat oferece ações de processamento de dados para playbooks de SOAR (Security Orchestration, Automation and Response), incluindo junção, agrupamento, concatenação e transformação de dados.
Ações
Cada ação tem uma finalidade específica. Consulte a tabela abaixo para escolher a ação adequada ao seu caso de uso.
|
Ação |
Funcionalidade |
Quando usar |
Equivalente SQL |
|
|
Une vários nós de dados e gera os campos especificados |
Para combinar dois ou mais conjuntos de dados em que as linhas de ambos devem corresponder |
INNER JOIN |
|
|
Une dois nós de dados e mantém todas as linhas do nó à esquerda |
Ao combinar conjuntos de dados que exigem todas as linhas do lado esquerdo, mesmo sem correspondência no lado direito |
LEFT JOIN |
|
|
Agrupa linhas por uma chave e calcula agregações |
Para resumir dados — por exemplo, contar eventos por tipo de ataque |
GROUP BY |
|
|
Concatena valores de campo em lotes formando strings |
Para mesclar valores de array em strings delimitadas com prefixo/sufixo opcional |
— |
|
|
Converte uma string em JSONArray ou JSONObject |
Para preparar dados de string para ações subsequentes que exigem entrada JSON |
CAST / CONVERT |
|
|
Combina linhas de vários nós de dados em um único conjunto de dados |
Para mesclar resultados de ramificações paralelas em uma única lista |
UNION ALL |
|
|
Crie uma nova linha de dados com pares chave-valor especificados |
Para gerar saída estruturada a partir de valores estáticos ou upstream |
SELECT ... AS |
Salve os dados JSON de exemplo como um arquivo antes de importar exemplos como playbooks de teste. Para saber como importar um playbook, consulte Importar um playbook .
Exemplos de configuração do componente
As seções a seguir detalham a configuração e apresentam exemplos de entrada e saída para cada ação.
joindata
Une vários nós de dados com base em uma chave compartilhada e gera os campos especificados. Trata-se de uma junção interna (inner join): apenas as linhas correspondentes em todos os nós de entrada aparecem na saída.
Parâmetros
|
Parâmetro |
Descrição |
|
|
Nós de dados a unir. Os dados de cada nó devem ser um JSONArray. Não há limite para a profundidade de aninhamento; um JSONArray pode conter JSONArrays aninhados. |
|
|
Campos usados para a junção. Formato: |
|
|
Campos a incluir na saída. Formato: |
Ao referenciar um nó eminputNodes, adicione o prefixoJSONArray:ao valor para garantir que os dados sejam tratados como um JSONArray. Sem esse prefixo, não é possível ler os dados do nó upstream.
Exemplo
Dados de entrada:
leftJSON:[{"action":"11","uuid":[{"uuid-key":"1"}]},{"action":"21","uuid":[{"uuid-key":"2"}]}]rightJSON:[{"uuid":[{"uuid-key":"1"}],"host":"196.1.*.*"},{"uuid":[{"uuid-key":"1"}],"host":"196.2.*.*"}]
Valores dos parâmetros:
|
Parâmetro |
Configuração |
|
|
Linha 1 — Esquerda: |
|
Linha 2 — Esquerda: |
|
|
|
Esquerda: |
|
|
Linha 1 — Esquerda: |
|
Linha 2 — Esquerda: |
|
|
Linha 3 — Esquerda: |
Saída:
[
{
"myaction": "11",
"uuid": [{"uuid-key": "1"}],
"myhost": "196.1.*.*"
},
{
"myaction": "11",
"uuid": [{"uuid-key": "1"}],
"myhost": "196.2.*.*"
}
]
A linha comaction: "21"não aparece na saída porque nenhuma linha emrightJSONpossuiuuid-key: "2". UseleftJoinse precisar manter as linhas do lado esquerdo sem correspondência.
leftJoin
Executa uma junção à esquerda usando o nó esquerdo como tabela primária. Todas as linhas do nó esquerdo aparecem na saída. As linhas do nó direito sem correspondência são descartadas; já as linhas do nó esquerdo sem correspondência são incluídas com valores vazios para os campos do nó direito.
Parâmetros
|
Parâmetro |
Descrição |
|
|
Nó de dados primário (esquerdo). O formato deve ser um JSONArray de objetos JSON. JSONArrays aninhados são suportados. |
|
|
Nó de dados secundário (direito). O formato deve ser um JSONArray de objetos JSON. JSONArrays aninhados são suportados. |
|
|
Campos usados para a junção. Formato: |
|
|
Campos a gerar pelo nó esquerdo, com renomeação opcional de chave. Entrada esquerda: novo nome. Entrada direita: nome original do campo. Use |
|
|
Campos a gerar pelo nó direito, com renomeação opcional de chave. Segue a mesma convenção de |
Os dados deleftNodeerightNodedevem ser convertidos para o tipo JSONArray antes do uso.
Exemplo
Dados de entrada:
leftNode:
[
{"action": "11", "uuid": [{"uuid-key": "1"}]},
{"action": "21", "uuid": [{"uuid-key": "2"}]}
]
rightNode:
[
{"uuid": [{"uuid-key": "1"}], "host": "196.1.*.*"},
{"uuid": [{"uuid-key": "1"}], "host": "196.2.*.*"}
]
Valores dos parâmetros:
|
Parâmetro |
Configuração |
|
|
Esquerda: |
|
|
Esquerda: |
|
|
Esquerda: |
Saída:
[
{
"action": "11",
"uuid": [{"uuid-key": "1"}],
"site": "196.1.*.*"
},
{
"action": "11",
"uuid": [{"uuid-key": "1"}],
"site": "196.2.*.*"
},
{
"action": "21",
"uuid": [{"uuid-key": "2"}]
}
]
A linha com action: "21" é mantida mesmo sem uma linha correspondente em rightNode. O campo site está ausente nessa linha.
groupbydata
Agrupa linhas por uma chave e calcula valores agregados para cada grupo. Funciona de maneira semelhante à instrução SQL GROUP BY: linhas com a mesma chave são agrupadas e uma expressão é aplicada para gerar valores de resumo.
Parâmetros
|
Parâmetro |
Descrição |
|
|
Dados a agrupar. Devem ser um JSONArray de objetos JSON. |
|
|
Campo usado para agrupamento. Linhas com o mesmo valor neste campo são colocadas no mesmo grupo. |
|
|
Campos calculados a incluir para cada grupo. Suporta expressões jq aplicadas aos dados agrupados. |
Exemplo
Cenário: Agrupar eventos de segurança por Attack Type, calcular o número total de ataques e identificar o horário do ataque mais recente.
Dados de entrada (inputNode):
[
{"Attack Type": "web shell", "count": "1", "startTime": "1646115503000", "endTime": "1646115503000", "securityEventIds": "330706"},
{"Attack Type": "web shell", "count": "2", "startTime": "1646114346000", "endTime": "1646114346000", "securityEventIds": "330700"},
{"Attack Type": "application whitelist", "count": "1", "startTime": "1646114098000", "endTime": "1646114098000", "securityEventIds": "330699"}
]
Valores dos parâmetros:
|
Parâmetro |
Configuração |
|||||
|
|
|
|||||
|
|
|
map_values(.count) |
add |
length"},{"fieldName":"Latest Attack Time","fieldType":"jq","fieldValue":"[.datalist[].endTime |
tonumber] |
max"}]` |
As duas expressões jq acima funcionam da seguinte forma:
.datalist | map_values(.count)|add|length— conta o número total de eventos de ataque no grupo[.datalist[].endTime|tonumber]|max— converte os valores deendTimepara números e retorna o máximo (horário mais recente)
Saída:
[
{"Attack Type": "web shell", "Attack Count": 2, "Latest Attack Time": 1646115503000},
{"Attack Type": "application whitelist", "Attack Count": 1, "Latest Attack Time": 1646114098000}
]
concatFieldtoBatch
Divide um campo JSONArray em minilotes e concatena os valores de cada lote em uma string. Suporta separadores, prefixos e sufixos personalizados.
Parâmetros
|
Parâmetro |
Descrição |
|
|
Dados a concatenar. Devem ser um JSONArray de objetos JSON. |
|
|
Número de itens por lote. Por exemplo, |
|
|
Separador inserido entre os valores concatenados. Coloque entre aspas duplas para preservar espaços — por exemplo, |
|
|
Prefixo adicionado ao início de cada string concatenada. |
|
|
Sufixo adicionado ao final de cada string concatenada. |
Exemplo
Cenário: Concatenar valores de Attack Type em grupos de dois, usando " ## " como separador, com o prefixo Prefix e o sufixo Suffix.
Dados de entrada (inputField):
[
{"Attack Type": "web shell"},
{"Attack Type": "web shell"},
{"Attack Type": "web shell"},
{"Attack Type": "application whitelist"},
{"Attack Type": "application whitelist"}
]
Valores dos parâmetros:
|
Parâmetro |
Valor |
|
|
|
|
|
|
|
|
|
|
|
|
Saída:
[
{"concatField": "PrefixWebShellSuffix ## PrefixWebShellSuffix"},
{"concatField": "PrefixWebShellSuffix ## PrefixApplicationWhitelistSuffix"},
{"concatField": "PrefixApplicationWhitelistSuffix"}
]
Os cinco itens de entrada são divididos em lotes de dois (grupos 1 e 2) mais um item restante (grupo 3).
convertToJson
Converte uma string em um objeto JSON. Esta ação realiza apenas conversão de tipo e não modifique os dados.
Se a entrada for uma string JSONArray, todos os elementos são colocados diretamente no
datalist.Se a entrada for uma string JSONObject, ela é tratada como uma única linha no
datalist.
Essa ação é geralmente usada para preparar dados de string upstream antes de passá-los para ações como joindata, leftJoin ou groupbydata, que exigem entrada JSONArray.
uniondata
Combina linhas de vários nós de dados upstream em um único conjunto de dados. Todas as linhas de todos os nós especificados são incluídas — equivalente a um UNION ALL do SQL.
Parâmetros
|
Parâmetro |
Descrição |
|
|
Dados dos nós a combinar. |
Os rótulos da caixa de entrada esquerda (por exemplo,leftJSON,rightJSON) servem apenas como identificadores e não afetam a saída. Adicione o prefixoJSONArray:a cada valor da caixa direita para garantir a leitura correta dos dados dos nós upstream.
Exemplo
Dados de entrada:
left:[{"action":"11","uuid":[{"uuid-key":"1"}]},{"action":"21","uuid":[{"uuid-key":"2"}]}]right:[{"uuid":[{"uuid-key":"1"}],"host":"196.1.*.*"},{"uuid":[{"uuid-key":"1"}],"host":"196.2.*.*"}]
Valores dos parâmetros:
|
Parâmetro |
Configuração |
|
|
Linha 1 — Esquerda: |
|
Linha 2 — Esquerda: |
Saída:
[
{"action": "11", "uuid": [{"uuid-key": "1"}]},
{"action": "21", "uuid": [{"uuid-key": "2"}]},
{"uuid": [{"uuid-key": "1"}], "host": "196.1.*.*"},
{"uuid": [{"uuid-key": "1"}], "host": "196.2.*.*"}
]
formatdata
Transforma e agrega dados de várias fontes em uma nova tabela. Utilize esta ação para crie saídas estruturadas com pares chave-valor explicitamente definidos a partir de valores estáticos ou referências de nós upstream.
Parâmetros
|
Parâmetro |
Descrição |
|
|
Pares chave-valor a incluir na saída. Entrada esquerda: nome do campo. Entrada direita: valor do campo. |
Exemplo
Valores dos parâmetros:
|
Esquerda (nome do campo) |
Direita (valor do campo) |
|
|
|
|
|
|
Saída:
{
"name": "test",
"age": "18"
}