외부 조인으로 데이터 상관관계 분석

다음에서 지원:

이 문서에서는 외부 조인 (왼쪽 조인 및 오른쪽 조인)에 대해 설명합니다. 조인 작업은 공통 필드 값을 기반으로 여러 소스의 데이터를 상호 연관시키고 결합하는 데 사용됩니다. 관련 보안 이벤트와 엔티티를 단일하고 포괄적인 뷰로 결합하여 효과적인 위협 감지 및 조사를 제공할 수 있습니다.

두 데이터 소스에 일치하는 항목이 필요한 표준 (내부) 조인과 달리 외부 조인은 다른 쪽에 일치하는 항목이 없더라도 조인의 한쪽에서 모든 레코드를 가져옵니다. 다른 쪽의 일치하지 않는 필드는 일반적으로 null로 채워집니다. 이렇게 하면 일치하는 항목이 없는 데이터가 손실되지 않습니다.

외부 조인 작동 방식

YARA-L 2.0의 외부 조인 개념은 표준 SQL 외부 조인과 동일합니다.

  • 왼쪽 외부 조인은 조인의 왼쪽에 있는 모든 레코드를 유지합니다.

  • 오른쪽 외부 조인은 조인의 오른쪽에 있는 모든 레코드를 유지합니다.

외부 조인 구문 (왼쪽 조인 및 오른쪽 조인)은 match 조건이 있는 쿼리와 없는 쿼리 모두에서 지원됩니다.

왼쪽 외부 조인 이해

왼쪽 외부 조인 (또는 왼쪽 조인)은 left join 키워드의 왼쪽에 있는 데이터 소스의 모든 레코드를 유지합니다.

  • 왼쪽 레코드에 오른쪽 이벤트의 일치 항목이 없으면 오른쪽 이벤트의 필드가 null로 반환됩니다.

  • 자리표시자 의미: match 섹션에 사용된 자리표시자 변수는 전체 결과 세트에서 정확한 데이터 집계를 보장하기 위해 왼쪽 이벤트의 필드를 참조해야 합니다.

이벤트 간 왼쪽 조인 예시

다음 예에서는 동일한 호스트에서 발생하는 후속 네트워크 연결 이벤트와 사용자 로그인 이벤트를 상호 연관시키기 위한 왼쪽 외부 조인을 보여줍니다. left join을 사용하면 모든 USER_LOGIN 이벤트가 결과 집합에 보존됩니다. 일치하는 NETWORK_CONNECTION 이벤트 ($e2)가 발견되면 데이터가 결합됩니다. 일치하는 항목이 없으면 $e2 필드는 null입니다.


$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
left join $e1.principal.hostname = $e2.principal.hostname

왼쪽 이벤트 정의

다음 쿼리 예시에서는 조인의 왼쪽 ($e1)을 정의합니다. 이는 최종 결과에 보존되는 이벤트 집합입니다.

$e1.metadata.event_type = "USER_LOGIN"

다음 표는 초기 사용자 로그인 이벤트 집합을 식별하는 쿼리 결과를 나타냅니다.

이벤트 유형 기본 호스트 이름 IP 주소
USER_LOGIN workstation-01 192.168.1.101
USER_LOGIN laptop-hr-02 192.168.1.102
USER_LOGIN server-db-03 10.0.0.50
USER_LOGIN kiosk-4 192.168.1.104

올바른 이벤트 정의

다음 쿼리 예시에서는 조인의 오른쪽 ($e2)을 정의합니다. 이는 왼쪽 이벤트와 일치하는 이벤트 세트입니다.

$e2.metadata.event_type = "NETWORK_CONNECTION"

다음 표는 일치에 사용할 수 있는 네트워크 연결 이벤트 집합을 나타냅니다.

이벤트 유형 기본 호스트 이름 IP 주소
NETWORK_CONNECTION workstation-01 192.168.1.101
NETWORK_CONNECTION laptop-hr-02 192.168.1.101
NETWORK_CONNECTION kiosk-4 203.0.113.3

이벤트 참여

경기 섹션이 있는 경우

다음 예는 principal.hostname 필드에서 왼쪽 외부 조인을 사용하는 일치 쿼리를 보여줍니다.


  $e1.metadata.event_type = "USER_LOGIN"

  $e2.metadata.event_type = "NETWORK_CONNECTION"

  left join $e1.principal.hostname = $e2.principal.hostname

  $host = $e1.principal.hostname

  match:
    $host over 5m

  • 왼쪽 외부 조인을 사용하면 모든 USER_LOGIN 이벤트 ($e1)가 최종 결과 집합에 포함됩니다.

  • 자리표시자 $host에 $e1.principal.hostname의 값이 할당됩니다. 왼쪽 외부 조인은 이벤트 $e1의 존재를 보장하여 집계를 위해 $host 변수가 항상 채워지도록 합니다.

  • 이 규칙은 5분 기간 동안 호스트별로 결과를 집계합니다.

결과 결합

