Wazuh의 Agent·Decoder·Rule·FIM
Wazuh에서는 단말의 수집 상태와 중앙 분석 결과를 이어서 확인한다. Agent 연결과 실제 보안 이벤트 수집은 별도로 검증해야 한다.
개념부터 찾아보기
정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.
이 노트에서 설명할 수 있게 되는 것
- Agent 수집과 Server 분석, Indexer·Dashboard 역할을 분리한다.
- 사전 해석·Decoder·Rule 단계에서 실제 추출값을 확인한다.
- FIM 기준선·변경 탐지·정상 작업의 관계를 설명한다.
01개념과 구성 요소
- 엔드포인트 로그·파일 변화·인벤터리·정책 검사 결과를 수집한다.
- 를 관리하고 ·로 메시지를 분석한다.
- ·검색용 저장과 조사 화면을 담당하며 자료 종류·버전에 따라 전달 경로가 다를 수 있다.
02JSON 로그가 Wazuh 경보가 되는 순서
- localfile 읽기가 location과 log_format에 맞는 파일을 읽는다. 파일 접근권한과 회전 후 경로도 입력에 영향을 준다.
- Manager 수신이벤트 연결로 자료가 에 도착한다. 등록 성공은 이 자료의 도착 증명과 다르다.
- 필드 추출메시지 형식에 따라 pre-decoding과 가 헤더·JSON 필드 등을 해석한다.
- 평가decoded_as·field·상속·빈도 같은 조건을 평가하고 최종 ID·level·group을 결정한다.
- 경보 저장·전달기록 임계값에 맞는 경보를 alerts에 남기고 해당 전달 경로로 에 보낸다. 모든 수신 이벤트가 경보인 것은 아니다.
- 조회·선택적 대응시간·권한·index 조건으로 조회하고 설정된 가 있을 때 별도 대상·만료 정책으로 실행한다.
03Agent·Server·Indexer·Dashboard
- 구성요소는 엔드포인트 로그··인벤터리·설정 검사 결과를 수집하고 는 관리와 · 분석을 수행한다. 는 검색을 위한 저장, 는 조사·관리 화면을 담당한다.
- 배치와 역할모든 구성요소가 한 호스트에 있는 학습 환경과 역할별로 나뉜 환경에서도 이 책임 구분은 유지된다.
- 자료별 전달4.x 경보와 선택적 archive는 Filebeat 전달 경로를 사용하지만 인벤터리·취약점 등 일부 데이터는 버전에 따라 connector 경로를 사용한다. 모든 종류가 같은 파일과 전송기를 거친다고 단정하면 일부 화면의 실패를 잘못 진단한다.
- Active의 범위가 Active라는 것은 연결 상태의 근거이며 원하는 로그·모듈이 실제 이벤트를 보내는 증거와는 다르다.
인증서 준비 오류에서 대시보드와 이벤트 분석까지
설치 명령의 실행, 웹 화면 표시, 보안 이벤트 분석을 서로 다른 성공 조건으로 나누어 구성을 확인한다.
실습 구성과 전제
- 자신이 관리하는 격리 에서 공식 배포본의 인증서 준비 스크립트와 설치 버전을 확인한다.
- 아래 터미널과 로그인 화면은 구성 과정의 서로 다른 자료다. 같은 시각에 모든 구성 요소가 정상 동작했다는 증거로 묶지 않는다.
실행 거부가 난 위치를 파일 권한에서 찾기
- ./파일은 커널에 그 파일의 직접 실행을 요청한다. 실행 비트, 상위 디렉터리 접근권, 마운트의 noexec, 보안 정책 등이 실행 허용에 영향을 준다.
- bash 파일은 Bash가 파일 내용을 읽는 방식이다. 두 호출의 차이는 인증서 내용의 문제가 아니라 실행 경로의 문제를 좁히는 단서이며, 신뢰하지 않는 스크립트에 우회 실행을 적용하면 안 된다.
bashls -l ./wazuh-certs-tool.sh file ./wazuh-certs-tool.sh findmnt -T ./wazuh-certs-tool.sh원인 확인용 읽기 명령. 인증서 생성이나 권한 변경을 자동 실행하지 않는다.
원본 크기로 보기 ↗- ./wazuh-certs-tool.sh -A 다음에 Permission denied가 표시되어, 이 호출로 인증서 생성이 완료되었다고 볼 수 없다.
- 다음 줄은 bash로 같은 스크립트를 지정한다. 화면에 최종 생성 목록이 없으므로 재호출 자체와 생성 성공을 구분한다.
확인 기준권한·마운트·스크립트 출처를 확인한 뒤 공식 설치 단계의 생성 파일과 종료 결과를 별도로 검사한다.
로그인 화면을 TLS와 애플리케이션 두 층으로 읽기
- HTTPS 접속은 의 웹 서비스에 도달했음을 보여 주지만, 인증서의 신뢰 체인·접속 이름·유효기간 검사는 별도다. 주소창의 경고를 비밀번호 오류로 해석하지 않는다.
- 로그인 양식이 보이는 단계는 아직 인증 전이다. 의 저장 상태나 연결 수는 로그인 이후 해당 관리 화면과 서비스 상태로 확인해야 한다.
원본 크기로 보기 ↗- Wazuh 로그인 양식과 가려진 비밀번호 입력란이 보인다. 인증 성공 후의 이벤트 목록은 아직 나타나지 않는다.
- 브라우저 주소창에는 연결에 대한 주의 표시가 있다. 화면만으로 원인을 한 가지로 확정할 수 없어 인증서 세부 정보 확인이 필요하다.
확인 기준인증서 검증 결과와 웹 로그인 결과를 따로 기록한다. 로그인 화면만으로 수집·분석·저장 전 구간 정상이라고 판정하지 않는다.
Decoder와 Rule까지 한 이벤트를 따라가기
- 에서 에 승인된 샘플 한 줄을 입력하면 사전 해석, 필드 추출, 일치 결과를 순서대로 볼 수 있다. 규칙을 고치기 전에 어떤 필드가 만들어졌는지 확인한다.
- 이 도구의 성공은 분석 엔진의 해당 입력 시험이다. 실제 가 같은 형식의 로그를 보내는지, 경보가 에 저장되는지는 이벤트 식별값과 시각으로 추가 추적한다.
bashsudo /var/ossec/bin/wazuh-logtest설치된 에서 분석 시험기를 여는 예. 입력에는 비밀값을 제거한 실습 로그를 사용한다.
확인 기준Phase별 결과와 실제 경보 문서의 .id··시각을 비교한다. 실습 출력이 없는 단계는 재현 과제로 남긴다.
실습에서 확인한 동작 원리
- 실행 권한· 신뢰·사용자 로그인·보안 이벤트 수집은 실패 위치가 서로 다르다.
- 단일 로그의 규칙 일치와 실제 파이프라인 끝의 검색 성공을 각각 검증해야 탐지 누락을 좁힐 수 있다.
설정·출력 추가로 확인하기 3장
아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.
실습 화면 묶음 01 1장
원본 크기로 보기 ↗- 에 삽입된 원본 학습 화면이다. Wazuh 경보에서 sshd 접근 시도의 인증 실패 설명·규칙 수준·규칙 ID를 읽는 화면이다.
실습 화면 묶음 02 1장
원본 크기로 보기 ↗- 학습 원본 · Wazuh 설치와 관리자 접속의 Wazuh/Audit에 수록된 화면·도식이다.
실습 화면 묶음 03 1장
원본 크기로 보기 ↗- 학습 원본 · Wazuh 설치와 관리자 접속의 Wazuh/Audit에 수록된 화면·도식이다.
04등록·이벤트·API 경로를 나누어 읽기
- 포트와 목적기본 예의 등록 1515/, 이벤트 1514/, API 55000/, API 9200/, HTTPS 443/는 서로 다른 역할이다. 등록이 성공해 키를 받았어도 이후 이벤트 연결이나 파일 읽기가 실패할 수 있다.
- 변경된 구성실제 구성에서 변경된 포트·프로토콜도 고려해야 한다.
- ID ID·호스트 이름·IP는 동일한 개념이 아니다. 나 ·클론 때문에 주소와 표시 이름이 같거나 바뀔 수 있다.
- 시점별 자산사건을 추적할 때는 고유 식별과 사건 시점의 자산 정보를 연결해야 하며, 단지 같은 host.name이라는 이유만으로 모든 이벤트를 한 자산으로 합치면 안 된다.
05localfile은 무엇을 어떤 문법으로 읽을지 정한다
- Location·Formatlocalfile의 location은 실제 파일 위치이고 log_format은 그 파일의 메시지 형식이다. JSON 한 줄을 로 해석하거나 여러 줄 이벤트 경계를 잘못 설정하면 필요한 필드가 추출되지 않는다.
- 읽기 권한파일이 존재해도 실행 계정이 읽지 못하거나 회전 후 새 파일에 접근하지 못하면 수집은 멈출 수 있다.
- 설정 조각아래는 가상 교육 JSON 로그를 읽는 부분 설정이다. 기존 ossec.conf를 이 조각으로 덮어쓰는 예가 아니다.
- 전달 단계파일에 문장이 기록됨→가 읽음→manager가 수신함→규칙이 일치함→로 전달됨은 서로 다른 단계이다.
<localfile>
<log_format>json</log_format>
<location>/var/log/training/events.json</location>
</localfile>
교육 이벤트:
{"event":"training_auth","user":"learner","result":"failure"}원리를 설명하는 가상 학습 예시입니다.
06Pre-decoding·Decoder·Rule
- Pre-decoding· 형태라면 pre-decoding이 시각·호스트·프로그램 이름 같은 앞부분을 읽을 수 있다. 는 메시지 내용을 필드로 분해하고 은 그 필드와 문맥이 특정 조건을 만족하는지 평가한다.
- 필드와 경보가 값을 뽑았다는 사실만으로 경보가 생기지 않으며, 다른 가 먼저 일치하면 기대한 필드가 없을 수 있다.
- JSON JSON 형식은 기존 JSON 를 활용할 수 있다. 아래 규칙은 무해한 training_auth 이벤트 중 result=failure인 것만 찾는다.
- 필드decoded_as는 적용 조건, field는 추출된 필드의 조건, level은 경보 수준, group은 분류 정보다. 실제 적용은 기존 규칙과 ID 중복·상속 관계까지 확인해야 한다.
<group name="training,">
<rule id="100100" level="5">
<decoded_as>json</decoded_as>
<field name="event">^training_auth$</field>
<field name="result">^failure$</field>
<description>Training authentication failure</description>
</rule>
</group>사용자 규칙 범위의 학습 예입니다. 기존 정책과 충돌하지 않는 ID 선택 및 logtest가 필요합니다.
07단일 이벤트 규칙과 시간 내 누적 규칙
- 현재 이벤트if_sid는 현재 이벤트에서 먼저 일치한 규칙을 조건으로 후속 규칙을 적용한다. 과거 여러 이벤트를 센다는 뜻이 아니다.
- 과거 일치if_matched_sid는 frequency·timeframe과 함께 이전 일치 이력을 활용한다. 같은 로그 내용 안의 문자열 반복 횟수와 구분한다.
- 필드별 누적는 동적 필드의 같은 값끼리 누적하는 데 사용한다. 사용자·주소 같은 정적 필드용 옵션과 문법을 구분한다.
- 기초 레벨level=0 규칙은 if_matched_sid의 이력 조건으로 사용할 수 없다는 제약이 있다. 경보 출력 억제와 상관분석의 기초 이벤트 보존을 혼동하지 않는다.
- 분석 범위기본 frequency 누적은 같은 에서 발생한 이벤트를 대상으로 한다. 를 설정하면 해당 Manager의 여러 이벤트를 함께 센다. 이름에 global이 있어도 클러스터 전체의 공통 카운터는 아니다.
08가상 key2 값별 네 번째 일치 추적
- 규칙 조건기초 JSON 규칙이 모든 표본에 일치하며 frequency=4·timeframe=300·=key2라고 가정한다. 모두 같은 분석 범위 안에서 300초 이내에 들어온다.
- 첫 두 표본key2=A인 이벤트 두 개가 들어오면 A의 이력은 2개다. 아직 A 네 개라는 조건은 충족하지 않는다.
- 다른 값세 번째 이벤트의 key2=B는 B 이력으로 구분한다. 전체 이벤트 수가 3이어도 A는 2개다.
- 다음 표본전체 순서의 네 번째 이벤트(A)에서 A 이력은 3개이고, 다섯 번째 이벤트(A)에서 4개가 되어 해당 상관 조건을 만족한다.
- 검증 방법개별 디코딩 필드와 표본 순서·시각을 함께 대조한다. 실제 적용 버전과 반복 경보 억제 설정은 별도 결과로 기록한다.
<group name="training_depth,">
<rule id="100201" level="3">
<decoded_as>json</decoded_as>
<field name="kind">^training$</field>
<description>Training base event</description>
</rule>
<rule id="100202" level="8" frequency="4" timeframe="300">
<if_matched_sid>100201</if_matched_sid>
<same_field>key2</same_field>
<description>Training field correlation</description>
</rule>
</group>공식 규칙 문법을 적용한 가상 학습용 규칙. kind=training인 JSON의 key2를 A,A,B,A,A 순서로 비교하는 구조이며 실제 엔진에서 실행한 결과는 아니다. 설치 시 기존 ID와의 충돌을 확인해야 한다.
09개별 규칙은 맞지만 누적 경보가 없는 경우
- 필드 정체에 지정한 동적 필드가 실제 디코딩 결과에 같은 이름·값으로 존재하는지 확인한다. 대소문자·공백도 값 비교를 바꿀 수 있다.
- 기초 규칙기초 SID·레벨·그룹이 맞는지 확인한다. level 0과 no_log는 같은 방식의 이력 처리라고 가정하지 않는다.
- 시간 조건timeframe 밖의 이벤트, 분석기 재시작, 다른 범위로 분리된 이벤트가 섞였는지 본다.
- 저장 경로규칙이 경보를 만든 뒤에도 alerts 전달· 적재· 시간 범위에서 빠질 수 있다. 분석 결과와 화면 표시를 단계별로 구분한다.
- Logtest의 같은 이력빈도 규칙 표본은 같은 실행 세션에서 순서대로 넣는다. API에서는 첫 응답의 logtest token을 후속 요청에 재사용해야 이력이 이어진다. 누락·잘못된 token은 새 세션을 만든다.
- 두 token의 구분API 인증용 Bearer JWT와 logtest 이벤트 이력을 고르는 본문의 token은 역할이 다르다. API 인증이 성공해도 매번 새 logtest 세션을 만들면 앞선 표본은 같은 빈도 이력에 누적되지 않는다.
10문자열 Decoder의 캡처 그룹과 필드 순서
- ·Order구조가 없는 앱 로그에서는 program_name 또는 prematch로 메시지 종류를 좁히고 의 캡처 그룹을 order에 나열한 필드로 연결할 수 있다. 그룹 순서와 order가 어긋나면 user 자리에 result가 들어가는 식의 조용한 오류가 생긴다.
- 문법·누락부분 일치·공백·PID·누락 값과 사용하는 엔진의 문법도 결과를 바꾼다.
- 부모·자식 부모 는 공통 헤더를 인식하고 자식이 세부 패턴을 추출하는 데 활용할 수 있다. 그러나 특정 프로그램 이름을 흉내 낸 메시지가 자동으로 신뢰되는 것은 아니다.
- 출처 신뢰수집 경로·발생 호스트·원본 보존이 함께 있어야 추출 필드를 실제 행위의 근거로 사용할 수 있다.
11wazuh-logtest가 증명하는 것
- Logtest 단계logtest에서는 한 원본 메시지를 넣고 pre-decoding, 이름·추출 필드, 최종 ID·level·group을 단계별로 읽는다. 성공한 로그, 실패 로그, 필드가 빠진 로그를 비교하면 파서가 지원하는 범위가 보인다.
- 빈도 규칙빈도 상관 규칙은 여러 입력의 순서·시각·같은 필드 조건이 필요하므로 단일 줄 시험만으로 충분하지 않다.
- SSH 규칙 구분모든 SSH 인증 실패가 5710으로 분류되는 것은 아니다. 4.14 규칙의 invalid/illegal user 패턴과 일반 인증 실패 패턴은 구분되며 부모·자식 규칙에 따라 최종 ID가 달라진다.
- 전달 검증 한계입력 메시지의 실제 내용과 설치한 규칙 버전을 기준으로 읽는다. logtest 통과는 Filebeat나 까지 전달되었다는 증명이 아니다.
- 시험 메시지 입력에 실제 형식의 정상·실패·누락 필드 표본을 각각 넣는다.
- 추출 단계 확인Pre-decoding과 이름·필드가 기대한 값인지 확인한다.
- 최종 규칙 대조 ID·level·group을 비교하고 빈도 규칙은 필요한 입력 순서와 같은 주체 조건을 함께 재현한다.
- 전달 단계 분리Logtest 결과와 실제 →→→의 전달 시험은 별도 근거로 남긴다.
12FIM 기준선·해시·속성·내용 차이
- 기준선·변화은 감시 경로의 기준 상태를 만든 뒤 생성·수정·삭제·권한·해시 등 변화를 비교한다. 실시간 감시와 주기 검사는 관찰 시점과 지원 조건이 다르다.
- 내용 차이변경 탐지와 변경 전후 내용을 저장하는 report_changes는 별도 기능이며, 해시가 달라졌다는 사실만으로 어떤 줄이 바뀌었는지 알 수 없다.
- Nodiffnodiff는 비밀이 들어 있는 파일의 내용 차이 보관을 제외하는 설정이다. 정상 배포·패치도 파일을 바꾸므로 경보는 변경 사실을 알려 주며 악성 의도를 자동 증명하지 않는다.
- 변경 승인파일 경로··시각·변경 속성과 승인된 변경 기록을 연결한다. 전체 루트를 감시하는 것보다 의미 있는 구성 파일부터 정의하면 잡음과 비용을 통제할 수 있다.
13alerts와 archives는 서로 다른 집합
- Alertsalerts.json에는 규칙과 기록 임계값에 맞는 경보가 저장된다. 수신 이벤트 모두가 경보가 되지 않으므로 경보 검색에서 결과가 없다고 미수집으로 확정할 수 없다.
- Archives선택적으로 logall_json을 켜면 원본 이벤트 archive를 남길 수 있고 검색을 원하면 해당 전달도 별도로 구성해야 한다.
- 보관 비용archive 보관은 디스크·개인정보·비밀 유입과 보존량을 늘린다. “는 원본을 저장하지 않아 항상 가볍다”는 비교는 맞지 않는다.
- 검색 시각archive의 timestamp와 다른 제품의 @timestamp를 혼동하면 문서는 저장되어도 화면 시간 필터에서 빠질 수 있다.
14SCA·Inventory·취약점 결과의 의미
- ·Inventory는 정책이 정의한 설정 조건을 점검하고 인벤터리는 패키지·운영체제 등의 상태를 수집한다. 점수 하나는 적용 정책과 점검 가능 항목의 범위를 반영하며 시스템 전체의 안전을 수치 하나로 보증하지 않는다.
- 취약점 조건취약점 결과도 패키지 버전·배포판·벤더의 수정 정보와 실제 적용 조건을 읽어야 한다.
- 갱신 시점 로그 탐지와 인벤터리 상태의 갱신 주기가 다르면 화면의 시각도 다를 수 있다. 패치 직후 이전 상태가 표시될 때 수집 시점과 재평가를 구분한다.
- 분류 메타데이터외부 취약점 번호·MITRE 기술·규정 매핑은 분류와 조사 경로를 돕는 메타데이터이지 공격 성공이나 규정 준수의 자동 증거는 아니다.
15Active Response와 저장 흐름의 끝
- 는 경보에 따라 제한된 조치를 수행하는 별도 실행 경로다. 경보의 srcip를 잘못 파싱하면 엉뚱한 대상이 차단될 수 있으므로 규칙 정확성과 대응 대상의 의미가 선행한다.
- 대응 상태반복 동작·만료·예외·실패·복구 상태를 명시해야 경보가 늘어날 때 대응 시스템 자체가 장애를 만들지 않는다.
- 누락 추적화면에 이벤트가 없을 때는 source 파일→ 수집→manager 분석→alerts/archive→전달 인증·권한→index→조회 기간을 따라간다. 한 단계가 정상이어도 이후 수집·분석·저장·조회 단계는 별도로 실패할 수 있다.
설명과 함께 보는 보조 도식
모식도 · Wazuh 수집과 분석
시험 도구의 규칙 매칭과 실제 전송 경로를 구분한다.
관찰
실제 감시 대상의 이벤트가 생성되는지 확인한다.
전체 단계를 한 번에 읽기
- 01
관찰
실제 감시 대상의 이벤트가 생성되는지 확인한다.
- 02
해석
원본 표본과 추출 필드를 비교한다.
- 03
평가
규칙과 필요한 세션 내 반복 조건을 확인한다.
- 04
저장·조회
중앙 저장과 화면 시간 범위를 각각 확인한다.
- 시험 도구
- 전체 전송의 대체 검증 아님
함께 보는 학습 자료
아래 공식 자료를 본문의 개념·예제와 함께 읽어 보세요. 자료별로 확인할 위치와 관찰할 내용을 적었습니다.
Wazuh: Decoder·Rule 및 누적 테스트 세션
로그 한 줄의 분석 단계와 같은 token으로 후속 표본을 넣는 예를 읽어 단일 규칙과 이력 규칙을 구분한다.
- pre-decoding·decoding· 출력
- API 인증 JWT와 logtest token의 차이
- 세션을 유지했을 때만 이어지는 표본 이력
Wazuh: frequency·same_field·global_frequency
동적 필드별 반복 예제와 집계 범위의 제한을 읽어 경보 발생 여부를 표본 순서로 추적한다.
- 같은 필드 값별 frequency 누적
- level 0과 if_matched_sid 제약
- 는 Manager 범위이며 cluster 전체가 아님
이해했는지 확인하기
- Agent 연결과 필요한 모듈의 실제 이벤트 수집을 각각 확인한다.
- 동일 로그 표본으로 Decoder·Rule 결과를 검증한다.
- FIM 변경을 정상 배포·패치 이력과 비교한다.