검색에서 조인 사용
조인을 사용하면 여러 소스의 데이터를 상호 연관시켜 조사에 더 많은 컨텍스트를 제공할 수 있습니다. 관련 이벤트, 엔티티, 기타 데이터를 연결하면 복잡한 공격 시나리오를 조사할 수 있습니다.
이 문서에서는 Google Security Operations에서 조인 작업을 사용하는 방법을 설명합니다. 지원되는 조인 유형, 사용 사례, 권장사항도 다룹니다.
조인 만들기
통계 기반 조인만 지원됩니다. 최대 48시간의 상관관계 시간대로 쿼리의 일치 섹션에 정의해야 합니다.
필드를 직접 연결하거나 (예: $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
권장사항
조인 쿼리는 많은 결과를 결합하므로 리소스 집약적일 수 있습니다. 광범위하고 일반적인 필터로 인해 쿼리가 실패할 수 있습니다. 예를 들면 다음과 같습니다.
target.ip != null
metadata.event_type = "NETWORK_CONNECTION"
(환경에서 이 이벤트 유형이 매우 일반적인 경우)
쿼리에서 처리해야 하는 총 이벤트 수를 줄이려면 일반 필터를 더 구체적인 필터와 결합하는 것이 좋습니다. target.ip != null
와 같은 광범위한 필터는 쿼리의 성능을 개선하기 위해 더 구체적인 필터와 함께 사용해야 합니다. 예를 들면 다음과 같습니다.
$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 권장사항을 참고하세요.
제한사항
조인을 사용할 때는 다음 제한사항이 적용됩니다.
쿼리당 최대 2개의 UDM 이벤트를 사용할 수 있습니다.
쿼리당 최대 1개의 ECG 이벤트를 사용할 수 있습니다.
쿼리당 최대 2개의 데이터 테이블을 사용할 수 있습니다.
단일 쿼리에서 데이터 테이블, UDM, ECG 이벤트를 함께 조인할 수 없습니다.
최대 쿼리 기간은 90일입니다.
최대
match
시간 범위는 48시간입니다.조인은 사용자 인터페이스와
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 = $ip = %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 전문가로부터 답변을 받으세요.