검색 및 대시보드에서 조인 적용
조인을 사용하면 여러 소스의 데이터를 상호 연관시켜 조사에 더 많은 컨텍스트를 제공할 수 있습니다. 관련 이벤트, 항목, 기타 데이터를 연결하면 복잡한 공격 시나리오를 조사하고 추세를 시각화할 수 있습니다.
이 문서에서는 Google Security Operations 검색 및 대시보드에서 조인 작업을 사용하는 방법을 설명합니다. 또한 지원되는 조인 유형, 사용 사례, 권장사항도 다룹니다.
조인 만들기
통계 기반 조인만 지원됩니다. 쿼리의 match 섹션에서 정의해야 합니다.
상관관계 시간 창 (일치 창)은 검색을 사용하는지 대시보드를 사용하는지에 따라 다릅니다.
- 검색: 최대 48시간
- 대시보드: 최대 365일 (대부분의 데이터 소스)
필드를 직접 연결하거나 (예: $e1.hostname = $e2.hostname) 자리표시자 변수를 사용하여 조인을 만들 수 있습니다. match 섹션에서 조인을 정의할 때는 자리표시자 변수를 사용해야 합니다.
다음 예에서는 등호 (=)와 공유 자리표시자 변수를 사용하여 두 필드를 조인합니다.
예 1:
events: // Assign a value from the first event to the placeholder variable $user $user = $e1.principal.user.userid // The second assignment creates an implicit join, linking $e2 to $e1 // where the user ID is the same. $user = $e2.principal.user.userid match: $user over 1h condition: $e1 and $e2예 2:
$e1.principal.ip = $ip $e1.metadata.event_type = "USER_LOGIN" $e1.principal.hostname = $host $e2.target.ip = $ip $e2.principal.hostname = "altostrat" $e2.target.hostname = $host match: $ip, $host over 5m
지원되는 조인 유형
이 섹션에서는 사용할 수 있는 다양한 유형의 조인을 설명합니다. 이 섹션의 예에서는 검색에 사용되는 구문을 보여줍니다. 대시보드의 조인에 대한 자세한 내용은 대시보드의 조인을 참고하세요.
이벤트-이벤트 조인
이벤트-이벤트 조인은 서로 다른 두 개의 범용 데이터 모델 (UDM) 이벤트를 연결합니다. 다음 예시 쿼리는 공통 IP 주소를 기반으로 사용자가 상호작용한 호스트 이름 (
altostrat)을 찾기 위해USER_LOGIN이벤트를 다른 이벤트와 연결합니다.$e1.principal.ip = $ip $e1.metadata.event_type = "USER_LOGIN" $e2.target.ip = $ip $e2.principal.hostname = "altostrat" match: $ip over 5m
Event-ECG join
Event-ECG 조인은 UDM 이벤트를 항목 컨텍스트 그래프 (ECG)의 항목과 연결합니다. 다음 예시 쿼리는 1시간 내에 동일한 호스트 이름을 공유하는 엔티티 그래프에서
NETWORK_CONNECTION이벤트와ASSET을 찾습니다.events: $e1.metadata.event_type = "NETWORK_CONNECTION" $g1.graph.metadata.entity_type = "ASSET" $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname $x = $g1.graph.entity.asset.hostname match: $x over 1h condition: $e1 and $g1
데이터 테이블 이벤트 조인
데이터 테이블-이벤트 조인은 UDM 이벤트를 맞춤 데이터 테이블의 항목과 연결합니다. 이는 알려진 악성 IP 주소나 위협 행위자와 같은 사용자 정의 목록에 대해 실시간 이벤트 데이터를 확인하는 데 유용합니다. 다음 예시 쿼리는
NETWORK_CONNECTION이벤트를 데이터 테이블과 조인하여 목록에 있는 특정 IP 주소와 관련된 연결을 찾습니다.$ip = %DATATABLE_NAME.COLUMN_NAME $ip = $e1.principal.ip $e1.metadata.event_type = "NETWORK_CONNECTION" match: $ip over 1h
권장사항
조인 쿼리는 많은 결과를 결합하므로 리소스 집약적일 수 있습니다. 광범위하고 일반적인 필터로 인해 쿼리가 실패할 수 있습니다. 예를 들면 다음과 같습니다.
target.ip != ""metadata.event_type = "NETWORK_CONNECTION"(이 이벤트 유형이 환경에서 매우 일반적인 경우)
쿼리에서 처리해야 하는 총 이벤트 수를 줄이려면 일반 필터를 더 구체적인 필터와 결합하는 것이 좋습니다.
target.ip != ""와 같은 광범위한 필터는 쿼리의 성능을 개선하기 위해 더 구체적인 필터와 함께 사용해야 합니다. 예를 들면 다음과 같습니다.$e1.metadata.log_type = $log $e1.metadata.event_type = "USER_LOGIN" $e1.target.ip != "" $e2.metadata.log_type = $log $e2.principal.ip = "10.0.0.76" $e2.target.hostname != "altostrat" match: $log over 5m
쿼리가 여전히 느린 경우 쿼리의 전체 기간을 줄일 수도 있습니다(예: 30일에서 1주일로).
자세한 내용은 YARA-L 권장사항을 참고하세요.
대시보드에서의 조인
대시보드는 검색보다 더 광범위한 데이터 소스와 더 긴 상관관계 기간을 지원합니다.
지원되는 데이터 소스
대시보드에서 각 YARA-L 접두사를 사용하여 다음 소스의 데이터를 조인할 수 있습니다.
| 프리픽스 | 데이터 소스 |
|---|---|
case |
케이스 및 알림 |
case_history |
케이스 수명 주기 전반의 활동 추세 |
detection |
규칙 감지 및 분석가 의견의 기록 |
ingestion |
로그 볼륨 및 수집 상태 측정항목 |
ioc |
IoC (침해 지표) 일치 |
playbook |
자동 응답 및 플레이북 실행 측정항목 |
ruleset/rules |
활성 규칙 세트에 관한 메타데이터 |
graph |
항목 그래프 데이터 (ECG) |
events |
UDM 이벤트 |
대소문자 구분
기본적으로 대소문자를 구분하지 않는 검색과 달리 대시보드는 대소문자를 구분합니다. 대시보드에서 대소문자를 구분하지 않는 조인 또는 검색을 수행하려면 nocase 수정자를 사용하세요.
예: 케이스 및 case_history 조인
고유한 케이스 ID를 조인하여 케이스 메타데이터를 이전 활동과 연관시킬 수 있습니다.
다음 예에서는
case및case_history데이터 소스를 조인하여 각 우선순위가 높은 케이스의 총 과거 작업 수를 계산합니다.// 1. Establish the Join using a shared placeholder variable ($case_id) $h.case_history.case_response_platform_info.case_id = $case_id $c.case.response_platform_info.response_platform_id = $case_id // 2. Apply Filters $c.case.priority = "PRIORITY_HIGH" // 3. Group the correlated data by the Case ID match: $case_id // 4. Calculate the selected metrics to display on the dashboard outcome: $case_name = array_distinct($c.case.display_name) $total_historical_actions = count($h.case_history.case_activity)
고급 사용 사례: MTTR 계산
평균 해결 시간 (MTTR) 또는 평균 종료 시간(MTTC)과 같은 더 복잡한 측정항목의 경우 다단계 쿼리를 사용할 수 있습니다. 이를 통해 첫 번째 단계에서 각 개별 케이스의 기간을 계산한 다음 최종 결과 블록에서 해당 기간을 전역적으로 평균할 수 있습니다.
다음 쿼리는 '기본 환경'의 모든 케이스에 대해 케이스를 종료하는 데 걸리는 평균 시간 (분)을 계산합니다.
stage stage1 { // 1. Establish the Join $h.case_history.case_response_platform_info.case_id = $case_id $c.case.response_platform_info.response_platform_id = $case_id // 2. Filter by specific environment $c.case.environment = "Default Environment" // 3. Group by Case ID to process per case match: $case_id // 4. Calculate the Time to Close (TTC) for each case individually outcome: $case_close_time = max(if($h.case_history.case_activity = "CLOSE_CASE", $h.case_history.event_time.seconds, 0)) $status = array_distinct($h.case_history.case_activity) // Subtract the very first event time (creation) from the close time $TTC = $case_close_time - min($h.case_history.event_time.seconds) // 5. Filter to ensure the case has a complete lifecycle condition: arrays.contains($status, "CREATE_CASE") and arrays.contains($status, "CLOSE_CASE") } // 6. Global Aggregation: Calculate the Mean (Average) across all processed cases outcome: $case_count = count($stage1.case_id) $MTTC = (math.round(avg($stage1.TTC) / 60))
제한사항
조인을 사용할 때는 다음 제한사항이 적용됩니다.
검색에서 쿼리당 최대 2개의 UDM 이벤트를 사용할 수 있습니다.
검색에서 쿼리당 최대 1개의 심전도 이벤트를 사용할 수 있습니다.
쿼리당 최대 2개의 데이터 테이블을 사용할 수 있습니다.
단일 쿼리에서 데이터 테이블, UDM, ECG 이벤트를 함께 조인할 수 없습니다.
최대 쿼리 기간은 90일입니다.
최대
match기간은 검색의 경우 48시간, 대시보드의 경우 365일입니다.조인은 사용자 인터페이스와
EventService.UDMSearchAPI에서 지원되지만SearchService.UDMSearchAPI에서는 지원되지 않습니다.
일반적인 사용 사례
이 섹션에는 조인을 사용하는 몇 가지 일반적인 방법이 나열되어 있습니다.
사용자 인증 정보 도용 및 사용 감지
목표: 사용자가 로그인한 후 중요한 시스템 파일을 신속하게 삭제하는 인스턴스를 찾습니다. 이는 계정 탈취 또는 악의적인 내부자 활동을 나타낼 수 있습니다.
조인 유형: 이벤트-이벤트 조인
설명: 이 쿼리는 자체적으로는 의심스럽지 않지만 함께 발생하면 매우 의심스러워지는 두 개의 별도 이벤트를 연결합니다. 먼저 USER_LOGIN 이벤트를 찾은 다음 FILE_DELETION 이벤트를 찾습니다. 이러한 user.userid는 짧은 기간의 일반적인 user.userid와 결합됩니다.
샘플 쿼리:
// Event 1: A user successfully logs in $e1.metadata.event_type = "USER_LOGIN" $e1.security_result.action = "ALLOW" $e1.principal.user.userid = $user // Event 2: The same user deletes a critical file $e2.metadata.event_type = "FILE_DELETION" $e2.target.file.full_path = /etc\/passwd|C:\\Windows\\System32\\/ $e2.principal.user.userid = $user match: $user over 10m condition: $e1 and $e2
중요 애셋의 위험한 연결 식별
목표: 애셋 정보로 실시간 네트워크 데이터를 보강하여 외부의 낮은 유병률 도메인과 통신해서는 안 되는 서버 (예: 프로덕션 데이터베이스 서버)의 아웃바운드 연결을 찾습니다.
조인 유형: 이벤트-ECG 조인
설명: 드문 도메인에 대한 단일 네트워크 연결은 우선순위가 높지 않을 수 있습니다. 하지만 이 쿼리는 엔티티 컨텍스트 그래프 (ECG)와 결합하여 해당 이벤트의 중요도를 높입니다. 특히 엔티티 그래프에서 '중요 데이터베이스 서버'로 라벨이 지정된 애셋에서 발생하는 NETWORK_CONNECTION 이벤트를 찾습니다.
샘플 쿼리:
events: $e.metadata.event_type = "NETWORK_CONNECTION" $e.target.domain.prevalence.day_count <= 5 $asset.graph.metadata.entity_type = "ASSET" $asset.graph.entity.asset.labels.value = "Critical Database Server" $e.principal.asset.hostname = $asset.graph.entity.asset.hostname $host = $e.principal.asset.hostname match: $host over 1h condition: $e and $asset
공격자 IOC 추적
목표: 특정 공격자가 사용하는 것으로 알려진 도메인 목록에 대해 모든 실시간 DNS 쿼리를 확인하여 침해 지표 (IoC)를 적극적으로 검색합니다.
조인 유형: 데이터 테이블-이벤트 조인
설명: 위협 인텔리전스 팀은 악성 도메인을 나열하는 ThreatActor_Domains라는 데이터 테이블을 유지합니다. 이 쿼리는 모든 실시간 NETWORK_DNS_QUERY 이벤트를 이 데이터 테이블과 결합합니다. 네트워크의 호스트가 위협 인텔리전스 목록에서 도메인을 확인하려고 하는 인스턴스를 즉시 표시합니다.
샘플 쿼리:
// Datatable: Get the list of malicious domains $domain = %DATATABLE_NAME.COLUMN_NAME // Event: A DNS query is made $e.metadata.event_type = "NETWORK_DNS" $e.network.dns.questions.name = $domain match: $domain over 5m condition: $e
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.