Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Calcule o Perímetro de Exposição (lista e pontuação) de nós de destino sobre dados de caminho ou borda.
A função graph_exposure_perimeter_fl() é uma UDF (função definida pelo usuário) que permite calcular o Perímetro de Exposição de cada um dos nós de destino com base em dados de caminhos ou 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_exposure_perimeter_fl() pode ser executado sobre a saída da descoberta de caminho.
O Perímetro de Exposição representa a acessibilidade de um destino específico de nós de origem relevantes. Quanto mais fontes puderem acessar o destino, mais expostas elas estarão em potencial comprometimento pelo invasor , daí o nome. Nós com perímetro de alta exposição são importantes no domínio de segurança cibernética devido à probabilidade de serem atingidos de forma ilegítima e serem altamente valorizados pelos invasores. Assim, os nós com perímetro de alta exposição devem ser protegidos adequadamente em termos de proteção e monitoramento de seu perímetro.
A função gera uma lista de fontes conectadas que podem atingir cada destino e também uma pontuação que representa o número das fontes. Opcionalmente, caso haja um "peso" significativo para cada fonte (como vulnerabilidade ou exposição), uma pontuação ponderada é calculada como uma soma dos pesos das fontes. Além disso, os limites para o número total máximo de destinos mostrados e o número máximo de fontes em cada lista são expostos como parâmetros opcionais para melhor controle.
Sintaxe
graph_exposure_perimeter_fl(
sourceIdColumnName, targetIdColumnName, [sourceWeightColumnName], [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). |
| sourceWeightColumnName | string |
O nome da coluna que contém os pesos dos nós de origem (como vulnerabilidade). 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:
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_exposure_perimeter_fl(), consulte Exemplo.
let exposure_perimeter_fl = (T:(*), sourceIdColumnName:string, targetIdColumnName:string, sourceWeightColumnName:string= 'noWeightsColumn'
, resultCountLimit:long = 100000, listedIdsLimit:long = 50)
{
let paths = (
T
| extend sourceId = column_ifexists(sourceIdColumnName, '')
| extend targetId = column_ifexists(targetIdColumnName, '')
| extend sourceWeight = tolong(column_ifexists(sourceWeightColumnName, 0))
);
let aggregatedPaths = (
paths
| sort by targetId, sourceWeight desc
| summarize exposurePerimeterList = array_slice(make_set_if(sourceId, isnotempty(sourceId)), 0, (listedIdsLimit - 1))
, exposurePerimeterScore = dcountif(sourceId, isnotempty(sourceId))
, exposurePerimeterScoreWeighted = sum(sourceWeight)
by targetId
| extend isExposurePerimeterCapped = (exposurePerimeterScore > listedIdsLimit)
);
aggregatedPaths
| top resultCountLimit by exposurePerimeterScore 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.
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, SourceNodeVulnerability:int)[
'vm-work-1', 'webapp-prd', 0,
'vm-custom', 'webapp-prd', 4,
'webapp-prd', 'vm-custom', 1,
'webapp-prd', 'test-machine', 1,
'vm-custom', 'server-0126', 4,
'vm-custom', 'hub_router', 4,
'webapp-prd', 'hub_router', 2,
'test-machine', 'vm-custom', 5,
'test-machine', 'hub_router', 5,
'hub_router', 'remote_DT', 0,
'vm-work-1', 'storage_main_backup', 0,
'hub_router', 'vm-work-2', 0,
'vm-work-2', 'backup_prc', 1,
'remote_DT', 'backup_prc', 2,
'backup_prc', 'storage_main_backup', 0,
'backup_prc', 'storage_DevBox', 0,
'device_A1', 'sevice_B2', 1,
'sevice_B2', 'device_A1', 2
];
let exposure_perimeter_fl = (T:(*), sourceIdColumnName:string, targetIdColumnName:string, sourceWeightColumnName:string = 'noWeightsColumn'
, resultCountLimit:long = 100000, listedIdsLimit:long = 50)
{
let paths = (
T
| extend sourceId = column_ifexists(sourceIdColumnName, '')
| extend targetId = column_ifexists(targetIdColumnName, '')
| extend sourceWeight = tolong(column_ifexists(sourceWeightColumnName, 0))
);
let aggregatedPaths = (
paths
| sort by targetId, sourceWeight desc
| summarize exposurePerimeterList = array_slice(make_set_if(sourceId, isnotempty(sourceId)), 0, (listedIdsLimit - 1))
, exposurePerimeterScore = dcountif(sourceId, isnotempty(sourceId))
, exposurePerimeterScoreWeighted = sum(sourceWeight)
by targetId
| extend isExposurePerimeterCapped = (exposurePerimeterScore > listedIdsLimit)
);
aggregatedPaths
| top resultCountLimit by exposurePerimeterScore desc
};
connections
| invoke exposure_perimeter_fl(sourceIdColumnName = 'SourceNodeName'
, targetIdColumnName = 'TargetNodeName'
, sourceWeightColumnName = 'SourceNodeVulnerability'
)
de saída
| ID do alvo | exposurePerimeterList | exposurePerimeterScore | exposurePerimeterScoreWeighted | isExposurePerimeterCapped |
|---|---|---|---|---|
| hub_router | ["vm-custom","webapp-prd","test-machine"] | 3 | 11 | FALSO |
| storage_main_backup | ["vm-work-1","backup_prc"] | 2 | 0 | FALSO |
| vm-custom | ["webapp-prd","test-machine"] | 2 | 6 | FALSO |
| backup_prc | ["vm-work-2","remote_DT"] | 2 | 3 | FALSO |
| webapp-prd | ["vm-work-1","vm-custom"] | 2 | 4 | FALSO |
| test-machine | ["webapp-prd"] | 1 | 1 | FALSO |
| server-0126 | ["vm-custom"] | 1 | 4 | FALSO |
| remote_DT | ["hub_router"] | 1 | 0 | FALSO |
| vm-work-2 | ["hub_router"] | 1 | 0 | FALSO |
| storage_DevBox | ["backup_prc"] | 1 | 0 | FALSO |
| device_A1 | ["sevice_B2"] | 1 | 2 | FALSO |
| sevice_B2 | ["device_A1"] | 1 | 1 | FALSO |
A execução da função agrega as conexões ou caminhos entre fontes e destinos por destino. Para cada destino, o Perímetro de Exposição representa as fontes que podem se conectar a ele como pontuação (regular e ponderada) e lista.
Cada linha na saída contém os seguintes campos:
-
targetId: ID do nó de destino obtido da coluna relevante. -
exposurePerimeterList: uma lista de IDs de nós de origem (obtidas de coluna relevante) que podem se conectar ao nó de destino. A lista é limitada ao limite máximo de comprimento do parâmetro listedIdsLimit. -
exposurePerimeterScore: a pontuação é a contagem de nós de origem que podem se conectar ao destino. A pontuação de Perímetro de Alta Exposição indica que o nó de destino pode ser potencialmente acessado de muitas fontes e deve ser tratado adequadamente. -
exposurePerimeterScoreWeighted: a pontuação ponderada é a soma da coluna de peso dos nós de origem opcionais, representando seu valor , como vulnerabilidade ou exposição. Se esse peso existir, a pontuação ponderada do Perímetro de Exposição poderá ser uma métrica mais precisa do valor do nó de destino devido ao acesso potencial de fontes altamente vulneráveis ou expostas. -
isExposurePerimeterCapped: sinalizador booliano se a lista de fontes foi limitada pelo parâmetro listedIdsLimit. Se for verdade, outras fontes poderão acessar o destino além das listadas (até o número de exposurePerimeterScore).
No exemplo acima, executamos a função graph_exposure_perimeter_fl() sobre conexões entre fontes e destinos. Na primeira linha da saída, podemos ver que o nó de destino 'hub_router' pode ser conectado de três fontes ('vm-custom', 'webapp-prd', 'test-machine'). Usamos a coluna SourceNodeVulnerability de dados de entrada como pesos de origem e obtemos um peso cumulativo de 11. Além disso, como o número de fontes é 3 e o limite de lista padrão é 50, todas as fontes são mostradas – portanto, o valor da coluna isExposurePerimeterCapped é FALSE.
Caso os caminhos de vários saltos não estejam disponíveis, podemos criar caminhos de vários saltos entre fontes e destinos (por exemplo, executando 'graph_path_discovery_fl()') e executar 'graph_exposure_perimeter_fl()' sobre os resultados.
A saída é semelhante, mas representa o Perímetro de Exposição calculado sobre caminhos de vários saltos, sendo assim um indicador melhor da verdadeira acessibilidade dos nós de destino de fontes 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_exposure_perimeter_fl() pode ser usada para calcular o Perímetro de Exposição de nós de destino, em bordas diretas ou caminhos mais longos. No domínio de segurança cibernética, ele pode ser usado para várias informações. As pontuações do Perímetro de Exposição (regulares e ponderadas) representam a importância do nó de destino, tanto do ponto de vista dos defensores quanto dos atacantes. Os nós com perímetro de alta exposição, especialmente os críticos, devem ser protegidos adequadamente. Por exemplo, em termos de monitoramento e proteção de acesso. Sinais de segurança, como alertas, devem ser priorizados em fontes que possam acessar esses nós. A lista Perímetro de Exposição deve ser monitorada para conexões indesejadas entre fontes e destinos e usada em cenários de interrupção. Por exemplo, se algumas das fontes foram comprometidas, as conexões entre elas e o destino devem ser interrompidas.