YARA-L 시작하기
YARA-L 2.0은 모든 검색, 대시보드, 규칙 기반 위협 감지를 위해 Google Security Operations를 지원하는 고유하고 구조화된 쿼리 언어입니다. 이 문서는 핵심 YARA-L 구조를 이해하고, 위협을 찾는 보안 분석가든 강력한 새 로직을 구축하는 감지 엔지니어든 YARA-L을 사용하는 실용적인 단계를 제공합니다.
이 문서에서는 YARA-L과 그 문법을 설명하고, 이를 사용하여 기본 필터 쿼리부터 복잡한 패턴을 찾는 규칙까지 모든 것을 표현하는 방법을 보여줍니다. YARA-L 쿼리의 섹션을 사용하여 집계 함수, 조건 논리를 지원하고 조인, 패턴 일치 등을 통해 컨텍스트를 추가합니다.
시작하기 전에
- Google SecOps 플랫폼에 액세스할 수 있는지 확인합니다.
- 테스트 규칙을 사용하여 데이터 수집을 확인합니다.
- 보안 개념과 로그 데이터에 대한 기본적인 이해가 있어야 합니다.
- 이 문서에서는 데이터가 Google SecOps 인스턴스로 수집되고 통합 데이터 모델 (UDM)로 정규화된다고 가정합니다.
- 쿼리 이전을 시작하려면 일반적인 SPL 명령어(예:
stats,eval,lookup)를 YARA-Loutcomes및match조건으로 변환하는 SPL에서 YARA-L 2.0으로 전환 가이드를 참고하세요.
YARA-L 구조 이해
모든 YARA-L 쿼리는 쿼리의 동작을 결정하는 명명된 고유한 섹션으로 구분됩니다.
이 구조를 통해 다단계 분석과 상관관계 분석이 가능합니다.
| 주문 | 섹션 | 규칙 | 검색/대시보드 | 설명 |
|---|---|---|---|---|
| 1 | meta |
필수 | 선택사항 | 작성자, 설명, 심각도와 같은 규칙의 설명 메타데이터를 설정합니다. 예를 들어 작성자 (security team), 설명 (Detects multiple failed user logins within 10-minute windows), 심각도 (High)가 있습니다. meta 섹션 구문을 참조하세요. |
| 2 | events |
필수 | 필수 | 추적해야 하는 이벤트(사용자 로그인, 실패한 사용자 로그인(이벤트 변수), 사용자 일치 변수 링크(자리표시자 변수))를 정의하고 필터링합니다. 고려할 모든 데이터 소스 (주로 이벤트)를 선언하고 UDM 필드를 사용하여 필터링합니다. events 섹션 구문을 참고하세요. |
| 3 | match |
필수 | 선택사항 | 이벤트별로 그룹화하고 지원되는 기간 (예: by 5m)을 지정할 수 있습니다. 집계가 발생하는 통계 검색의 경우에 따라 필요합니다. 다중 이벤트 상관관계 쿼리에 필요합니다. 시간 사양은 규칙의 경우 match에서 필수이며 검색 및 대시보드의 경우 선택사항입니다. match 섹션 문법을 참고하세요.참고: match 섹션을 제외하면 규칙이 단일 이벤트와 일치할 수 있습니다. |
| 4 | outcome |
선택사항 | 선택사항 | 필수 측정항목을 계산하고 통계를 가져옵니다 (예: count(), avg()). outcome 섹션 구문을 참고하세요. |
| 5 | condition |
필수 | 선택사항 | 검색에서 결과를 반환하거나 규칙에서 알림을 트리거하기 위해 충족해야 하는 로직을 정의합니다. 결과가 적용되는지 확인하기 위해 쿼리 변수 기준을 평가합니다 (예: $event >5). condition 섹션 구문을 참고하세요. |
| 6 | options |
선택사항 | 선택사항 | 특정 규칙 동작을 사용 설정 또는 중지할 수 있습니다. options 섹션 구문을 참고하세요. |
| 7 | dedup |
해당 사항 없음 | 선택사항 | 주요 변수 또는 이벤트 경로 (예: target.user.userid, target.ip, principal.hostname 또는 $host, $user와 같은 변수)를 기준으로 이벤트를 그룹화하여 중복 이벤트를 삭제합니다. 이벤트 변수 및 검색 및 대시보드에서 중복 삭제를 사용하는 방법을 자세히 알아보세요. |
| 8 | order |
해당 사항 없음 | 선택사항 | 특정 필드 (예: asc)로 정의된 결과를 정렬합니다. 이벤트 변수에 대해 자세히 알아보세요. 선택사항 (match가 사용되는 경우에만 적용됨) |
| 9 | limit |
해당 사항 없음 | 선택사항 | 쿼리에서 반환되는 최대 이벤트 수를 제한합니다. |
| 10 | select |
해당 사항 없음 | 선택사항 | 쿼리 결과에 포함할 UDM 필드 목록을 지정합니다. |
| 11 | unselect |
해당 사항 없음 | 선택사항 | 쿼리 결과에서 제외할 UDM 필드 목록을 지정합니다. |
YARA-L 데이터 소스 가용성
YARA-L은 플랫폼의 위치에 따라 다양한 데이터 소스에 액세스할 수 있습니다. 이벤트, 엔티티 (ECG), 데이터 테이블은 검색, 대시보드, 규칙에서 완전히 사용할 수 있습니다. 샘플 쿼리에 대한 자세한 내용은 지원되는 데이터 소스를 참고하세요.
다음 표에는 YARA-L에서 사용할 수 있는 기능이 나와 있습니다.
| 기능 | 지원 언어 |
|---|---|
| 케이스 및 케이스 기록 | 대시보드 |
| 데이터 테이블 | 검색, 대시보드, 규칙 |
| 항목 (ECG) | 검색, 대시보드, 규칙 |
| 수집 측정항목 | 대시보드 |
| IoC 일치 | 대시보드 |
| 규칙 감지 | 대시보드, 규칙 |
| 규칙 세트 | 대시보드 |
| 이벤트 | 검색, 대시보드, 규칙 |
| UEBA 측정항목 | 검색, 대시보드 |
첫 번째 YARA-L 검색 빌드
Google SecOps의 모든 데이터는 목표에 따라 필터 검색과 통계 검색 (집계)이라는 두 가지 기본 방법을 사용하여 검색됩니다.
검색 필터링 (이벤트 필터링)
필터 검색 메서드를 사용하면 통계 집계의 오버헤드 없이 광범위한 원격 분석 스트림에서 특정 이벤트를 격리할 수 있습니다. 이 메서드는 기준을 사용하여 로그나 네트워크 트래픽과 같은 대량의 보안 데이터를 타겟 결과 집합으로 좁힙니다. 이 로직에서는 events 섹션에서 이벤트를 지정하기만 하면 됩니다.
첫 번째 YARA-L 필터 검색을 빌드하려면 다음 단계에 따라 로그인에 실패한 사용자를 검색하세요.
- Google SecOps에서 검색 페이지로 이동합니다.
-
로그인 이벤트 필터링:
metadata.event_type = "USER_LOGIN"
도움말: 검색 시
events:섹션 헤더를 생략할 수 있습니다. 기본적으로 검색 구문은 이 섹션을 의미합니다. userid가 비어 있지 않은 사용자의 로그인 실패에 대한event작업을 추가합니다.metadata.event_type = "USER_LOGIN" security_result.action = "FAIL" principal.user.userid != ""- 이 검색을 실행하여 결과를 확인하세요.
자리표시자 변수 사용
플레이스홀더 변수를 사용하여 이벤트에서 사용자 이름이나 IP 주소와 같은 특정 값을 추출합니다. 이러한 변수는 다양한 이벤트의 데이터를 비교하거나 최종 출력에 이러한 값을 표시할 수 있는 임시 앵커 역할을 합니다.
자리표시자 변수를 적용하여 다음 작업을 할 수 있습니다.
- 브리지 데이터:
$userid또는$ip와 같은 자리표시자를 사용하여 서로 다른 이벤트 변수 간의 일치 항목을 찾습니다. 예를 들어$userid를 사용하여 로그인 및 로그아웃 이벤트 전반에서 사용자 식별자를 연결할 수 있습니다. - 결과 그룹화:
match섹션에서 플레이스홀더 변수를 사용하여 쿼리 출력의 기간(예:match: $userid over 1h)을 정의합니다. - 결과 만들기: 자리표시자를 사용하여 쿼리 출력에서 특정 데이터 포인트를 캡처하고 표시합니다.
예를 들어 $user = principal.user.userid를 할당하면 이제 $user 변수에 이벤트에서 추출된 특정 값이 저장됩니다. 그런 다음 match 섹션에서 $user를 사용하여 해당 특정 사용자와 관련된 모든 활동을 그룹화합니다.
통계 검색 (집계)
통계 검색 방법을 사용하면 이벤트 집합 전반에서 계산을 실행하여 통계, 추세 또는 이상치를 파악할 수 있습니다. 개별 로그 목록을 반환하는 대신 데이터의 집계된 요약을 제공합니다. 이 로직은 match 섹션 (그룹화용)과 outcome 섹션 (계산용)을 사용합니다. outcome 섹션은 count(), sum(), avg(), max(), min(), stddev()와 같은 집계 함수를 지원합니다.
다음 예에서는 다음 쿼리 로직을 사용합니다.
events: 로그인 시도 실패에 대한 원시 데이터를 필터링합니다.match: 그룹화 이벤트 (userid별)를 정의합니다.outcome: 통계 집계 (사용자당 이벤트 수)를 실행합니다.
예: outcome 함수를 사용하여 로그인 실패 활동 기록 집계
다음 예시에서는 outcome 섹션의 집계 함수 (예: count() 또는 sum())를 사용하여 실패한 로그인 활동을 요약합니다.
match섹션을 사용하여userid별로 로그인 실패 이벤트를 그룹화합니다.metadata.event_type = "USER_LOGIN" security_result.action = "FAIL" principal.user.userid != "" match: principal.user.useridoutcome변수로 정의된 각 사용자의 실패한 로그인count($failed_login_count)을 사용합니다.metadata.event_type = "USER_LOGIN" security_result.action = "FAIL" principal.user.userid != "" match: principal.user.userid outcome: $failed_login_count = count(metadata.id)이 검색을 실행하여 결과를 확인하세요.
선택사항:
match섹션에 시간 요소를 추가합니다 (이 경우day). 그런 다음outcome변수를 더 명확하게 업데이트합니다 ($daily_failed_login_count).metadata.event_type = "USER_LOGIN" security_result.action = "FAIL" principal.user.userid != "" $user = principal.user.userid match: $user by day outcome: $daily_failed_login_count = count(metadata.id)
검색에서 대시보드 위젯 만들기
첫 번째 검색 예시 빌드에 표시된 것처럼 집계된 검색에서 대시보드 위젯을 만들 수 있습니다.
검색이 검증되면 다음과 같이 위젯으로 저장하고 대시보드에 추가할 수 있습니다.
- 결과가 표시되면 시각화 탭 > 대시보드에 추가를 클릭합니다.
- 위젯을 구성합니다.
- 위젯 이름을 지정합니다 (예:
"Daily Failed Login"). - 기간 선택
- 기존 대시보드에 추가할지 새 대시보드에 추가할지 선택합니다.
- 추가를 클릭합니다.
- 위젯 이름을 지정합니다 (예:
- 선택사항: 대시보드에 직접 쿼리를 빌드합니다. 또는 선별된 대시보드를 복사하고 그 안의 쿼리를 수정하여 시작할 수도 있습니다.
- 선택사항: YARA-L을 사용하여 맞춤 대시보드를 만들고 여기에 위젯을 추가할 수 있습니다. 자세한 내용은 맞춤 대시보드 만들기를 참고하세요.
대시보드 구성
새 대시보드를 빌드할 때 events 섹션은 필수 시작점입니다. 여기에서 match (결과 그룹화) 또는 outcome (출력 및 집계 계산)을 유연하게 사용할 수 있습니다.
예를 들어 events 및 match 섹션이 있는 대시보드를 사용할 수 있습니다. 여기서 대시보드는 by hour 버킷으로 그룹화된 감지의 심각도 ($severity)를 표시합니다.
예: 심각도별로 시계열 집계
events및match섹션을 사용하여hour버킷으로 그룹화된 감지의 심각도 ($severity)를 표시하는 대시보드를 만들 수 있습니다.detection.detection.severity != "UNKNOWN_SEVERITY" $severity = detection.detection.severity match: $severity by hour
예: 총 심각한 영향 집계
마찬가지로
events및outcome섹션을 사용하여 심각도가 높은 감지를 추적하는 대시보드를 만들 수 있습니다.detection.detection.severity = "CRITICAL" $severity = detection.detection.severity outcome: $detection_count = count_distinct($severity)
예시: 시간 경과에 따른 심각도별 감지 수 시각화
다음 예에서는 콘솔을 통해 심각한 감지를 집계하고 기간을 지정할 수 있습니다. 대시보드에서 시각화를 빌드할 때
match및outcome섹션을 모두 사용하는 경우가 많습니다.detection.detection.severity != "UNKNOWN_SEVERITY" $severity = detection.detection.severity match: $severity by hour outcome: $detection_count = count_distinct(detection.id)
예: 사용자 로그인 빈도 계산
다음 예에서는
match및outcome섹션을 사용하여 특정 사용자의login_count를 계산하는 데 중점을 둡니다.events: metadata.event_type = "USER_LOGIN" match: target.user.userid outcome: $login_count = count(metadata.id)
규칙 빌드
규칙에는 다음 섹션이 필요합니다.
meta: 규칙 이름과 설명 세부정보를 포함합니다.events: 이벤트 변수를 사용하여 데이터 소스와 필터를 정의합니다.condition: 규칙이 트리거되기 위해 존재해야 하는 이벤트 변수를 지정합니다.
이벤트 변수 정의 및 사용
이벤트 변수는 논리적 컨테이너 역할을 하며 필터를 그룹화하여 검색, 규칙 또는 대시보드 전체에서 특정 활동을 참조할 수 있습니다.
events 섹션에서 로직을 정의할 때 이벤트 변수 (예: $e)를 사용하여 기준과 일치하는 특정 이벤트 (또는 이벤트 그룹)를 나타낼 수 있습니다.
예: 이벤트 변수 정의 및 필터링
이벤트 변수 (예:
$e)를 정의하려면 쿼리의events섹션에서 접두사를 사용하세요. 이렇게 하면 변수로 표현되는 이벤트가 선언됩니다. 예를 들어$e.principal.hostname = "dev"표현식은 각 이벤트를 평가하여 호스트 이름이 정확히 일치하는지 확인합니다.$e.principal.hostname = "dev" $e.metadata.event_type = "USER_LOGIN"
그런 다음 쿼리의 다른 섹션에서 해당 변수를 사용하여 특정 이벤트 그룹 (match, outcome, condition 섹션)과 데이터 필드를 참조할 수 있습니다.
규칙 구조 및 문법 구성
다음 규칙 구조와 문법을 사용하여 변수, 그룹화 로직, 트리거 기준점을 정의하세요.
| 요소 | 설명 | 예 |
|---|---|---|
| 규칙 구조 | rule 블록에 쿼리를 래핑하고 감지를 식별하는 고유한 이름을 할당합니다. |
rule DailyFailedLoginAttempts { } |
meta 섹션 |
필수 항목입니다. 규칙 관리를 개선하고 팀에 컨텍스트를 제공하기 위해 설명 메타데이터 (`author`, `description`, `severity` 등)를 포함합니다. 규칙 관리를 위한 권장사항으로 권장됩니다. | author = "Alex"severity = "Medium" |
| 이벤트 변수 | 규칙 쿼리에서 events 섹션의 각 필드에는 기준과 일치하는 특정 이벤트 (또는 이벤트 그룹)를 나타내는 이벤트 변수 (예: $e)가 접두사로 붙습니다. 필터의 논리적 그룹화 역할을 합니다. 검색을 YARA-L 규칙으로 변환 예에서 $e는 모든 사용자 로그인 실패를 나타냅니다. |
$e.metadata.event_type = "USER_LOGIN" |
| 자리표시자 변수 | 나중에 쿼리에서 참조할 수 있는 일반 이름에 이벤트를 할당합니다. 자세한 내용은 플레이스홀더 변수 사용을 참고하세요. | $userid = $e.principal.user.userid |
match 섹션 |
그룹화를 정의하고 지원되는 기간을 지정합니다. 검색을 YARA-L 규칙으로 변환 예시에서 match: $userid over day 그룹화는 각 24시간 기간 (1d) 내에서 사용자 ID별로 이벤트를 올바르게 그룹화합니다. 규칙을 작성할 때는 지원되는 기간을 지정하여 대상 기간을 정의해야 합니다. 로직 요구사항에 따라 홉, 슬라이딩 또는 텀블링 기간을 구현할 수 있습니다. over 연산자를 사용하면 홉핑 윈도우가 명시적으로 생성됩니다. |
$userid over 1d |
outcome 섹션 |
통계 집계를 수행하거나 특정 변수를 캡처하여 결과 알림을 더 유용하게 만듭니다.$e.metadata.id에서 count() 함수를 사용하여 각 match 그룹 내의 이벤트를 집계합니다. $userid와 같은 변수를 할당하여 특정 UDM 필드를 캡처하고 결과 감지 출력에 더 많은 컨텍스트를 제공할 수도 있습니다. |
$failed_count = count($e.metadata.id) |
condition 섹션 |
규칙이 감지를 생성하는 데 필요합니다.condition 섹션에서 감지 기준을 정의합니다. 예를 들어 #e > 5를 사용하려면 이벤트 수가 5개 (5)를 초과해야 알림이 트리거됩니다. 계산을 실행하지 않더라도 condition 섹션이 필요하며 이벤트 변수 (예: #e)의 존재를 명시해야 합니다. 환경의 기준을 분석하여 거짓양성을 최소화하면서 의심스러운 활동을 포착하는 기준을 설정하세요. 계산을 수행하지 않는 경우에도 condition 섹션이 필요하며 #e와 같은 이벤트 변수의 존재를 명시해야 합니다. |
#e > 5 또는 $e |
이 구조의 작동 방식을 이해하려면 다음 예시를 참고하세요.
예: 무차별 대입 감지 (로그인 실패 여러 번)
다음 예는 24시간 내에 단일 사용자의 로그인 시도가 여러 번 실패한 것을 감지합니다.
rule DailyFailedLoginAttempts { meta: author = "Alex" description = "Detects multiple failed login attempts for a single user within a day." severity = "Medium" events: $e.metadata.event_type = "USER_LOGIN" $e.security_result.action = "FAIL" $e.principal.user.userid != "" $userid = $e.principal.user.userid match: $userid over 1d outcome: $daily_failed_login_count = count($e.metadata.id) condition: $daily_failed_login_count > 5 }
검색을 YARA-L 규칙으로 변환
완료된 검색어를 감지를 생성하는 신뢰할 수 있는 규칙으로 변환하려면 일반적으로 다음 단계를 따릅니다.
- Google SecOps에서 규칙 편집기로 이동합니다.
- 새 규칙을 시작합니다.
- 검색어를 붙여넣고 다음과 같은 규칙 구조에 맞게 수정합니다.
meta섹션: 규칙 이름, 작성자, 심각도 수준을 포함한 메타데이터 규칙을 정의합니다.event섹션: 필수 검색과 달리 이름이 지정된event섹션 헤더가 있어야 합니다.- 이벤트 변수: 로직 내에서 특정 이벤트 (또는 이벤트 그룹)를 선언하고 참조합니다.
- 지원되는 기간이 있는
match섹션: 그룹화 키를 지정하고 시간 매개변수 (예:5m또는1d)를 정의합니다. 참고: 규칙에서match섹션을 사용하는 경우 기간을 추가해야 합니다. condition섹션: 규칙을 트리거하기 위해 충족해야 하는 최종 로직 또는 임계값을 정의합니다.
고급: 멀티 이벤트 규칙 빌드
멀티 이벤트 규칙을 사용하여 특정 기간 내에 발생하는 다양한 유형의 활동을 상호 연관시킵니다. 단일 이벤트를 살펴보는 대신 사용자가 로그인한 후 즉시 비정상적인 파일 다운로드를 실행하는 등 여러 이벤트를 연결하여 복잡한 위협을 식별합니다.
멀티 이벤트 규칙에는 다음 섹션이 필요합니다.
meta: 규칙 이름과 설명 세부정보가 포함됩니다.events: 이벤트 변수를 사용하여 데이터 소스와 필터를 정의합니다.match: 이벤트를 연결하는 데 사용되는 기간과 자리표시자 변수를 설정합니다.outcome알림에 대한 추가 컨텍스트를 캡처합니다. 다중 이벤트 규칙에는 집계 함수가 필요합니다.condition: 규칙이 트리거되려면 어떤 이벤트 변수가 있어야 하는지 지정합니다.
다중 이벤트 규칙을 빌드하려면 다음 단계를 따르세요.
- 이벤트 변수 정의: 이벤트 섹션에서
"PROCESS_LAUNCH"이벤트를 캡처하는$e1와 특정 악성 파일 해시를 캡처하는$e2를 정의합니다. - 자리표시자와 상관관계 지정:
$user자리표시자 변수를 사용하여 공유 주 구성원 사용자 ID (예:$user = $e1.principal.user.userid and $user = $e2.principal.user.userid)로 이 두 개의 개별 이벤트 스트림을 연결합니다. - 일치 항목 그룹화:
match섹션에서 이러한 이벤트가 5분 (5m)과 같은 설정된 시간 내에 동일한$user에 대해 발생해야 한다고 지정합니다.
예: 멀티 이벤트 규칙 빌드
다음 예에서
$e1는PROCESS_LAUNCH이벤트를 나타내고$e2는 특정 악성 해시가 있는 이벤트를 나타냅니다.$user자리표시자 변수는 동일한 기본 사용자 ID로 이러한 이벤트를 상호 연관시킵니다.rule MultiEventExample { meta: author = "Alex" description = "Detects a bad hash execution or a process launch from a specific IP for the same user." events: $e1.principal.ip = "1.1.1.1" $e1.metadata.event_type = "PROCESS_LAUNCH" $e2.target.file.sha256 = "badhash..." $user = $e1.principal.user.userid $user = $e2.principal.user.userid match: $user over 5m condition: $e1 or $e2 }
다음 규칙 구성요소는 예에 사용된 논리를 설명합니다.
- 이벤트 변수: 두 개의 이벤트 변수
$e1및$e2를 정의했습니다. 자리표시자 변수$user를 사용하여 공통userid필드에서 이러한 이벤트를 조인했습니다. match섹션: 이 멀티 이벤트 규칙에match섹션을 포함하여 사용자를 기준으로 그룹화하고 이벤트의 상관관계를 지정하는 5분 (5m)의 홉 기간을 지정했습니다.condition섹션: 알림을 트리거하는 로직을 정의했습니다. 이 예시에서는 첫 번째 또는 두 번째 이벤트가 있는 경우 알림을 트리거합니다.
다른 도구를 사용하여 쿼리 빌드
이러한 도구는 YARA-L 채택을 작성, 검증, 가속화하는 데 필수적인 도구입니다.
- UDM 조회 도구: UI 내에서 직접 UDM 필드 이름, 정의, 데이터 유형을 빠르게 검색하고 참조할 수 있습니다. 필드 ID를 알 수 없는 경우 이 참조를 먼저 확인하세요.
- 자연어에서 YARA-L로 검색: 검색창에 설명을 입력하여 초기 쿼리를 작성하거나 해당 YARA-L 제안을 가져오거나 번역합니다.
- SPL → YARA-L 변환기 (Labs 도구): 경쟁업체 플랫폼에서 전환하는 경우 이 도구 (Labs 섹션에서 사용 가능)를 사용하여 기존 Splunk SPL 쿼리를 YARA-L로 변환합니다. 이렇게 하면 구조화된 시작점이 생성되어 마이그레이션이 가속화되고 감지 로직이 개선됩니다. Labs 도구를 사용하려면 Google SecOps에서 yourinstancename.chronicle.security/labs로 이동하세요.
다음 단계
- 전체 YARA-L 2.0 문법 살펴보기
- YARA-L 2.0의 함수 찾아보기
- 다음 리소스에서 예시를 찾아보세요.
- 예: YARA-L 2.0 쿼리
- Google SecOps 커뮤니티)
- 다음 YARA-L 리소스를 자세히 알아보세요.
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.