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

다음에서 지원:

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

이 문서에서는 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를 조인하여 케이스 메타데이터를 이전 활동과 연관시킬 수 있습니다.

  • 다음 예에서는 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))
    

제한사항

조인을 사용할 때는 다음 제한사항이 적용됩니다.

  • 검색에서 쿼리당 최대 2개의 UDM 이벤트를 사용할 수 있습니다.

  • 검색에서 쿼리당 최대 1개의 심전도 이벤트를 사용할 수 있습니다.

  • 쿼리당 최대 2개의 데이터 테이블을 사용할 수 있습니다.

  • 단일 쿼리에서 데이터 테이블, UDM, ECG 이벤트를 함께 조인할 수 없습니다.

  • 최대 쿼리 기간은 90일입니다.

  • 최대 match 기간은 검색의 경우 48시간, 대시보드의 경우 365일입니다.

  • 조인은 사용자 인터페이스와 EventService.UDMSearch API에서 지원되지만 SearchService.UDMSearch API에서는 지원되지 않습니다.

일반적인 사용 사례

이 섹션에는 조인을 사용하는 몇 가지 일반적인 방법이 나열되어 있습니다.

사용자 인증 정보 도용 및 사용 감지

목표: 사용자가 로그인한 후 중요한 시스템 파일을 신속하게 삭제하는 인스턴스를 찾습니다. 이는 계정 탈취 또는 악의적인 내부자 활동을 나타낼 수 있습니다.

조인 유형: 이벤트-이벤트 조인

설명: 이 쿼리는 자체적으로는 의심스럽지 않지만 함께 발생하면 매우 의심스러워지는 두 개의 별도 이벤트를 연결합니다. 먼저 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 전문가에게 문의하여 답변을 받으세요.