검색 및 대시보드에서 조인 적용
조인을 사용하면 여러 소스의 데이터를 상호 연관시켜 조사에 더 많은 컨텍스트를 제공할 수 있습니다. 관련 이벤트, 항목, 기타 데이터를 연결하면 복잡한 공격 시나리오를 조사하고 추세를 시각화할 수 있습니다.
이 문서에서는 Google SecOps 검색 필드 및 대시보드 패널에서 조인 작업을 사용하는 방법을 설명합니다. 지원되는 조인 유형, 사용 사례, 권장사항을 다룹니다.
조인의 핵심 개념
공유 자리표시자 변수 또는 명시적 동등성 문 (예: $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) 이벤트를 연결합니다. 다음 예시 쿼리는
USER_LOGIN이벤트를 다른 이벤트와 연결하여 공통 IP 주소를 기반으로 사용자가 상호작용한 호스트 이름 (altostrat)을 찾습니다.$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
데이터 테이블과 함께 IN 절 사용
in 절을 사용하여 데이터 표 열에 필드 값이 있는지 확인할 수도 있습니다. 이 구문은 모든 데이터 소스 (예: ioc.type in %abc.type)에서 지원되며 조인에 대한 명시적 자리표시자 변수를 정의하지 않고도 참조 목록을 기반으로 이벤트를 필터링하는 편리한 방법을 제공합니다.
일반적인 사용 사례
이 섹션에는 조인을 사용하는 몇 가지 일반적인 방법이 나와 있습니다.
사용자 인증 정보 도용 및 사용 감지
목표: 사용자가 로그인에 성공한 후 중요한 시스템 파일을 빠르게 삭제하는 인스턴스를 찾습니다. 이는 계정 탈취 또는 악의적인 내부자 활동을 나타낼 수 있습니다.
조인 유형: 이벤트-이벤트 조인
설명: 이 쿼리는 자체적으로는 의심스럽지 않지만 함께 발생하면 매우 의심스러워지는 두 개의 개별 이벤트를 연결합니다. 먼저 USER_LOGIN 이벤트를 찾은 다음 FILE_DELETION 이벤트를 찾습니다. 이러한
는 짧은 기간의 일반적인 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 이벤트를 이 데이터 테이블과 조인합니다. 네트워크의 호스트가 위협 인텔리전스 목록에서 도메인을 확인하려고 하는 인스턴스를 즉시 표시합니다.
공격자 IOC 추적 쿼리
// 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
대시보드에서의 조인
대시보드는 검색보다 광범위한 데이터 소스와 긴 상관관계 기간을 지원합니다. 표준 SQL 쿼리와 달리 YARA-L 2.0은 명시적 JOIN 문을 사용하지 않습니다. 대신 공유 자리표시자 변수를 상호 연관시키거나 다단계 쿼리를 사용하여 데이터 소스를 연결합니다.
대소문자 구분
대시보드 쿼리는 대소문자를 구분합니다. 대시보드에서 대소문자를 구분하지 않는 조인 또는 검색을 수행하려면 nocase 수정자를 사용하세요.
지원되는 데이터 소스
대시보드에서 지원되는 데이터 소스의 조인 조합에서 데이터를 조인할 수 있습니다. (일부 데이터 소스 조합은 단일 쿼리에서 함께 조인할 수 없습니다.)
다중 소스 대시보드 쿼리의 모든 데이터 참조에는 조인된 필드뿐만 아니라 YARA-L 접두사 한정자 (예: $u1)가 포함되어야 합니다. 이렇게 하면 시스템에서 중복되는 데이터 소스 간에 필드 소유권을 올바르게 식별할 수 있습니다.
지원되는 조인 조합
조인을 사용하면 내장 대시보드에서 UDM 이벤트, 항목 컨텍스트, 데이터 테이블을 상호 연관시킬 수 있습니다. 시스템 성능을 유지하려면 쿼리를 작성하기 전에 이 섹션에서 지원되는 조합과 기술적 제한을 검토하세요.
- UDM 이벤트에서 UDM 이벤트로 (다중 이벤트)
- UDM 이벤트와 항목 컨텍스트
- UDM 이벤트에서 데이터 테이블로
케이스-케이스 기록: 이 조합은 정확히 하나의
case소스와 하나의case_history소스로만 엄격하게 제한됩니다. 이 조인에는 다른 데이터 소스를 포함할 수 없습니다.
한도 및 가드레일에 대한 자세한 내용은 기술적 한도 및 제약사항을 참고하세요.
예: 케이스 및 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))
권장사항
조인 쿼리의 성능을 최적화하고 효율적으로 처리되도록 하려면 이벤트 필터링 및 검색 범위 관리에 관한 다음 권장사항을 따르세요.
특정 필터를 사용하여 이벤트 수 줄이기
조인 쿼리는 많은 결과를 결합하므로 리소스 집약적일 수 있습니다.
광범위하고 일반적인 필터로 인해 쿼리가 실패할 수 있습니다. 예를 들면 다음과 같습니다.
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 권장사항을 참고하세요.
기술적 한도 및 제약사항
검색 및 대시보드에서 조인을 사용할 때는 다음과 같은 제한사항 및 한도가 적용됩니다.
일치 기간 및 쿼리 한도
일치 기간은 이벤트가 상관관계를 갖는 특정 기간을 정의합니다. 이는 사용자 인터페이스에서 선택하는 검색 기간과 다릅니다.
검색의 제한사항
검색은 짧은 기간 동안의 실시간 또는 신속한 조사에 최적화되어 있습니다.
| 쿼리 한도 | 사용 |
|---|---|
| 최대 48시간 (일부 쿼리는 더 긴 기간을 지원할 수 있음) | 신속한 조사에서 이벤트의 상관관계 지정 |
대시보드의 제한사항
대시보드는 장기적인 과거 분석을 지원합니다.
| 조인 유형 | 쿼리 한도 | 사용 |
|---|---|---|
| UDM-to-UDM 및 UDM-to-Entity | 31일 | 대량의 원격 분석 쿼리 |
| Case-to-CaseHistory | 90일 | 수명 주기 추적 쿼리입니다. |
| 기타 지원되는 구성 | 최대 365일 | UDM 또는 측정항목 기반 소스 (예: 수집 측정항목)의 대체입니다. |
데이터 소스 및 테이블 한도
단일 쿼리에서 조인할 수 있는 데이터 소스 및 표의 최대 수는 검색을 사용하는지 대시보드를 사용하는지에 따라 다릅니다.
검색 제약 조건
- 쿼리당 최대 2개의 UDM 이벤트를 사용할 수 있습니다.
- 질문당 최대 1개의 심전도 이벤트를 사용할 수 있습니다.
- 쿼리당 최대 2개의 데이터 테이블을 사용할 수 있습니다.
- 데이터 테이블을 항목 컨텍스트 테이블에 직접 조인할 수 없습니다. UDM 이벤트를 중간 브리지로 사용해야 합니다 (예:
$event.target.hostname을$datatable.hostname및$asset.graph.entity.asset.hostname와 모두 상관관계 지정).
대시보드 제약 조건
| 조인 유형 | 최대 이벤트 테이블 (UDM 또는 데이터 테이블) | 최대 항목 테이블 |
|---|---|---|
| 다중 이벤트 (UDM에서 UDM으로) | 2 | 해당 사항 없음 |
| UDM에서 항목으로 | 2 | 1 |
| UDM에서 데이터 테이블로 | 2 | 해당 사항 없음 |
| 다단계 쿼리 | 2 | 1 |
성능 및 가드레일
시스템은 과도한 리소스 소비에 대해 복잡한 조인 쿼리를 모니터링합니다. 전반적인 환경 성능을 보호하기 위해 시스템에서 리소스 안전 기준을 초과하는 쿼리를 자동으로 일시중지하거나 격리할 수 있습니다.
쿼리가 실패하거나 리소스 한도를 초과했음을 나타내는 오류가 반환되면 다음 최적화를 시도해 보세요.
- 쿼리 시간 범위를 좁힙니다.
- 조인이 발생하기 전에 데이터 세트 크기를 줄이려면 더 구체적인 필터를 추가하세요.
- 집계를 간소화합니다.
API 및 쿼리 유형 제약 조건
- 조인은 사용자 인터페이스와
EventService.UDMSearchAPI에서 지원되지만SearchService.UDMSearchAPI에서는 지원되지 않습니다.
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.