일치 섹션 구문

다음에서 지원:

match 섹션은 여러 관련 이벤트를 하나의 감지로 상호 연관시키는 데 필요한 매개변수를 제공합니다. 두 개 이상의 서로 다른 이벤트를 연결하는 규칙에만 필요합니다. 이를 사용하여 다음을 지정하여 이 상관관계의 기준을 정의합니다.

  • 그룹화 필드 (키): 이벤트가 논리적으로 연결되려면 동일한 값을 공유해야 하는 이벤트의 특정 필드 (events 섹션에 정의됨)입니다.

  • 시간 제약: 단일 완전한 일치를 구성하기 위해 관련 이벤트가 발생해야 하는 연속된 시간 범위입니다. 이는 규칙에만 필요하며 검색 및 대시보드에는 필요하지 않습니다.

일치 섹션 정의

규칙에는 일치 변수가 event 섹션에 정의된 자리표시자여야 합니다. 검색 및 대시보드에서 event 필드를 지정할 수도 있습니다.

events 섹션에 정의된 자리표시자 변수를 사용하여 이벤트가 발생해야 하는 시간 범위를 지정합니다. 지정된 기간 외에 발생하는 일치하는 이벤트는 해당 감지 그룹에서 무시됩니다.

over 키워드와 <number><m/h/d> 구문 (여기서 m/h/d는 분, 시간, 일)을 사용하여 시간 창을 지정합니다. 최소 1분에서 최대 48시간까지 지정할 수 있습니다.

이 예시 규칙은 10분 이내에 발생하는 로그인 실패를 감지합니다. 단기간에 여러 번의 로그인 실패가 발생하는 것은 무차별 대입 공격 또는 무단 액세스 시도를 나타내는 경우가 많습니다.

rule failed_logins
{
  meta:
   author = "Security Team"
   description = "Detects multiple failed user logins within 10-minute windows."
   severity = "HIGH"

  events:
   $e.metadata.event_type = "USER_LOGIN"
   $e.security_result.action = "FAIL"
   $user = $e.target.user.userid

  match:
   $user over 10m

  condition:
    #e >= 5
}

match 섹션은 10분 간격으로 새 위치에서 로그인에 실패한 사용자를 찾습니다.

match:
   $user over 10m

일치 섹션의 0 값

Google SecOps는 match 섹션에 사용된 모든 자리 표시자의 0 값 (문자열의 경우 "", 숫자의 경우 0, 불리언의 경우 false, 열거 유형의 경우 위치 0의 값)을 암시적으로 필터링합니다.

예: 0 값 필터링

다음 예시는 0 값을 필터링하는 쿼리를 보여줍니다.

rule ZeroValuePlaceholderExample {
  meta:
  events:
    // Because $host is used in the match section, the query behaves
    // as if the following predicate was added to the events section:
    // $host != ""
    $host = $e.principal.hostname

    // Because $otherPlaceholder was not used in the match,
    // there is no implicit filtering of zero values for $otherPlaceholder.
    $otherPlaceholder = $e.principal.ip

  match:
    $host over 5m

  condition:
    $e
}

하지만 자리표시자가 함수에 할당되면 쿼리가 match 섹션에 사용된 자리표시자의 0값을 암시적으로 필터링하지 않습니다.

0값의 암시적 필터링을 사용 중지하려면 옵션 섹션에서 allow_zero_values 옵션을 사용하면 됩니다. allow_zero_values 옵션은 규칙에서만 사용할 수 있습니다.

예: 0 값 허용

다음 예시는 match 섹션에 사용된 자리표시자의 0값을 암시적으로 필터링하지 않는 쿼리를 보여줍니다.

rule ZeroValueFunctionPlaceholder {
  meta:
  events:
    // Even though $ph is used in the match section, there is no
    // implicit filtering of zero values for $ph, because $ph is assigned to a function.
    $ph = re.capture($e.principal.hostname, "some-regex")

  match:
    $ph over 5m

  condition:
    $e
}

지원되는 기간

지원되는 다음 창 중 하나를 사용하여 match 섹션의 이벤트 필드와 자리표시자를 지정된 시간 세분성으로 그룹화할 수 있습니다.

  • 홉 윈도우 (중복 윈도우)
  • 텀블링 윈도우 (중복되지 않는 윈도우)
  • 슬라이딩 기간 (피벗으로 생성된 기간)

홉 기간

