다음을 통해 공유


graph_blast_radius_fl()

적용 대상: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel

경로 또는 에지 데이터에 대한 원본 노드의 Blast Radius(목록 및 점수)를 계산합니다.

graph_blast_radius_fl() 함수는 경로 또는 에지 데이터를 기반으로 각 원본 노드의 Blast Radius를 계산할 수 있는 UDF(사용자 정의 함수). 입력 데이터의 각 행에는 노드와 대상 간의 직접 연결(에지) 또는 둘 사이의 더 긴 다중 홉 경로를 나타낼 수 있는 원본 노드와 대상 노드가 포함됩니다. 경로를 사용할 수 없는 경우 먼저 graph-match() 연산자 또는 graph_path_discovery_fl() 함수를 사용하여 경로를 검색할 수 있습니다. 그런 다음 경로 검색의 출력 위에 graph_blast_radius_fl() 실행할 수 있습니다.

Blast Radius는 특정 원본 노드와 관련 대상의 연결을 나타냅니다. 원본이 액세스할 수 있는 대상이 많을수록 공격자가 손상된 경우 더 많은 효과를 줍니다. 따라서 이름입니다. 폭발 반경이 높은 노드는 잠재적 손상으로 인해 사이버 보안 도메인에서 중요하며 공격자가 높은 가치를 지니고 있습니다. 따라서 폭발 반경이 높은 노드는 경고와 같은 보안 신호를 강화하고 우선 순위를 지정하는 측면에서 그에 따라 보호되어야 합니다.

이 함수는 각 원본에 대해 연결된 대상 목록과 대상 수를 나타내는 점수를 출력합니다. 필요에 따라 각 대상(예: 중요도 또는 비용)에 대해 의미 있는 '가중치'가 있는 경우 가중 점수는 대상 가중치의 합계로 계산됩니다. 또한 표시된 원본의 최대 총 수와 각 목록의 최대 대상 수에 대한 제한은 더 나은 제어를 위한 선택적 매개 변수로 노출됩니다.

통사론

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

구문 규칙에 대해 자세히 알아봅니다.

매개 변수

이름 필수 묘사
sourceIdColumnName string ✔️ 원본 노드 ID(에지 또는 경로)를 포함하는 열의 이름입니다.
targetIdColumnName string ✔️ 대상 노드 ID(에지 또는 경로)를 포함하는 열의 이름입니다.
targetWeightColumnName string 대상 노드의 가중치(예: 중요도)를 포함하는 열의 이름입니다. 관련 가중치가 없으면 가중치 점수는 0과 같습니다. 기본 열 이름은 noWeightsColumn.
resultCountLimit long 반환된 행의 최대 수입니다(내림차순으로 정렬됨). 기본값은 100000입니다.
listedIdsLimit long 각 원본에 대해 나열된 최대 대상 수입니다. 기본값은 50입니다.

함수 정의

다음과 같이 해당 코드를 쿼리 정의 함수로 포함하거나 데이터베이스에 저장된 함수로 만들어 함수를 정의할 수 있습니다.

  • 쿼리 정의
  • 저장된

다음 let 문사용하여 함수를 정의합니다. 권한이 필요하지 않습니다.

중요하다

let 문 자체적으로 실행할 수 없습니다. 테이블 형식 식 문 뒤에합니다. graph_blast_radius_fl()작업 예제를 실행하려면 예제참조하세요.

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.

본보기

다음 예제에서는 호출 연산자 사용하여 함수를 실행합니다.

  • 쿼리 정의
  • 저장된

쿼리 정의 함수를 사용하려면 포함된 함수 정의 후에 호출합니다.

쿼리 실행

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'
)

출력

sourceId blastRadiusList blastRadiusScore blastRadiusScoreWeighted isBlastRadiusListCapped
webapp-prd ["vm-custom","test-machine","hub_router"] 3 4 FALSE
vm-custom ["webapp-prd","server-0126","hub_router"] 3 6 FALSE
test-machine ["vm-custom","hub_router"] 2 3 FALSE
vm-work-1 ["webapp-prd","storage_main_backup"] 2 8 FALSE
backup_prc ["storage_main_backup","storage_DevBox"] 2 6 FALSE
hub_router ["remote_DT","vm-work-2"] 2 2 FALSE
vm-work-2 ["backup_prc"] 1 3 FALSE
device_A1 ["sevice_B2"] 1 2 FALSE
remote_DT ["backup_prc"] 1 3 FALSE
sevice_B2 ["device_A1"] 1 2 FALSE

