YARA-L 2.0을 사용한 검색의 통계 및 집계

다음에서 지원:

이 페이지에서는 UDM 이벤트에 통계 쿼리를 실행하고 YARA-L 2.0을 사용하여 분석을 위해 결과를 그룹화하는 방법을 설명합니다.

환경에서 생성된 많은 양의 UDM 이벤트를 처리할 때는 UDM 검색 데이터의 추세를 파악하는 것이 중요합니다. 통계 및 집계 함수를 사용하여 UDM 로그에서 실행 가능한 유용한 정보를 얻을 수 있습니다. UDM 검색은 YARA-L 2.0의 모든 집계 함수를 지원합니다.

통계 쿼리 사용 사례

다음 사용 사례에 통계 쿼리를 사용할 수 있습니다.

  • 중요 측정항목 추적: UDM 이벤트 및 연결된 애셋(예: 알려진 악성 IP 주소와 통신하는 호스트)의 분포와 빈도를 측정할 수 있습니다.

  • 비정상적인 동작 감지: 예상치 못한 네트워크 트래픽 급증이나 근무 시간 외 로그인과 같이 보안 사고를 나타낼 수 있는 활동 급증을 식별할 수 있습니다.

  • 시간 경과에 따른 추세 분석: 보안 상태 변경사항을 평가하여 컨트롤 효과를 평가하거나 개선이 필요한 영역을 파악할 수 있습니다(예: 시간 경과에 따른 취약점 수 변동 모니터링).

탐지 엔진 규칙에 사용되는 YARA-L 구조와 유사한 구문을 사용하여 UDM 검색어 결과를 그룹화하고 정렬할 수 있습니다. 자세한 내용은 YARA-L 2.0 언어 구문을 참고하세요.

YARA-L 2.0 쿼리 구조는 다음과 같습니다.

  • 필터링 문: 이벤트를 필터링하는 조건을 지정합니다.

  • Match (선택사항): 그룹화할 필드를 정의합니다. 자세한 내용은 일치 섹션 구문을 참고하세요.

  • 결과: 쿼리의 출력을 지정합니다. 자세한 내용은 결과 섹션 구문을 참고하세요.

  • Dedup (선택사항): 중복 결과의 양을 줄입니다. 자세한 내용은 중복 삭제를 참고하세요.

  • Order: 쿼리 결과의 순서를 asc (오름차순) 또는 desc (내림차순)으로 결정합니다. 순서 (asc 또는 desc)를 지정하지 않으면 기본값은 asc입니다.

  • Limit (선택사항): 쿼리에서 반환하는 최대 행 수를 설정합니다.

다음은 순서 및 한도 사용의 예입니다.

metadata.log_type = "OKTA"

match:
    principal.ip
Outcome:
    $user_count_by_ip = count(principal.user.userid)

order:
 $user_count_by_ip desc

limit:
    20

집계

UDM 검색은 다음 집계 함수를 지원합니다.

배열

array(expression)

설명

array 함수는 모든 값을 목록 형식으로 반환합니다. 목록은 최대 25개의 임의 요소로 잘립니다.

매개변수 데이터 유형

STRING

반환 유형

LIST

코드 샘플

이벤트 유형이 포함된 배열을 반환합니다.

  $event_type = metadata.event_type
  outcome:
    $event_type_array = array($event_type)

array_distinct

array_distinct(expression)

설명

array_distinct 함수는 목록 형식으로 모든 고유 값을 반환합니다. 목록은 최대 25개의 임의 요소로 잘립니다. 고유 목록을 가져오기 위한 중복 삭제는 자르기 전에 적용됩니다.

매개변수 데이터 유형

STRING

반환 유형

LIST

코드 샘플

고유한 이벤트 유형을 포함하는 배열을 반환합니다.

  $event_type = metadata.event_type
  outcome:
    $event_type_array = array_distinct($event_type)

평균

avg(numericExpression)

설명

avg 함수는 숫자 열의 값 평균을 반환합니다. 계산 중에 NULL 값을 무시합니다. match와 함께 사용하여 데이터의 특정 그룹 내 평균을 계산하는 데 자주 사용됩니다.

매개변수 데이터 유형

NUMBER

반환 유형

NUMBER

코드 샘플

target.ip이 비어 있지 않은 모든 이벤트를 찾습니다. principal.ip에서 일치하는 모든 이벤트에 대해 metadata.event_timestamp.seconds의 평균을 avg_seconds라는 변수에 저장합니다.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $avg_seconds = avg(metadata.event_timestamp.seconds)