홉 창은 이벤트가 발생하는 순서와 관계없이 지정된 기간 내에 쿼리의 기준과 일치하는 이벤트를 그룹화하는 다중 이벤트 쿼리 유형입니다. 기본적으로 match 섹션이 있는 YARA-L 쿼리는 홉 기간을 사용하여 시간 경과에 따른 여러 이벤트를 연결합니다. 쿼리 실행 기간은 겹치는 홉 기간 집합으로 분할됩니다. 각각의 홉 기간 집합은 match 섹션에 지정된 기간을 사용합니다. 그런 다음 각 홉 창 내에서 이벤트에 대해 상관관계가 지정됩니다.

예를 들어 [1:00, 2:00] 기간 동안 실행되는 쿼리의 경우 30m 동안 match 섹션을 사용하면 [1:00, 1:30], [1:03, 1:33], [1:06, 1:36]과 같이 겹치는 홉 기간 집합이 생성될 수 있습니다. 이러한 기간은 여러 이벤트를 연결하는 데 사용됩니다.

텀블링 윈도우

텀블링 윈도우는 데이터 스트림을 고정 크기이며 겹치지 않는 연속 시간 간격으로 분할합니다. 각 데이터 이벤트는 하나의 윈도우에만 할당됩니다. 이는 시간 간격이 겹칠 수 있는 슬라이딩 또는 홉 윈도우와 대조됩니다.

예를 들어 30분 텀블링 윈도우를 사용하면 1:00:00~1:29:59 사이에 발생하는 이벤트가 함께 처리됩니다. 그런 다음 1시 30분 00초부터 1시 59분 59초까지의 다음 이벤트 세트가 별도로 처리됩니다.

슬라이딩 기간

특정 상대적 순서로 발생하는 이벤트 (예: e1e2 이후 최대 2분 뒤에 발생)를 검색해야 하는 경우 슬라이딩 기간이 매우 효과적입니다. 지정된 피벗 이벤트 변수로 시간 제약이 시작되거나 종료될 때 슬라이딩 기간이 생성됩니다. 이 변수는 특정 피벗 이벤트 변수를 기준으로 이벤트 시퀀스와 타이밍을 동적으로 추적합니다.

그런 후 각 슬라이딩 창 내에서 이벤트에 대해 상관관계가 지정됩니다. 이렇게 하면 e1e2에서 최대 2분 후에 발생하는 등 특정 순서로 발생하는 이벤트를 검색하는 것이 가능하게 됩니다. e1 이벤트 발생과 e2 이벤트 발생은 e2 이벤트 후 슬라이딩 기간 내에 e1 이벤트가 발생할 때 상관관계가 지정됩니다.

  • 슬라이딩 기간은 피벗 이벤트 변수 (pivot-event-var)를 기반으로 합니다.
  • before 키워드를 사용하여 각 피벗 이벤트가 발생하는 것으로 끝나는 슬라이딩 기간을 생성합니다.
  • after 키워드를 사용하여 각 피벗 이벤트가 발생하는 것으로 시작하는 슬라이딩 기간을 생성합니다.

다음과 같이 쿼리의 match 섹션에 슬라이딩 기간을 지정합니다.

<match-var-1>, <match-var-2>, ... over <duration> before|after <pivot-event-var>

다음 예시는 유효한 슬라이딩 기간을 보여줍니다.

$var1, $var2 over 5m after $e1

$user over 1h before $e2

참고:

  • 추가 슬라이딩 구간 예시
  • 홉 창 대신 슬라이딩 창을 사용하면 성능이 느려지는 것으로 알려져 있습니다. 이벤트 순서가 절대적으로 필요하거나 부재 이벤트를 검색할 때와 같이 특별한 경우에만 슬라이딩 기간을 사용하는 것이 좋습니다.

  • 슬라이딩 기간은 여러 이벤트를 감지하도록 설계되었으므로 단일 이벤트 쿼리에는 슬라이딩 기간을 사용하지 않는 것이 좋습니다. 대신 다음 해결 방법 중 하나를 사용하세요.

    • 여러 이벤트 변수를 사용하도록 쿼리를 변환하고 쿼리에 두 번 이상의 이벤트 발생이 필요한 경우 조건 섹션을 업데이트합니다.
    • 필요한 경우 슬라이딩 기간을 사용하는 대신 타임스탬프 필터를 추가할 수 있습니다. 예: $permission_change.metadata.event_timestamp.seconds < $file_creation.metadata.event_timestamp.seconds
    • 슬라이딩 기간을 삭제합니다.

다음 단계

추가 정보

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