OpenSearch에서 이상치란 시계열 데이터에서 발생하는 비정상적인 동작 변화를 의미한다.
시각화 및 대시보드와 같은 기존 방법으로는 이상 징후를 파악하기 어려울 수 있다.
고정된 임계값을 기반으로 알림을 설정하는 것도 가능하지만, 이 접근 방식은 해당 분야에 대한 사전 지식이 필요하며, 자연스러운 성장이나 계절적 추세를 보이는 데이터에는 적응하지 못할 수 있다.
이상 탐지 기능은 랜덤 컷 포레스트(RCF)알고리즘을 사용하여 OpenSearch 데이터의 이상 징후를 거의 실시간으로 자동 감지합니다.
RCF는 비지도 학습 알고리즘으로, 입력 데이터 스트림의 개략적인 형태를 모델링하여 각 데이터 포인트에 대한 이상 등급 과 신뢰도 점수를 계산합니다.
이러한 값은 이상 징후를 정상적인 변동과 구분하는 데 사용된다.
데이터 선택창 에서 인덱스 드롭다운 메뉴 에서 하나 이상의 소스를 선택하여 데이터 소스를 지정합니다.
web-logs-2023-10-01(특정 날짜의 로그가 담긴 인덱스)인덱스 패턴에 와일드카드(*)를 사용할 수 있습니다.
공식문서에 따르면, 와일드 카드(*) 는 여러 문자를 대체하는 기호 입니다.
이를 사용하여 이름이 유사한 여러 인덱스를 하나의 그룹으로 묶을 수 있습니다.
server-log-2025.01.01, server-log-2025.01.02, server-log-2025.01.03,....server-log-*server-log-로 시작하는 모든 날짜의 인덱스가 이 데이터 소스에 포함되어 분석 대상이 됩니다.참조:OpenSearch는 Multi-target syntax를 지원하여, 쉼표,로 구분된 목록이나 와일드카드*를 통해 여러 인덱스로 요청을 라우팅 합니다.
이 기능은 선택한 인덱스(또는 패턴)안에 있는 데이터 중,
분석에 불필요한 데이터를 미리 걸러내는(Filtering)역활을 한다.
이 부분은 보통 OpenSearch Query DSL (Domain Specific Language) 형태나 간단한 KQL(Kibana Query Language) 필터를 사용한다.
web-logs-*를 분석하여 공격 시도를 찾고 싶습니다. 하지만 로그에는 정상적인 접속 기록에 200ok가 99% 입니다.response_code가 200이 아닌 것만 필터링.tags 필드에 error또는 failure가 포함된 것만 필터링.Query DSL
{
"bool": {
"filter": [
{
"term": {
"status": "error"
}
}
]
}
}
위와 같이 설정하면, 전체 로그 중 status가 error인 데이터만 쓱 뽑아서 이 "데이터 소스"로 정의하겠다는 의미 입니다.
cluster-name:index-name패턴을 사용하여 해당 인덱스에 액세스할 수 있습니다.피처는 이상 탐지 모델(Random Cut Forest 알고리즘)이 학습하고 감시해야 할 핵심 지표입니다. 쉽게 말해, 인공지능에게 "이 데이터의 흐름을 지켜보고 이상하면 알려줘"라고 지정하는 대상입니다.
집계 방법(Aggregation Method)
이상 탐지기는 실시간으로 들어오는 로그 하나하나를 분석하는 것이 아니라,
설정한 탐지 주기(Detector Interval, 예 1분, 5분) 동안의 데이터를 모아서 하나의 값으로 요약(집계)한 뒤 분석합니다.
| 메서드 | 영문 표기 | 설명 | 추천 사용 사례 |
|---|---|---|---|
| 개수 | count() | 해당 주기 동안 발생한 로그의 총 개수를 셉니다 (필드 선택 불필요) | - 트래픽 폭주(DDoS)탐지 - 로그 유실 감지(0에 가까워질 때) |
| 평균 | average() | 선택한 필드 값들의 평균을 계산합니다. 전반적인 추세를 보는 데 가장 안정적 입니다. | - 평균 응답 속도(Latency) - CPU/메모리 평균 사용률 |
| 합계 | sum() | 선택한 필드 값들을 모두 더합니다 | - 총 데이터 전송량(Bytes) 주문총액(이커머스 등) |
| 최소/최대 | min()/max() | 해당 주기 내의 최솟값 또는 최댓값을 찾습니다. 노이즈(뒤는 값)에 민감할 수 있습니다. | - 디스크 여유 공간(min)(갑자기 0이 될 때) - 최대 지연 시간(Max) (대부분 정산인데 하나가 엄청 느릴때) |
이상 징후 기준(Find anomalies based on)
데이터를 가져오는 방식을 선택한다.
cpu_usage, bytes_senttotal_memory와 free_memory만 있을 때,(total - freee) / total 계산식을 넣어 메모리 사용률 이라는 새로운 지표를 만들어 분석할 수 있습니다.필드(Field)
집계할 대상이 되는 구체적인 데이터 항목을 선택한다.
Category Field에서 사용합니다.GROUP BY와 유사합니다.Split a single time series into multiple time series의 의미제약 조건 및 필수 확인 사항
시스템 성능과 모델의 구조적 한계 때문에 제약 사항이 존재한다.
Region10개 x OS5개 = 50개의 모델 생성Only ip and keyword OpenSearch data types
ip: ip주소 (192.168.1.1)keyword: 텍스트지만 분석되지 않은 완전 일치 문자열 (예) user_id, host_name, error_code)text(분석된 긴 문장), integer/float(연속된 숫자)등은 범주(Category)로 나누기에 적합하지 않아 사용할 수 없습니다.생성 후 변경 불가
| 상황 | 범주형 필드 설정 예시 | 분석 결과 |
|---|---|---|
| DDoS 공격 감지 | client_ip | 전체 트래픽은 정상이지만, 특정 해커 ip 하나가 접속을 시도하는 것을 탐지 |
| 마이크로서비스 모니터링 | service_name | 전체 시스템은 괜찮은데, 결제 서비스(Payment)만 응답이 느려지는 것을 탐지 |
| 서버 하드웨어 장애 | host_name | 웹 서버 100대 중 web-03번 서버만 CPU가 튀는 것을 탐지 |
요약: 이 단계는 "전체를 뭉뜽그려 볼 것인가?(OFF) 아니면 "개별 타겟별로 쪼개서 볼 것인가?(ON) 결정 하는 단계
이 설정은 이상 탐지 알고리즘(Random Cut Forest)가 과거의 데이터를 얼마나 참고해서 현재를 판단할지 를 결정하는 매우 중요한 파라미터 입니다.
요약
일반적인 경우 기본값 8을 그대로 두세요
즉각적인 스파이크 감지가 중요할때, 값을 조금 줄여 볼 수 있지만 4 오탐이 늘어날 각오를 해야 한다
복잡한 패턴 변화를 감지해야 할때: 값을 늘립니다.
하지만 60을 초과 할 수 없습니다.
설정한 이상 탐지기(Detector)를 즉시 가동할지, 아니면 나중에 수동으로 켤지를 결정하는 마지막 단계이다.
실시간 탐지란 무엇인가?
장점: 별도의 조작 없이 바로 초기 학습(Cold Start)에 들어가므로, 가장 빠르게 탐지 결과를 받아볼 수 있습니다.
대부분의 경우 이 옵션을 체크한 상태로 두시면 됩니다.
☐ 체크 해제 (수동 시작)
동작: 탐지기 '설정'만 저장되고, 실제로 데이터 분석은 시작하지 않습니다. 상태가 Disabled나 Stopped로 생성됩니다.
언제 사용하나요?
과거 데이터 분석(Historical Analysis)만 필요할 때: 실시간 감시는 필요 없고, 지난달 로그만 분석해보고 싶을 때 리소스 낭비를 막기 위해 끕니다.
유지보수 시간일 때: 지금 당장은 서버 점검 중이라 데이터가 엉망진창일 것이 예상되어, 점검이 끝난 후 깨끗한 데이터부터 학습시키고 싶을 때.
리소스 관리: 클러스터 부하가 심해 나중에 트래픽이 적을 때 켜고 싶을 때.