결과 데이터에는 두 이벤트의 조합이 표시됩니다. 왼쪽 테이블 ($e1)의 모든 레코드가 유지되고 일치하는 호스트 이름이 없는 경우 (예: server-db-03) 오른쪽 테이블 ($e2)의 필드가 null로 설정됩니다.

이벤트 유형 ($e1) 주 호스트 이름 ($host) IP 주소 ($e1) 이벤트 유형 ($e2) IP 주소 ($e2) 일치 상태
USER_LOGIN workstation-01 192.168.1.101 NETWORK_CONNECTION 192.168.1.101 일치 항목 있음
USER_LOGIN laptop-hr-02 192.168.1.102 NETWORK_CONNECTION 192.168.1.101 일치 항목 있음
USER_LOGIN server-db-03 10.0.0.50 null null 일치하는 항목 없음
USER_LOGIN kiosk-4 192.168.1.104 NETWORK_CONNECTION 203.0.113.3 일치 항목 있음

왼쪽 조인 쿼리 예

이 섹션에서는 왼쪽 조인 쿼리의 예를 제공합니다.

일치 조건으로 조인

  • 이벤트-엔티티

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    $g1.graph.metadata.entity_type = "ASSET"
    left join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
    $host = $e1.principal.asset.hostname
    
    match:
      $host over 5m
    
    
  • Event-datatable

    
    $host = $e1.principal.hostname
    left join $e1.principal.hostname = %all_dt_column_types.hostname
    
    match:
      $host by 5m
    

일치 조건이 없는 조인

  • Event-event

    
    $e1.metadata.event_type = "USER_LOGIN"
    $e1.principal.ip = "114.241.96.87"
    $e2.metadata.event_type = "NETWORK_CONNECTION"
    left join $e1.principal.hostname = $e2.principal.hostname
    
    
  • 이벤트-엔티티

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    $g1.graph.metadata.entity_type = "ASSET"
    left join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
    $host = $e1.principal.asset.hostname
    
    
  • Event-datatable

    
    $host = $e1.principal.hostname
    left join $e1.principal.hostname = %all_dt_column_types.hostname
    
    

오른쪽 외부 조인

오른쪽 외부 조인 (또는 오른쪽 조인)은 right join 키워드의 오른쪽에 있는 데이터 소스의 모든 레코드를 보존합니다.

  • 오른쪽 이벤트의 레코드가 왼쪽 이벤트에 일치하지 않으면 왼쪽 이벤트의 필드가 null로 반환됩니다.

  • 자리표시자 의미: match 섹션에 사용된 자리표시자 변수는 전체 결과 세트에서 정확한 데이터 집계를 보장하기 위해 올바른 이벤트의 필드를 참조해야 합니다.

이벤트 간 오른쪽 조인 예

다음 예에서는 동일한 호스트에서 발생하는 후속 네트워크 연결 이벤트와 사용자 로그인 이벤트를 상호 연관시키는 right outer join를 보여줍니다. right join는 모든 NETWORK_CONNECTION 이벤트가 결과 집합에 유지되도록 합니다. 일치하는 USER_LOGIN 이벤트가 발견되면 데이터가 조인됩니다. 일치하는 항목이 없으면 $e1 필드는 null입니다.


$e1.metadata.event_type = "USER_LOGIN"

$e2.metadata.event_type = "NETWORK_CONNECTION"

right join $e1.principal.hostname = $e2.principal.hostname

왼쪽 이벤트 정의

다음 쿼리는 최종 결과의 선택적 이벤트 집합인 조인의 왼쪽 ($e1)을 정의합니다.


$e1.metadata.event_type = "USER_LOGIN"

다음 표는 쿼리 결과를 나타내며 초기 사용자 로그인 이벤트 집합을 식별합니다.

이벤트 유형 기본 호스트 이름 IP 주소
USER_LOGIN workstation-01 192.168.1.101
USER_LOGIN laptop-hr-02 192.168.1.102
USER_LOGIN server-db-03 10.0.0.50

올바른 이벤트 정의

다음 쿼리는 조인의 오른쪽 ($e2)을 정의합니다. 이는 최종 결과에 보존되는 이벤트 집합입니다.


$e2.metadata.event_type = "NETWORK_CONNECTION"

다음 표는 일치에 사용할 수 있는 네트워크 연결 이벤트 집합을 나타냅니다.

이벤트 유형 기본 호스트 이름 IP 주소
NETWORK_CONNECTION workstation-01 192.168.1.101
NETWORK_CONNECTION laptop-hr-02 192.168.1.101
NETWORK_CONNECTION vm-unauth-05 203.0.113.3

이벤트 참여

다음 예는 principal.hostname 필드에 대한 오른쪽 외부 조인이 있는 일치 쿼리를 보여줍니다.


$e1.metadata.event_type = "USER_LOGIN"

$e2.metadata.event_type = "NETWORK_CONNECTION"

right join $e1.principal.hostname = $e2.principal.hostname

$host = $e1.principal.hostname

