복합 감지 규칙 구성

다음에서 지원:

이 문서에서는 Google Security Operations 플랫폼 내에서 복합 규칙을 빌드하는 방법에 관한 기술 가이드를 제공합니다. 이 프로세스에는 여러 YARA-L 2.0 규칙을 연결하여 복잡한 공격 패턴을 식별하는 작업이 포함됩니다. 복합 감지는 표준 단일 이벤트 규칙과 동일한 기본 문법을 유지하면서 멀티 이벤트 규칙으로 구성됩니다. 자세한 내용은 복합 감지 개요를 참고하세요.

규칙 구조 이해하기

복합 감지 규칙은 항상 멀티 이벤트 규칙이며 단일 이벤트 규칙과 동일한 구조와 문법을 따릅니다.

복합 규칙에는 다음과 같은 필수 구성요소가 있습니다.

  • events 섹션: 규칙이 분석하는 특정 감지 또는 이벤트인 입력을 정의합니다.

  • match 섹션: 정의된 시간 창에서 입력이 연결되는 방식을 지정합니다.

  • condition 섹션: 조인된 이벤트가 알림을 트리거하는 기준을 충족하는지 여부를 결정하는 최종 로직이 포함되어 있습니다.

events 섹션에서 입력 정의

복합 감지 규칙을 빌드하는 첫 번째 단계는 events 섹션에서 규칙의 입력을 정의하는 것입니다. 복합 규칙의 입력은 다른 쿼리에서 생성된 감지를 저장하는 컬렉션에서 가져옵니다. Google SecOps는 컬렉션의 데이터에 액세스하는 다음과 같은 두 가지 방법을 제공합니다.

변수 또는 메타 라벨로 감지 콘텐츠 참조

원래 UDM 이벤트를 참조하지 않고 감지의 데이터에 액세스하려면 outcome 변수, match 변수 또는 meta 라벨을 사용하면 됩니다. 이 접근 방식은 다양한 규칙 유형에서 더 큰 유연성과 더 나은 호환성을 제공하므로 권장됩니다.

예를 들어 여러 규칙이 서로 다른 컨텍스트에서 문자열을 찾는 경우 공통 outcome 변수에 문자열 (예: URL, 파일 이름 또는 레지스트리 키)을 저장할 수 있습니다. 복합 규칙에서 이 문자열에 액세스하려면 detection으로 시작하고 컬렉션 리소스의 요소를 사용하여 관련 정보를 찾습니다.

예: 감지 규칙이 다음 정보를 생성한다고 가정해 보겠습니다.

  • 결과 변수: dest_domain = "cymbal.com"

  • UDM 필드: target.hostname = "cymbal.com"

복합 규칙에서 다음 경로를 사용하여 이 데이터에 액세스할 수 있습니다.

  • detection.detection.variables["dest_domain"].string_val을 사용하여 dest_domain 결과 변수에 액세스합니다.

  • detection.collection_elements.references.event.target.hostname을 사용하여 target.hostname UDM 필드에 액세스합니다.

  • detection.time_window.start_time.seconds를 사용하여 감지의 시작 타임스탬프에 액세스합니다.

컬렉션 API 및 SecurityResult API는 다음 두 가지에 모두 액세스할 수 있도록 지원합니다.

  • 감지 메타데이터 및 결과 값 (detection.detection)
  • 참조된 규칙의 기본 UDM 이벤트 (collection_elements)

규칙 ID 또는 이름으로 감지 콘텐츠 참조

이름 또는 ID로 규칙을 참조할 수 있습니다. 감지 로직이 특정 규칙에 종속되고 분석된 데이터를 이러한 규칙 결과로만 줄이려는 경우 이 접근 방식을 사용하는 것이 좋습니다. 이름 또는 ID로 관련 규칙을 참조하면 분석된 데이터가 줄어들어 성능이 개선되고 시간 초과가 방지됩니다. 예를 들어 알려진 이전 감지에서 target.url 또는 principal.ip와 같은 필드를 직접 쿼리할 수 있습니다.

  • 규칙 ID로 규칙 참조 (권장): detection.detection.rule_id 필드를 사용하여 ID로 규칙을 참조합니다. Google SecOps의 규칙 URL에서 규칙 ID를 확인할 수 있습니다. 사용자가 생성한 규칙의 ID는 ru_UUID 형식이고 선별된 탐지 규칙의 ID는 ur_UUID 형식입니다. 예를 들면 다음과 같습니다.

    detection.detection.rule_id = "ru_e0d3f371-6832-4d20-b0ad-1f4e234acb2b"

  • 규칙 이름으로 규칙 참조: detection.detection.rule_name 필드를 사용하여 이름으로 규칙을 참조합니다. 정확한 규칙 이름을 지정하거나 정규 표현식을 사용하여 일치시킬 수 있습니다. 예를 들면 다음과 같습니다.

    • detection.detection.rule_name = "My Rule Name"
    • detection.detection.rule_name = "/PartOfName/"

match 섹션에서 입력 조인

복합 규칙에서 관련 감지, 이벤트 또는 항목을 연결하려면 events 섹션에 정의된 변수를 사용하여 match 섹션을 정의합니다. 이러한 변수에는 규칙 라벨, 결과 변수, 일치 변수, 감지 필드 또는 컬렉션 요소가 포함될 수 있습니다.

문법에 대한 자세한 내용은 일치 섹션 문법을 참고하세요.

복합 규칙: 시간 간격 및 홉 기간

복합 규칙은 특정 시점이 아닌 시간 간격에 대해 감지 및 이벤트를 일치시킵니다. 입력 감지 시간 창이 해당 홉 기간과 겹치는 경우 (예: 활동이 해당 시간 블록 동안 활성 상태였음) 복합 홉 기간과 일치합니다.

