다음을 통해 공유


graph_exposure_perimeter_fl()

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

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

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

노출 경계는 관련 원본 노드에서 특정 대상의 접근성을 나타냅니다. 대상에 액세스할 수 있는 원본이 많을수록 공격자가 잠재적인 손상에 노출될수록 이름입니다. 노출 경계가 높은 노드는 불법에 도달할 가능성이 높고 공격자가 높은 가치를 지니고 있기 때문에 사이버 보안 도메인에서 중요합니다. 따라서 노출 경계가 높은 노드는 경계를 강화하고 모니터링하는 측면에서 적절하게 보호되어야 합니다.

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

통사론

graph_exposure_perimeter_fl( sourceIdColumnName, targetIdColumnName, [sourceWeightColumnName], [resultCountLimit], [listedIdsLimit])

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

매개 변수

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

함수 정의

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

  • 쿼리 정의
  • 저장된

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

중요하다

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

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.

본보기

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

  • 쿼리 정의
  • 저장된

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

쿼리 실행

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

출력

targetId exposurePerimeterList exposurePerimeterScore exposurePerimeterScoreWeighted isExposurePerimeterCapped
hub_router ["vm-custom","webapp-prd","test-machine"] 3 11 FALSE
storage_main_backup ["vm-work-1","backup_prc"] 2 0 FALSE
vm-custom ["webapp-prd","test-machine"] 2 6 FALSE
backup_prc ["vm-work-2","remote_DT"] 2 3 FALSE
webapp-prd ["vm-work-1","vm-custom"] 2 4 FALSE
test-machine ["webapp-prd"] 1 1 FALSE
server-0126 ["vm-custom"] 1 4 FALSE
remote_DT ["hub_router"] 1 0 FALSE
vm-work-2 ["hub_router"] 1 0 FALSE
storage_DevBox ["backup_prc"] 1 0 FALSE
device_A1 ["sevice_B2"] 1 2 FALSE
sevice_B2 ["device_A1"] 1 1 FALSE

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

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

  • targetId: 관련 열에서 가져온 대상 노드의 ID입니다.
  • exposurePerimeterList: 대상 노드에 연결할 수 있는 원본 노드 ID(관련 열에서 가져온) 목록입니다. 목록은 listedIdsLimit 매개 변수의 최대 길이 제한으로 제한됩니다.
  • exposurePerimeterScore: 점수는 대상에 연결할 수 있는 원본 노드의 수입니다. 노출 경계 점수가 높음은 대상 노드가 잠재적으로 많은 원본에서 액세스할 수 있음을 나타내며 그에 따라 처리해야 합니다.
  • exposurePerimeterScoreWeighted: 가중치 점수는 취약성 또는 노출과 같은 값을 나타내는 선택적 원본 노드의 가중치 열의 합계입니다. 이러한 가중치가 있는 경우 가중 노출 경계 점수는 매우 취약하거나 노출된 원본에서의 잠재적 액세스로 인해 대상 노드 값의 보다 정확한 메트릭일 수 있습니다.
  • isExposurePerimeterCapped: sources 목록이 listedIdsLimit 매개 변수로 제한되었는지 여부를 부울 플래그로 표시합니다. true이면 다른 원본은 나열된 원본 외에 대상에 액세스할 수 있습니다(exposurePerimeterScore 수까지).

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

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

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

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