개수

count(expression)

설명

count 함수는 그룹 내 행 수를 반환합니다. 데이터에서 특정 그룹의 개수를 가져오기 위해 match와 함께 자주 사용됩니다.

매개변수 데이터 유형

STRING

반환 유형

NUMBER

코드 샘플

시간 경과에 따른 사용자 로그인 성공 횟수를 반환합니다.

  metadata.event_type = "USER_LOGIN"
  $security_result = security_result.action
  $security_result = "ALLOW"
  $date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
  match:
      $security_result, $date
  outcome:
      $event_count = count(metadata.id)

count_distinct

count_distinct(expression)

설명

count_distinct 함수는 그룹 내에서 고유한 값이 있는 행의 수를 반환합니다. 데이터에서 특정 그룹의 개수를 가져오기 위해 match와 함께 자주 사용됩니다.

매개변수 데이터 유형

STRING

반환 유형

NUMBER

코드 샘플

시간 경과에 따른 고유한 성공적인 사용자 로그인 수를 반환합니다.

  metadata.event_type = "USER_LOGIN"
  $security_result = security_result.action
  $security_result = "ALLOW"
  $date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
  match:
      $security_result, $date
  outcome:
      $event_count = count_distinct(metadata.id)

최대

max(numericExpression)

설명

max 함수는 숫자 열의 값 중 최댓값을 반환합니다. 데이터의 각 그룹 내에서 최댓값을 가져오기 위해 match와 함께 자주 사용됩니다.

매개변수 데이터 유형

NUMBER

반환 유형

NUMBER

코드 샘플

target.ip이 비어 있지 않은 모든 이벤트를 찾습니다. principal.ip에서 일치하는 모든 이벤트에 대해 metadata.event_timestamp.seconds의 최댓값을 max_seconds라는 변수에 저장합니다.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $max_seconds = max(metadata.event_timestamp.seconds)

min(numericExpression)

설명

min 함수는 숫자 열의 값 중 최솟값을 반환합니다. 데이터의 각 그룹 내에서 최솟값을 가져오기 위해 match와 함께 자주 사용됩니다.

매개변수 데이터 유형

NUMBER

반환 유형

NUMBER

코드 샘플

target.ip이 비어 있지 않은 모든 이벤트를 찾습니다. principal.ip에서 일치하는 모든 이벤트에 대해 metadata.event_timestamp.seconds의 최솟값을 min_seconds라는 변수에 저장합니다.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $min_seconds = min(metadata.event_timestamp.seconds)

합계

sum(numericExpression)

설명

sum 함수는 숫자 열 내 값의 합계를 반환합니다. 계산 중에 NULL 값을 무시합니다. 데이터의 여러 그룹 내에서 합계를 계산하는 데 match와 함께 자주 사용됩니다.

매개변수 데이터 유형

NUMBER

반환 유형

NUMBER

코드 샘플

target.ip이 비어 있지 않은 모든 이벤트를 찾습니다. principal.ip에서 일치하는 모든 이벤트에 대해 network.sent_bytes의 합계를 sent_bytes라는 변수에 저장합니다.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $sent_bytes = sum(network.sent_bytes)

stddev

stddev(numericExpression)

설명

stddev 함수는 가능한 모든 값의 표준 편차를 반환합니다.

매개변수 데이터 유형

NUMBER

반환 유형

NUMBER

코드 샘플

target.ip이 비어 있지 않은 모든 이벤트를 찾습니다. principal.ip에서 일치하는 모든 이벤트에 대해 metadata.event_timestamp.seconds의 표준 편차를 stddev_seconds라는 변수에 저장합니다.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $stddev_seconds = stddev(metadata.event_timestamp.seconds)

earliest

earliest(timestamp)

설명

earliest 함수는 마이크로초 해상도로 레코드 집합에서 가장 빠른 타임스탬프를 반환합니다.

매개변수 데이터 유형

TIMESTAMP

반환 유형

TIMESTAMP

코드 샘플

hostname에서 일치하는 모든 이벤트에 대해 metadata.event_timestamp 중 가장 빠른 시간을 start 변수에 저장합니다.

  $hostname = principal.hostname
  match:
    $hostname
  outcome:
    $start = earliest(metadata.event_timestamp)

latest

latest(timestamp)

설명

latest 함수는 마이크로초 해상도로 레코드 집합의 최신 타임스탬프를 반환합니다.

매개변수 데이터 유형

TIMESTAMP

반환 유형

TIMESTAMP

코드 샘플