감지가 인접한 홉 기간 간의 경계에 걸쳐 있는 경우 (파이프라인 지연으로 인해 이러한 이전 일치가 나중에 표시됨) 단일 감지가 여러 알림을 트리거할 수 있습니다. 특히 복합 규칙 홉 기간은 입력 감지 시간 창 (WindowStart~WindowEnd)이 홉 기간과 겹치는 경우 일치를 트리거합니다.

예를 들면 다음과 같습니다.

  1. 복합 규칙에는 60분 홉 기간이 있습니다. 홉 1 (18:58~19:58) 및 홉 2(19:58~20:58).
  2. 업스트림 프로듀서 감지의 기간은 19:57:54~20:56:54(59분)입니다.
  3. 프로듀서 기간은 19:57:54 (홉 1이 종료되기 6초 전)에 시작되어 20:56:54 (홉 2 중)에 종료되므로 두 홉 기간과 모두 겹칩니다.
  4. 이렇게 하면 두 개의 복합 감지 (홉 1용 하나, 홉 2용 하나)가 트리거되어 거짓양성을 방지하는 데 도움이 됩니다. 프로듀서 규칙이 겹치는 부분에서 일치하지 않으면 부분적으로 겹치는 감지가 홉 1 또는 홉 2에 대해 고려되지 않으며 감지와 다른 이벤트 간의 상관관계가 누락됩니다.

홉 기간을 지정하는 방법에 관한 자세한 내용과 예시는 홉 기간을 참고하세요.

condition 섹션 정의

condition 섹션을 정의하여 match 섹션의 결과를 평가합니다. 조건이 true이면 알림이 생성됩니다. 문법에 대한 자세한 내용은 조건 섹션 문법을(를) 참고하세요.

복합 규칙에 고급 기법 적용

이 섹션에서는 복합 규칙을 빌드하는 동안 고급 기법을 적용하는 방법을 설명합니다.

이벤트 및 감지 결합

복합 규칙은 UDM 이벤트, 항목 그래프 데이터, 감지 필드를 비롯한 여러 데이터 소스를 결합할 수 있습니다. 다음 가이드라인이 적용됩니다.

  • 소스별로 고유한 변수 사용: 데이터 소스에 이벤트, 항목, 감지가 포함된 경우 각 데이터 소스에 고유한 이벤트 변수 (예: 이벤트의 경우 $e, 감지의 경우 $d)를 할당합니다.

  • 공유 컨텍스트에서 소스 조인: 규칙 조건에서 사용자 ID, IP 주소 또는 도메인 이름과 같은 공통 값을 사용하여 데이터 소스를 연결합니다.

  • 일치 기간 정의: 48시간 이하의 시간 창이 있는 match 절을 항상 포함합니다.

예: 이벤트 및 감지 결합

rule CheckCuratedDetection_with_EDR_and_EG {
  meta:
    author = "noone@cymbal.com"
  events:
    $d.detection.detection.rule_name = /SCC: Custom Modules: Configurable Bad Domain/
    $d.detection.collection_elements.references.event.network.dns.questions.name = $domain
    $d.detection.collection_elements.references.event.principal.asset.hostname = $hostname

    $e.metadata.log_type = "LIMACHARLIE_EDR"
    $e.metadata.product_event_type = "NETWORK_CONNECTIONS"
    $domain = re.capture($e.principal.process.command_line, "\\s([a-zA-Z0-9.-]+\\.[a-zA-Z0-9.-]+)$")
    $hostname = re.capture($e.principal.hostname, "([^.]*)")

    $prevalence.graph.metadata.entity_type = "DOMAIN_NAME"
    $prevalence.graph.metadata.source_type = "DERIVED_CONTEXT"
    $prevalence.graph.entity.hostname = $domain
    $prevalence.graph.entity.domain.prevalence.day_count = 10
    $prevalence.graph.entity.domain.prevalence.rolling_max <= 5
    $prevalence.graph.entity.domain.prevalence.rolling_max > 0

  match:
    $hostname over 1h

  outcome:
    $risk_score = 80
    $CL_target = array($domain)

  condition:
    $e and $d and $prevalence
}

순차 복합 감지 만들기

순차 복합 감지는 무차별 대입 로그인 시도 감지 후 성공적인 로그인과 같이 감지의 순서가 중요한 관련 이벤트 패턴을 식별합니다. 이러한 패턴은 여러 기본 감지, 원시 UDM 이벤트 또는 둘 다 결합할 수 있습니다.

순차 복합 감지를 만들려면 규칙 내에서 해당 순서를 적용해야 합니다. 예상되는 순서를 적용하려면 다음 방법 중 하나를 사용하세요.

  • 슬라이딩 윈도우: match 조건에서 슬라이딩 윈도우를 사용하여 감지 순서를 정의합니다.

  • 타임스탬프 비교: 규칙 로직 내에서 감지의 타임스탬프를 비교하여 선택한 순서로 발생하는지 확인합니다.

예: 순차 복합 감지

events:
    $d1.detection.detection.rule_name = "fileEvent_rule"
    $userid = $d1.detection.detection.variables["user"].string_val
    $hostname = $d1.detection.detection.variables["hostname"].string_val

    $d2.detection.detection.rule_name = "processExecution_rule"
    $userid = $d2.detection.detection.variables["user"].string_val
    $hostname = $d2.detection.detection.variables["hostname"].string_val

    $d3.detection.detection.rule_name = "networkEvent_rule"
    $userid = $d3.detection.detection.variables["user"].string_val
    $hostname = $d3.detection.detection.variables["hostname"].string_val

$d3.detection.collection_elements.references.event.metadata.event_timestamp.seconds > $d2.detection.collection_elements.references.event.metadata.event_timestamp.seconds

  match:
    $userid over 24h after $d1

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