Compartilhar via


graph_blast_radius_fl()

Aplica-se a: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel

Calcule o Raio de Explosão (lista e pontuação) de nós de origem sobre dados de caminho ou borda.

A função graph_blast_radius_fl() é uma UDF (função definida pelo usuário) que permite calcular o Raio de Explosão de cada um dos nós de origem com base em caminhos ou dados de bordas. Cada linha de dados de entrada contém um nó de origem e um nó de destino, que podem representar conexões diretas (bordas) entre nós e destinos ou caminhos de vários saltos mais longos entre eles. Se os caminhos não estiverem disponíveis, primeiro poderemos descobri-los usando a função operador de correspondência de grafo ou graph_path_discovery_fl(). Em seguida, graph_blast_radius_fl() pode ser executado sobre a saída da descoberta de caminho.

Blast Radius representa a conectividade de um nó de origem específico para destinos relevantes. Quanto mais destinos a origem puder acessar, mais efeito ela terá se estiver comprometida pelo invasor , daí o nome. Nós com raio de explosão alto são importantes no domínio de segurança cibernética devido aos possíveis danos que podem causar e a serem altamente valorizados pelos invasores. Assim, os nós com raio de explosão alto devem ser protegidos adequadamente em termos de proteção e priorização de sinais de segurança, como alertas.

A função gera uma lista de destinos conectados para cada origem e também uma pontuação que representa o número dos destinos. Opcionalmente, caso haja um "peso" significativo para cada destino (como criticidade ou custo), uma pontuação ponderada é calculada como uma soma dos pesos dos destinos. Além disso, os limites para o número total máximo de fontes mostradas e o número máximo de destinos em cada lista são expostos como parâmetros opcionais para melhor controle.

Sintaxe

graph_blast_radius_fl( sourceIdColumnName, targetIdColumnName, [targetWeightColumnName], [resultCountLimit], [listedIdsLimit])

Saiba mais sobre convenções de sintaxe.

Parâmetros

Nome Tipo Necessário Descrição
sourceIdColumnName string ✔️ O nome da coluna que contém as IDs do nó de origem (para bordas ou caminhos).
targetIdColumnName string ✔️ O nome da coluna que contém as IDs do nó de destino (para bordas ou caminhos).
targetWeightColumnName string O nome da coluna que contém os pesos dos nós de destino (como a criticidade). Se nenhum peso relevante estiver presente, a pontuação ponderada será igual a 0. O nome da coluna padrão é noWeightsColumn.
resultCountLimit long O número máximo de linhas retornadas (classificadas por pontuação decrescente). O valor padrão é 100000.
listedIdsLimit long O número máximo de destinos listados para cada origem. O valor padrão é 50.

Definição de função

Você pode definir a função inserindo seu código como uma função definida por consulta ou criando-a como uma função armazenada em seu banco de dados, da seguinte maneira:

  • definidos por consulta
  • Armazenados

Defina a função usando a instrução let a seguir. Nenhuma permissão é necessária.

Importante

Uma instrução não pode ser executada por conta própria. Ele deve ser seguido por uma instrução de expressão tabular . Para executar um exemplo de trabalho de graph_blast_radius_fl(), consulte Exemplo.

let graph_blast_radius_fl = (T:(*), sourceIdColumnName:string, targetIdColumnName:string, targetWeightColumnName:string = 'noWeightsColumn'
    , resultCountLimit:long = 100000, listedIdsLimit:long = 50)
{
let paths = (
    T
    | extend sourceId           = column_ifexists(sourceIdColumnName, '')
    | extend targetId           = column_ifexists(targetIdColumnName, '')
    | extend targetWeight       = tolong(column_ifexists(targetWeightColumnName, 0))
);
let aggregatedPaths = (
    paths
    | sort by sourceId, targetWeight desc
    | summarize blastRadiusList = array_slice(make_set_if(targetId, isnotempty(targetId)), 0, (listedIdsLimit - 1))
                , blastRadiusScore = dcountif(targetId, isnotempty(targetId))
                , blastRadiusScoreWeighted = sum(targetWeight)
        by sourceId
    | extend isBlastRadiusListCapped = (blastRadiusScore > listedIdsLimit)
);
aggregatedPaths
| top resultCountLimit by blastRadiusScore desc
};
// Write your query to use the function here.

Exemplo

O exemplo a seguir usa o operador de invocação para executar a função.

  • definidos por consulta
  • Armazenados

Para usar uma função definida por consulta, invoque-a após a definição da função inserida.

executar o de consulta

