조건 섹션 구문

다음에서 지원:

이 문서에서는 YARA-L 쿼리의 condition 섹션을 사용하는 방법을 설명합니다. condition 섹션은 검색 및 대시보드에 사용되며 규칙에 필요하고 결과를 추가로 필터링하는 논리가 포함되어 있습니다. 검색 또는 대시보드 쿼리에서 사용하면 조건을 충족하는 출력만 표시됩니다. 감지 규칙에 사용되는 경우 알림을 트리거하려면 조건을 충족해야 합니다.

condition 섹션에서 불리언 연산자, 비교 연산자, outcome 변수의 결과를 사용하여 쿼리를 트리거해야 하는지 확인할 수 있습니다.

condition 섹션 정의

condition 섹션에서 이벤트 및 자리표시자 변수의 조건 표현식을 정의합니다. events 섹션에 정의된 이벤트 및 자리표시자에 대해 일치 조건을 지정할 수도 있으며, 선택적으로 and 키워드를 사용하여 outcome 섹션에 정의된 결과 변수를 사용하여 일치 조건을 지정할 수 있습니다(결과 섹션 문법 참고).

and 또는 or 키워드를 사용하여 표현식을 조인할 수 있습니다.

  • 조건 사이에 and를 사용합니다.

  • 쿼리에 단일 이벤트 변수가 포함된 경우에만 or를 사용합니다.

events 섹션의 모든 조건을 충족하는 고유 이벤트 또는 값 수를 나타내려면 이벤트 또는 자리표시자 변수 이름 앞에 condition 섹션에서 # 문자를 사용합니다. 예를 들면 다음과 같습니다.

#c > 1c 변수가 2회 이상 발생해야 함을 의미합니다.

결과 변수 이름 앞에 condition 섹션에서 $ 문자를 사용하여 해당 결과 값을 나타냅니다. 이벤트 또는 자리표시자 변수 이름 앞에 사용될 경우 (예: $event) #event > 0을 나타냅니다.

이 규칙 예시에서는 10분 기간 (match 섹션에 정의됨) 내에 각 사용자의 실패한 로그인 수가 5개를 초과하는 경우 (condition 섹션에 정의됨) 감지를 반환합니다.

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

  outcome:
   $failed_login_count = count($e.metadata.id)
   $first_fail_time = min($e.metadata.event_timestamp.seconds)

  condition:
    #e >= 5
}

바운드 및 언바운드 조건

쿼리에서 제한된 조건 또는 제한되지 않은 조건을 사용할 수 있습니다.

  • 제한된 조건은 연결된 이벤트 변수를 강제로 존재하게 만듭니다. 즉, 감지 항목에 이벤트가 하나 이상 표시되어야 합니다. 다음은 경계 조건입니다.

    $var // equivalent to #var > 0

    #var > n // where n >= 0

    #var >= m // where m > 0

  • 무한 조건은 일정 기간 동안 이벤트가 없는 경우를 감지하는 데 사용할 수 있습니다. 예를 들어 10분 이내에 완화 이벤트가 없는 위협 이벤트입니다. 제한되지 않은 조건을 사용하면 연결된 이벤트 변수가 존재하지 않을 수 있습니다 (비존재 쿼리). 즉, 이벤트가 감지에 표시되지 않고 이벤트 변수의 필드에 대한 모든 참조가 0 값이 될 수 있습니다.

    다음은 무한 조건입니다.

    !$var // equivalent to #var = 0

    #var >= 0

    #var < n // where n > 0

    #var <= m // where m >= 0

존재하지 않는 항목 쿼리 요구사항

존재하지 않는 조건이 있는 쿼리를 컴파일할 경우 다음 요구사항을 충족해야 합니다.

  • 최소 하나 이상의 UDM 이벤트에 제한된 조건이 있어야 합니다(즉, 하나 이상의 UDM 이벤트가 있어야 함).
  • 자리표시자에 제한되지 않은 조건이 있는 경우 하나 이상의 제한된 UDM 이벤트와 연결되어야 합니다.
  • 항목에 무제한 조건이 있는 경우 하나 이상의 제한된 UDM 이벤트와 연결되어야 합니다.

예: 비존재 쿼리

조건 섹션이 생략된 다음 쿼리를 고려해 보세요.