함수를 실행하면 원본과 대상 간의 연결이 이루어지고 원본별로 대상을 집계합니다. 각 소스에 대해 Blast Radius는 연결된 대상을 점수(일반 및 가중치)와 목록으로 나타냅니다.

출력의 각 행에는 다음 필드가 포함됩니다.

  • sourceId: 관련 열에서 가져온 원본 노드의 ID입니다.
  • blastRadiusList: 원본 노드가 연결된 대상 노드 ID(관련 열에서 가져온) 목록입니다. 목록은 listedIdsLimit 매개 변수의 최대 길이 제한으로 제한됩니다.
  • blastRadiusScore: 점수는 원본이 연결된 대상 노드의 수입니다. 높은 폭발 반경 점수는 원본 노드가 잠재적으로 많은 대상에 액세스할 수 있음을 나타내며 그에 따라 처리해야 합니다.
  • blastRadiusScoreWeighted: 가중치 점수는 선택적 대상 노드의 가중치 열의 합계로, 해당 값(예: 중요도 또는 비용)을 나타냅니다. 이러한 가중치가 있는 경우 값이 높은 대상에 대한 잠재적 액세스로 인해 가중치가 적용된 Blast Radius 점수가 원본 노드 값의 보다 정확한 메트릭이 될 수 있습니다.
  • isBlastRadiusListCapped: listedIdsLimit 매개 변수로 대상 목록이 제한되었는지 여부를 부울 플래그로 표시합니다. true이면 나열된 대상 외에도 원본에서 다른 대상에 액세스할 수 있습니다(blastRadiusScore 수까지).

위의 예제에서는 원본과 대상 간의 연결 위에 graph_blast_radius_fl() 함수를 실행합니다. 출력의 첫 번째 행에서 원본 노드 'webapp-prd'가 세 개의 대상('vm-custom', 'test-machine', 'hub_router')에 연결되어 있음을 확인할 수 있습니다. 입력 데이터 TargetNodeCriticality 열을 대상 가중치로 사용하고 누적 가중치인 4를 가져옵니다. 또한 대상 수가 3이고 기본 목록 제한이 50이므로 모든 대상이 표시되므로 isBlastRadiusListCapped 열의 값은 FALSE입니다.

다중 홉 경로를 사용할 수 없는 경우 원본과 대상 간에 다중 홉 경로를 빌드하고(예: 'graph_path_discovery_fl()')를 실행하여 결과 위에 'graph_blast_radius_fl()'를 실행할 수 있습니다.

출력은 비슷하지만 다중 홉 경로를 통해 계산된 Blast Radius를 반영하므로 관련 대상에 대한 원본 노드의 진정한 연결을 더 잘 나타냅니다. 원본 시나리오와 대상 시나리오 간의 전체 경로(예: 중단)를 찾기 위해 graph_path_discovery_fl() 함수를 관련 원본 및 대상 노드의 필터와 함께 사용할 수 있습니다.

graph_blast_radius_fl() 함수를 사용하여 직접 가장자리 또는 더 긴 경로를 통해 계산된 원본 노드의 Blast Radius를 계산할 수 있습니다. 사이버 보안 도메인에서는 여러 인사이트에 사용할 수 있습니다. 폭발 반지름 점수(일반 및 가중치)는 수비수와 공격자 관점에서 원본 노드의 중요성을 나타냅니다. 폭발 반경이 높은 노드는 그에 따라 보호되어야 합니다(예: 액세스 강화 및 취약성 관리) 이러한 노드의 보안 신호(예: 경고)의 우선 순위를 지정해야 합니다. Blast Radius 목록은 원본과 대상 간의 원치 않는 연결에 대해 모니터링되어야 하며 중단 시나리오에서 사용되어야 합니다(예: 원본의 활성 손상이 있는 경우 원본과 중요한 대상 간의 연결이 끊어져야 합니다).