검색 및 대시보드에서 조인 적용

다음에서 지원:

조인은 여러 소스의 데이터를 상호 연결하여 조사에 더 많은 컨텍스트를 제공하는 데 도움이 됩니다. 관련 이벤트, 항목, 기타 데이터를 연결하면 복잡한 공격 시나리오를 조사하고 추세를 시각화할 수 있습니다.

이 문서에서는 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) 이벤트를 연결합니다. 다음 예시 쿼리는 공통 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
    

이벤트-ECG 조인

  • 이벤트-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를 조인하여 케이스 메타데이터를 기록 활동과 상호 연결할 수 있습니다.

  • 다음 예에서는 casecase_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-UDMUDM-항목 31일 대용량 원격 분석 쿼리
케이스-CaseHistory 90일 수명 주기 추적 쿼리
기타 지원되는 구성 최대 365일 UDM 또는 측정항목 기반 소스 (예: 수집 측정항목)의 대체

데이터 소스 및 테이블 한도

단일 쿼리에서 조인할 수 있는 최대 데이터 소스 및 테이블 수는 검색 또는 대시보드를 사용하는지 여부에 따라 다릅니다.

검색 제약사항

  • 쿼리당 최대 2개의 UDM 이벤트 를 사용할 수 있습니다.
  • 쿼리당 최대 1개의 ECG 이벤트 를 사용할 수 있습니다.
  • 쿼리당 최대 2개의 데이터 테이블 을 사용할 수 있습니다.
  • 데이터 테이블을 항목 컨텍스트 테이블에 직접 조인할 수는 없습니다. UDM 이벤트를 중간 브리지로 사용해야 합니다 (예: $event.target.hostname$datatable.hostname$asset.graph.entity.asset.hostname과 모두 상호 연결).

대시보드 제약사항

조인 유형 최대 이벤트 테이블 (UDM 또는 데이터 테이블) 최대 항목 테이블
다중 이벤트 (UDM-UDM) 2 해당 사항 없음
UDM-항목 2 1
UDM-데이터 테이블 2 해당 사항 없음
다단계 쿼리 2 1

성능 및 가드레일

시스템은 과도한 리소스 소비를 위해 복잡한 조인 쿼리를 모니터링합니다. 전반적인 환경 성능을 보호하기 위해 시스템은 리소스 안전 한도를 초과하는 쿼리를 자동으로 일시중지하거나 격리할 수 있습니다.

쿼리가 실패하거나 리소스 한도를 초과했음을 나타내는 오류를 반환하는 경우 다음 최적화를 시도해 보세요.

  • 쿼리 기간을 좁힙니다.
  • 조인이 발생하기 전에 데이터 세트 크기를 줄이기 위해 더 구체적인 필터를 추가합니다.
  • 집계를 간소화합니다.

API 및 쿼리 유형 제약사항

도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.