hostname에서 일치하는 모든 이벤트에 대해 metadata.event_timestamp의 최신 값을 end 변수에 저장합니다.

  $hostname = principal.hostname
  match:
    $hostname
  outcome:
    $end = latest(metadata.event_timestamp)

YARA-L 2.0: 검색과 UDM 사용 비교

  • 이벤트 기간 검색에 사용되는 over 키워드는 검색에서 지원되지 않습니다.

  • UDM 검색어에는 conditionoption 섹션이 포함되지 않습니다.

시간 단위별 그룹화

SQL에서 열을 그룹화하는 것과 마찬가지로 지정된 시간 세분성으로 match 섹션의 이벤트 필드와 자리표시자를 그룹화할 수 있습니다.

구문은 다음과 같습니다.

match:
  ... [BY|OVER EVERY] [FIRST] [NUMBER] [TIME_GRANULARITY]

시간 세분성별로 그룹화하려면 by 또는 over every 키워드를 사용하면 됩니다. 허용되는 시간 세분성은 다음과 같습니다.

  • MINUTE 또는 m
  • HOUR 또는 h
  • DAY 또는 d
  • WEEK 또는 w
  • MONTH 또는 mo

byover every 키워드는 기능적으로 동일합니다. 둘 중 하나를 사용할 수 있습니다.

예시

2시간마다 IP 주소와 호스트 이름을 그룹화합니다.

$hostname = principal.hostname
match:
  $hostname, target.ip by 2h

전체 시간 세부사항으로 호스트 이름별로 그룹화합니다.

$hostname = principal.hostname
match:
  $hostname by minute

모든 이벤트 수를 호스트 이름별 및 이벤트가 발생한 날짜별로 그룹화합니다.

$hostname = target.hostname
match:
  $hostname over every day
outcome:
  $events_count = count($hostname)

엔티티 컨텍스트와 같은 일부 데이터 소스는 시간 범위(<start_time>, <end_time>)에 걸쳐 유효하며 단일 타임스탬프가 없습니다.

first 키워드는 선택사항이며 단일 타임스탬프에 적용됩니다. 즉, 시간 범위에 걸쳐 유효한 데이터 소스의 경우 first 키워드는 시작 시간 (<start_time>)만 고려합니다.

예를 들어 시간 세분성이 1m이고 시간 범위가 (1m, 5m)인 항목을 생각해 보세요. 결과가 호스트 (h1, h2)별로 그룹화된 경우 반환되는 열은 (h1, 1m) 및 (h2, 1m)이며 나머지 시간 범위는 무시됩니다.

first 키워드를 byover every에 모두 추가할 수 있으며, 이 경우 두 키워드 모두 동일한 동작을 보입니다. by first를 사용하는 것은 over every first과 동일합니다.

다음은 시간 범위에 걸쳐 유효한 엔티티 컨텍스트 데이터 소스와 함께 by 연산자를 사용하는 쿼리의 예입니다. 이 쿼리에서는 first 키워드가 생략되었으므로 전체 기간이 고려됩니다.

graph.entity.hostname != ""
match:
  graph.entity.ip by hour
outcome:
  $min_seconds = min(graph.metadata.event_metadata.event_timestamp.seconds)

검색에서 시각화 만들기 및 저장하기

이 섹션에서는 Google SecOps 통합 데이터 모델 (UDM) 검색의 데이터 시각화 기능을 간략하게 설명합니다. 이 기능을 사용하면 보안 운영 센터 (SOC) 분석가가 검색 결과에서 시각화 자료를 만들어 대시보드에 저장하여 위협을 효율적으로 탐지, 조사, 대응할 수 있습니다.

대시보드에 시각화 만들기 및 저장

대시보드에 추가할 시각화 요소를 만들고 저장하려면 다음 단계를 따르세요.

  1. matchoutcome 섹션을 사용하여 YARA-L 쿼리를 작성합니다.

  2. 기간을 선택한 다음 검색 실행을 클릭하여 쿼리를 실행합니다. 통계시각화 탭에서 결과를 확인합니다.

  3. 시각화 탭에서 다음을 수행합니다. a. 차트 유형 목록에서 차트 유형을 선택합니다. b. 데이터 설정에서 설정을 조정하여 차트를 맞춤설정합니다.

  4. 대시보드에 추가 화면에서 다음 단계를 따릅니다. a. 차트 이름, 설명, 기간을 입력합니다. b. 기존 대시보드에 차트를 추가하거나 새 대시보드를 만듭니다.

  5. 대시보드에 추가를 클릭하여 대시보드에 차트를 추가합니다.

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