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

다음에서 지원:

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

개요

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

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

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

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

  • 시간 경과에 따른 동향 분석: 보안 상태의 변화를 파악하여 제어의 영향을 평가하거나 개선이 필요한 영역을 찾을 수 있습니다(예: 시간 경과에 따른 취약점 수의 변화 추적).

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

쿼리 구조는 다음과 같습니다.

  1. 필터링 문: 필터링 문은 이벤트를 필터링할 조건을 지정합니다.

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

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

  4. 순서: 순서 섹션은 반환된 쿼리 결과의 순서를 지정합니다. 순서 (asc 또는 desc)를 지정하지 않으면 기본값은 asc입니다.

  5. 제한 (선택사항): 제한 섹션은 쿼리가 반환하는 최대 행 수를 지정합니다.

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

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 검색은 다음 집계 함수를 지원합니다.

합계

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)

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)

최대

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)

avg

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)

배열

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)

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)

검색에서 YARA-L 2.0을 사용하는 것과 UDM 내에서 사용하는 것의 차이

  • 기간 내 이벤트 검색을 사용 설정하는 over 키워드는 검색에 적용되지 않습니다.

  • UDM 검색 쿼리 구조에는 conditionoption 섹션이 포함되지 않습니다.

시간 세부사항별 그룹화

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

구문은 다음과 같습니다.

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

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

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

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

예시

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

$hostname = principal.hostname
match:
  $hostname, target.ip by hour

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

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

항목 컨텍스트와 같은 일부 데이터 소스는 기간(<start_time>, <end_time>)에 걸쳐 유효하며 고유한 타임스탬프를 포함하지 않습니다.

first 키워드는 기간 동안 유효한 데이터 소스를 단일 타임스탬프에서만 유효한 데이터 소스인 것처럼 취급하는 선택적 키워드입니다. 즉, 기간에 걸쳐 유효한 데이터 소스의 경우 first 키워드는 기간의 종료 시간을 무시하고 시작 시간 (<start_time>)만 고려합니다.

예를 들어 시간 범위가 (1m, 5m)이고 시간 세부사항이 1분인 항목을 가정해 보겠습니다. 결과가 호스트(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. 시각화 탭의 차트 유형 목록에서 차트 유형을 선택합니다.

  4. 선택한 차트 유형의 데이터 설정에서 설정을 변경하여 차트를 맞춤설정합니다.

  5. 대시보드에 추가 화면에서 차트 이름, 차트 설명, 차트 기간을 추가합니다.

  6. 적절한 옵션을 선택하여 기존 대시보드 또는 새 대시보드에 차트를 추가합니다.

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