match:
  $host over 5m

  • 오른쪽 외부 조인을 사용하면 모든 NETWORK_CONNECTION 이벤트($e2)가 최종 결과 집합에 포함됩니다.

  • 자리표시자 $host$e2.principal.hostname의 값이 할당됩니다. 오른쪽 외부 조인은 이벤트 $e2가 있는지 확인하여 $host 변수가 항상 집계되도록 합니다.

  • 이 규칙은 5분 기간 동안 호스트별로 결과를 집계합니다.

결과 결합

결과 데이터 세트에는 두 이벤트의 조합이 표시됩니다. 오른쪽 테이블 ($e2)의 모든 레코드가 유지되고 일치하는 호스트 이름이 없는 경우 (예: vm-unauth-05) 왼쪽 테이블 ($e1)의 필드가 null로 설정됩니다.

이벤트 유형 ($e1) 주 호스트 이름 ($e1) IP 주소 ($e1) 이벤트 유형 ($e2) 기본 호스트 이름 ($host) IP 주소 ($e2) 일치 상태
USER_LOGIN workstation-01 192.168.1.101 NETWORK_CONNECTION workstation-01 192.168.1.101 일치 항목 있음
USER_LOGIN laptop-hr-02 192.168.1.102 NETWORK_CONNECTION laptop-hr-02 192.168.1.101 일치 항목 있음
null null null NETWORK_CONNECTION vm-unauth-05 203.0.113.4 일치하는 항목 없음

오른쪽 조인 쿼리 예

이 섹션에서는 오른쪽 조인 쿼리의 예를 제공합니다.

일치 조건으로 조인

  • Event-event

    
    $e1.metadata.event_type = "USER_LOGIN"
    
    $e2.metadata.event_type = "NETWORK_CONNECTION"
    
    right join $e1.principal.hostname = $e2.principal.hostname
    
    $host = $e2.principal.hostname
    
    match:
      $host over 5m
    
    
  • 엔티티-이벤트

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    
    $g1.graph.metadata.entity_type = "ASSET"
    
    right join $g1.graph.entity.asset.hostname = $e1.principal.asset.hostname
    
    $host = $e1.principal.asset.hostname
    
    match:
      $host over 5m
    
    
  • Datatable-event

    
    $host = $e1.principal.hostname
    
    right join %all_dt_column_types.hostname = $e1.principal.hostname
    
    match:
      $host by 5m
    
    

일치 조건이 없는 조인

  • Event-event

    
    $e1.metadata.event_type = "USER_LOGIN"
    
    $e1.principal.ip = "114.241.96.87"
    
    $e2.metadata.event_type = "NETWORK_CONNECTION"
    
    right join $e1.principal.hostname = $e2.principal.hostname
    
    
  • 엔티티-이벤트

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    
    $g1.graph.metadata.entity_type = "ASSET"
    
    right join $g1.graph.entity.asset.hostname = $e1.principal.asset.hostname
    
    $host = $e1.principal.asset.hostname
    
    
  • Datatable-event

    
    $host = $e1.principal.hostname
    
    right join %all_dt_column_types.hostname = $e1.principal.hostname
    
    

제한사항

외부 조인을 만들 때는 다음 제한사항을 고려하세요.

  • 전체 외부 조인 (왼쪽 조인과 오른쪽 조인을 함께 사용)은 지원되지 않습니다.

  • 일치하지 않는 조인의 쿼리 기간은 최대 14일로 제한됩니다.

  • 두 컨텍스트 소스 (예: 항목을 데이터 테이블에 직접)를 직접 조인할 수는 없습니다.

  • 기본 통합 데이터 모델 (UDM) 이벤트는 외부 조인의 보존된 측면이어야 합니다. 기본 이벤트가 'null 허용' 측에 있으면 쿼리가 유효하지 않습니다.

    • 이벤트-엔티티 조인은 왼쪽 조인이어야 합니다. 이렇게 하면 이벤트 ($e1)가 올바르게 유지됩니다.

    • 엔티티-이벤트 조인은 오른쪽 조인이어야 합니다. 이렇게 하면 이벤트 ($e1)가 올바르게 유지됩니다.

    다음 예시는 UDM 이벤트 ($e1)가 왼쪽에 있지만 오른쪽 조인에서 오른쪽 ($g1)을 유지하므로 잘못되었습니다. UDM 이벤트가 유지되어야 한다는 규칙을 위반합니다.

    
    // Invalid query
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    $g1.graph.metadata.entity_type = "ASSET"
    right join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
    
    

권장사항

외부 조인 쿼리에서 성능 저하 및 쿼리 시간 초과를 방지하려면 구체적이고 좁은 필터를 사용하세요.

예를 들어 다음과 같은 광범위한 쿼리가 있습니다.


$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
right join $e1.principal.hostname = $e2.principal.hostname

다음과 같은 특정 기준을 추가하여 최적화할 수 있습니다.


$e1.metadata.event_type = "USER_LOGIN"
$e1.principal.ip = "121.121.121.121"
$e1.principal.user.userid = "alex"
$e2.metadata.event_type = "NETWORK_CONNECTION"
$e2.src.hostname = "altostrat.com"
$e1.principal.hostname = $e2.principal.hostname

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