let connections = datatable (SourceNodeName:string, TargetNodeName:string, TargetNodeCriticality:int)[						
    'vm-work-1',            'webapp-prd', 	          3,
    'vm-custom',        	'webapp-prd', 	          3,
    'webapp-prd',           'vm-custom', 	          1,
    'webapp-prd',       	'test-machine', 	      1,
    'vm-custom',        	'server-0126', 	          1,
    'vm-custom',        	'hub_router', 	          2,
    'webapp-prd',       	'hub_router', 	          2,
    'test-machine',       	'vm-custom',              1,
    'test-machine',        	'hub_router', 	          2,
    'hub_router',           'remote_DT', 	          1,
    'vm-work-1',            'storage_main_backup', 	  5,
    'hub_router',           'vm-work-2', 	          1,
    'vm-work-2',        	'backup_prc', 	          3,
    'remote_DT',            'backup_prc', 	          3,
    'backup_prc',           'storage_main_backup', 	  5,
    'backup_prc',           'storage_DevBox', 	      1,
    'device_A1',            'sevice_B2', 	          2,
    'sevice_B2',            'device_A1', 	          2
];
let graph_blast_radius_fl = (T:(*), sourceIdColumnName:string, targetIdColumnName:string, targetWeightColumnName:string = 'noWeightsColumn'
    , resultCountLimit:long = 100000, listedIdsLimit:long = 50)
{
let paths = (
    T
    | extend sourceId           = column_ifexists(sourceIdColumnName, '')
    | extend targetId           = column_ifexists(targetIdColumnName, '')
    | extend targetWeight       = tolong(column_ifexists(targetWeightColumnName, 0))
);
let aggregatedPaths = (
    paths
    | sort by sourceId, targetWeight desc
    | summarize blastRadiusList = array_slice(make_set_if(targetId, isnotempty(targetId)), 0, (listedIdsLimit - 1))
                , blastRadiusScore = dcountif(targetId, isnotempty(targetId))
                , blastRadiusScoreWeighted = sum(targetWeight)
        by sourceId
    | extend isBlastRadiusListCapped = (blastRadiusScore > listedIdsLimit)
);
aggregatedPaths
| top resultCountLimit by blastRadiusScore desc
};
connections
| invoke graph_blast_radius_fl(sourceIdColumnName 		= 'SourceNodeName'
                            , targetIdColumnName 		= 'TargetNodeName'
                            , targetWeightColumnName 	= 'TargetNodeCriticality'
)

de saída

código-fonte blastRadiusList blastRadiusScore blastRadiusScoreWeighted isBlastRadiusListCapped
webapp-prd ["vm-custom","test-machine","hub_router"] 3 4 FALSO
vm-custom ["webapp-prd","server-0126","hub_router"] 3 6 FALSO
test-machine ["vm-custom","hub_router"] 2 3 FALSO
vm-work-1 ["webapp-prd","storage_main_backup"] 2 oito FALSO
backup_prc ["storage_main_backup","storage_DevBox"] 2 6 FALSO
hub_router ["remote_DT","vm-work-2"] 2 2 FALSO
vm-work-2 ["backup_prc"] 1 3 FALSO
device_A1 ["sevice_B2"] 1 2 FALSO
remote_DT ["backup_prc"] 1 3 FALSO
sevice_B2 ["device_A1"] 1 2 FALSO

A execução da função agrega as conexões ou caminhos entre fontes e destinos por origem. Para cada origem, o Blast Radius representa os destinos conectados como pontuação (regular e ponderada) e lista.

Cada linha na saída contém os seguintes campos:

  • sourceId: ID do nó de origem extraído da coluna relevante.
  • blastRadiusList: uma lista de IDs de nós de destino (obtidas da coluna relevante) à qual o nó de origem está conectado. A lista é limitada ao limite máximo de comprimento do parâmetro listedIdsLimit.
  • blastRadiusScore: a pontuação é a contagem de nós de destino aos quais a origem está conectada. A pontuação de raio de explosão alta indica que o nó de origem pode potencialmente acessar muitos destinos e deve ser tratado adequadamente.
  • blastRadiusScoreWeighted: a pontuação ponderada é a soma da coluna de peso dos nós de destino opcionais, representando seu valor , como criticidade ou custo. Se esse peso existir, a pontuação de Raio de Explosão ponderada poderá ser uma métrica mais precisa do valor do nó de origem devido ao acesso potencial a destinos de alto valor.
  • isBlastRadiusListCapped: sinalizador booliano se a lista de destinos foi limitada pelo parâmetro listedIdsLimit. Se for verdade, outros destinos poderão ser acessados da origem, além do listado (até o número de blastRadiusScore).

No exemplo acima, executamos a função graph_blast_radius_fl() sobre conexões entre fontes e destinos. Na primeira linha da saída, podemos ver que o nó de origem 'webapp-prd' está conectado a três destinos ('vm-custom', 'test-machine', 'hub_router'). Usamos a coluna TargetNodeCriticality de dados de entrada como pesos de destino e obtemos um peso cumulativo de 4. Além disso, como o número de destinos é 3 e o limite de lista padrão é 50, todos os destinos são mostrados , portanto, o valor da coluna isBlastRadiusListCapped é FALSE.

Se os caminhos de vários saltos não estiverem disponíveis, poderemos criar caminhos de vários saltos entre fontes e destinos (por exemplo, executando 'graph_path_discovery_fl()') e executar 'graph_blast_radius_fl()' sobre os resultados.

A saída é semelhante, mas representa o Raio de Explosão calculado sobre caminhos de vários saltos, sendo assim um indicador melhor da conectividade verdadeira dos nós de origem com destinos relevantes. Para localizar os caminhos completos entre cenários de origem e de destino (por exemplo, para interrupção), graph_path_discovery_fl() função pode ser usada com filtros em nós de origem e de destino relevantes.

A função graph_blast_radius_fl() pode ser usada para calcular o Raio de Explosão de nós de origem, calculado em bordas diretas ou caminhos mais longos. No domínio de segurança cibernética, ele pode fornecer várias informações. As pontuações do Raio de Explosão, regulares e ponderadas, representam a importância de um nó de origem das perspectivas dos defensores e dos atacantes. Nós com um raio de explosão alto devem ser protegidos adequadamente, por exemplo, em termos de proteção de acesso e gerenciamento de vulnerabilidades. Sinais de segurança, como alertas nesses nós, devem ser priorizados. A lista Raio de Explosão deve ser monitorada para conexões indesejadas entre fontes e destinos e usada em cenários de interrupção. Por exemplo, se a origem foi comprometida, as conexões entre ela e destinos importantes deverão ser interrompidas.