yon11b

[SK 쉴더스 루키즈] 중앙집중형 로그 관리 환경 구축(Fluent-Bit, OpenSearch Dashboard) 본문

보안/SK 쉴더스 루키즈

[SK 쉴더스 루키즈] 중앙집중형 로그 관리 환경 구축(Fluent-Bit, OpenSearch Dashboard)

yon11b 2026. 5. 9. 00:43
반응형

이 글은 OWASP top 10 중 Logging & Alerting Failures에 대응하기 위한 중앙집중형 로그 관리 환경 구축 방법을 정리한 글입니다.

 

실습 개요

Docker 컨테이너랑 리눅스 시스템에서 나오는 로그를 Fluent Bit으로 빨아들여서 → OpenSearch라는 검색 엔진에 저장하고 → 웹 대시보드(Dashboards)에서 보는 파이프라인을 직접 구축해보는 실습

 

중앙집중형 로그 관리를 해야 하는 이유

여러 프로그램, 서버를 동시에 실행한다면, 각 파일에 직접 하나씩 들어가서 로그를 확인하는게 쉽지 않을 것이다.

그래서 중앙집중식 로그 수집 파이프라인을 구성해야 하는 것이다.

로그 → 수집, 가공(Fluent Bit) → 저장, 검색(opensearch) → 시각화(opensearch dashboard)

전체 흐름

Fluent Bit

C언어로 만들어서 메모리 1MB만 쓰는 초경량 에이전트. 로그를 수집, 가공하여 목적지로 전달한다.

Fluent Bit의 핵심 철학: INPUT → FILTER → OUTPUT

  • INPUT: 어디서 로그를 가져올지 (파일 읽기, 네트워크로 받기)
  • FILTER: 가공 (필드 추가/삭제/변환)
  • OUTPUT: 어디로 보낼지 (OpenSearch, S3, Kafka 등)
┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   INPUT     │───▶│   FILTER    │───▶│   OUTPUT    │
│  (수집)     │     │  (가공/추가 │     │    (전달)   │
└─────────────┘     └─────────────┘     └─────────────┘
  - tail           - record_modifier    - opensearch (단기저장소)
  - syslog         - grep               - kafka (파이프라인)
  - cpu            - lua                - s3 (장기저장소)

 

태그

로그 레코드에 붙는 라벨. INPUT에서 로그를 받자마자 즉시 붙는다.

  • 어떤 input에서 들어온 로그인지 구분
  • 어떤 filter, output을 적용할지 결정하는 기준이 됨
docker.* 태그  →  Docker 로그 INPUT에서 생성
syslog.* 태그  →  Syslog INPUT에서 생성

FILTER Match docker.*  →  docker.* 태그가 붙은 로그만 처리
OUTPUT Match syslog.*  →  syslog.* 태그가 붙은 로그만 OpenSearch로 전송

 

OpenSearch

인덱스 = 테이블, 문서 = 행, 필드 = 열

날짜별로 인덱스 자동 생성: docker-logs-2026.05.04

 

OpenSearch Dashboards

웹 UI. 로그 검색하고 차트 그리는 곳

 

 

Fluent-Bit 만들기

 

[INPUT] 어떤 파일들을 가져올 것인가? => docker log, syslog

[INPUT]
    Name              tail
    Tag               docker.*
    Path              /var/lib/docker/containers/*/*.log
    Parser            docker
    DB                /fluent-bit/db/docker.db
    Mem_Buf_Limit     50MB
    Skip_Long_Lines   On
    Refresh_Interval  10

[INPUT]
    Name              tail
    Tag               syslog.*
    Path              /var/log/syslog
    Parser            syslog-ubuntu
    DB                /fluent-bit/db/syslog.db
    Mem_Buf_Limit     5MB
    Skip_Long_Lines   On
    Refresh_Interval  10

 

 

[FILTER] 특정 tag 이름을 가진 것들만 match해서 필터링하기

[FILTER]
    Name    record_modifier
    Match   docker.*
    Record  log_source docker
    Record  collector_host ${HOSTNAME}

[FILTER]
    Name    record_modifier
    Match   syslog.*
    Record  log_source syslog
    Record  collector_host ${HOSTNAME}

 

 

[OUTPUT] OpenSearch로 전송

[OUTPUT]
    Name              opensearch
    Match             docker.*
    Host              opensearch-node1
    Port              9200
    HTTP_User         admin
    HTTP_Passwd       ${OPENSEARCH_INITIAL_ADMIN_PASSWORD}
    tls               On
    tls.verify        Off
    Logstash_Format   On
    Logstash_Prefix   docker-logs
    Logstash_DateFormat %Y.%m.%d
    Suppress_Type_Name On
    Include_Tag_Key   On
    Tag_Key           flb_tag

[OUTPUT]
    Name              opensearch
    Match             syslog.*
    Host              opensearch-node1
    Port              9200
    HTTP_User         admin
    HTTP_Passwd       ${OPENSEARCH_INITIAL_ADMIN_PASSWORD}
    tls               On
    tls.verify        Off
    Logstash_Format   On
    Logstash_Prefix   syslog-logs
    Logstash_DateFormat %Y.%m.%d
    Suppress_Type_Name On
    Include_Tag_Key   On
    Tag_Key           flb_tag

 

 

parser

filter 적용 전에 parser를 먼저 적용한다.

  1. docker 로그
    json.log 파일 안의 내용
    {"log":"GET /api/cars 200\\n","stream":"stdout","time":"2026-05-04T01:00:00.123456789Z"}
    
  2. parser 적용
    [PARSER]
        Name        docker
        Format      json
        Time_Key    time
        Time_Format %Y-%m-%dT%H:%M:%S.%L
        Time_Keep   On


    {
      "@timestamp": "2026-05-04T01:00:00.123Z",
      "log": "GET /api/cars 200\\n",
      "stream": "stdout",
      "time": "2026-05-04T01:00:00.123456789Z"
    }
    
  3. filter 적용 후
    [FILTER]
        Name    record_modifier
        Match   docker.*
        Record  log_source docker
        Record  collector_host ${HOSTNAME}


    {
      "@timestamp": "2026-05-04T01:00:00.123Z",
      "log": "GET /api/cars 200\\n",
      "stream": "stdout",
      "time": "2026-05-04T01:00:00.123456789Z",
      "log_source": "docker",
      "collector_host": "89f1b18a65d2"
    }
    

 

동작 확인- opensearch dasahboard에서 시각화

검색하려면 패턴을 만들어야 한다.

1. docker-logs-*

2. sys-logs-*

 

 

 

 

Discover에 들어가면 이제 확인할 수 있다.

docker logs

 

 

syslog-logs

 

검색도 된다 영어는 간단한 형태소 분석도 된다..

 

visualizations: 시각화 해서 차트로 보기(파이 차트)

 

discover → docker-logs → collector_host → flb_tag

94e9aa 컨테이너

 

 

discover → docker-logs → flb_tag→ flb_tag

 

 

728x90