rule NonexistenceExample {
  meta:
      author = "Google Security"
      description = "Example: non-existence query."
  events:
      $u1.metadata.event_type = "NETWORK_CONNECTION" // $u1 is a UDM event.
      $u2.metadata.event_type = "NETWORK_CONNECTION" // $u2 is a UDM event.
      $e1.graph.metadata.entity_type = "FILE"        // $e1 is an entity.
      $e2.graph.metadata.entity_type = "FILE"        // $e2 is an entity.

      $user = $u1.principal.user.userid // Match variable is required for multi-event query.

      // Placeholder Associations:
      //   u1        u2
      //   |  \    /
      // port   ip
      //   |       \
      //   e1        e2
      $u1.target.port = $port
      $e1.graph.entity.port = $port
      $u1.principal.ip = $ip
      $u2.target.ip = $ip
      $e2.graph.entity.ip = $ip

      // UDM-Entity Associations:
      // u1 - u2
      // |  \  |
      // e1   e2
      $u1.metadata.event_type = $u2.metadata.event_type
      $e1.graph.entity.hostname = $u1.principal.hostname
      $e2.graph.entity.hostname = $u1.target.hostname
      $e2.graph.entity.hostname = $u2.principal.hostname

  match:
    $user over 5m

  condition:
      //Add valid condition
}

유효한 조건 섹션

다음은 조건 섹션의 유효한 예시입니다.

  • $u1 and !$u2 and $e1 and $e2
    • 조건 섹션에 모든 UDM 이벤트 및 항목이 있습니다.
    • 하나 이상의 UDM 이벤트가 제한되어 있습니다.
  • $u1 and !$u2 and $e1 and !$e2
    • $e2는 제한되어 있지 않으며 제한된 $u1과 연결되기 때문에 허용됩니다. $e2$u1과 연결되지 않은 경우에는 유효하지 않습니다.
  • #port > 50 and #ip = 0
    • 조건 섹션에 UDM 이벤트 및 항목이 없습니다. 하지만 존재하는 자리표시자가 모든 UDM 이벤트 및 항목을 포함합니다.
    • $ip$u1$u2에 모두 할당되며 #ip = 0은 제한되지 않은 조건입니다. 하지만 경계 조건은 무한 조건보다 더 강력합니다. $port$u1에 할당되고 #port > 50이 제한된 조건이므로 $u1은 여전히 제한됩니다.

잘못된 조건 섹션

다음은 조건 섹션의 잘못된 예입니다.

  • $u1 and $e1
    • events 섹션에 표시되는 모든 UDM 이벤트 및 항목은 condition 섹션에 표시되어야 합니다 (또는 condition 섹션에 표시되는 자리표시자가 할당되어야 함).
  • $u1, $u2, $e1, $u2, #port > 50
    • 쉼표는 조건 구분 기호로 허용되지 않습니다.
  • !$u1 and !$u2 and $e1 and $e2
    • 하나 이상의 UDM 이벤트가 제한되는 첫 번째 요구사항을 위반합니다.
  • ($u1 or #port < 50) and $u2 and $e1 and $e2
    • or 키워드는 무한 조건과 함께 지원되지 않습니다.
  • ($u1 or $u2) and $e1 and $e2
    • or 키워드는 서로 다른 이벤트 변수 간에 지원되지 않습니다.
  • not $u1 and $u2 and $e1 and $e2
    • 이벤트 및 자리표시자 조건에는 not 키워드가 허용되지 않습니다.
  • #port < 50 and #ip = 0
    • 자리표시자가 모든 UDM 이벤트 및 항목을 참조하지만 연결된 모든 조건은 제한되지 않습니다. 즉, UDM 이벤트가 제한되지 않아 규칙이 컴파일되지 않습니다.

결과 조건

condition 섹션에 결과 변수에 대한 조건을 포함할 수 있습니다. 이 조건은 and 또는 or 키워드로 조인되거나 not 키워드가 앞에 옵니다.

결과 조건은 결과 변수 유형에 따라 다르게 지정됩니다.

  • 정수: =, >, >=, <, <=, != 연산자와 정수 리터럴을 비교합니다. 예: $risk_score > 10

  • float: =, >, >=, <, <=, != 연산자와 부동 소수점 리터럴을 비교합니다. 예: $risk_score <= 5.5

  • 문자열: = 또는 != 중 하나와 문자열 리터럴을 비교합니다. 예: $severity = "HIGH"

  • 정수 또는 배열 목록: arrays.contains 함수를 사용하여 조건을 지정합니다. 예: arrays.contains($event_ids, "id_1234")

match 섹션이 있는 쿼리에서 결과 조건을 지정하면 쿼리가 쿼리 할당량에 대해 멀티 이벤트 쿼리로 분류됩니다. 단일 및 여러 이벤트 분류에 대한 자세한 내용은 일치 구문을 참고하세요.

제한사항

  • condition 섹션에서 match 변수를 사용하지 마세요. 이벤트가 match 변수 값으로 그룹화되므로 구문 오류에 해당합니다.

  • match 변수가 할당된 모든 event 변수에 대해 제한되지 않은 조건만 지정하지 마세요. 문법 오류입니다. 반환할 match 변수 값에 대해 값을 포함하는 이벤트가 하나 이상 존재해야 합니다.

  • 슬라이딩 기간을 사용할 경우 피벗 이벤트 변수가 하나 이상의 제한된 조건에 포함되어야 합니다.

다음 단계

추가 정보

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