Graylog 에서 로그 분석하기

NmapBeginner
지금 연습하기

소개

이 랩에서는 강력한 오픈 소스 로그 관리 플랫폼인 Graylog 를 사용하여 로그 데이터를 수집하고 분석하는 방법을 배웁니다. 중앙 집중식 로깅은 사이버 보안의 중요한 구성 요소로, 단일 인터페이스에서 시스템 이벤트를 모니터링하고, 이상 징후를 탐지하며, 보안 사고를 조사할 수 있게 해줍니다.

Docker Compose 를 사용하여 MongoDB 와 OpenSearch(Elasticsearch 의 현대적인 대체재) 를 포함한 전체 Graylog 스택을 배포하는 것부터 시작합니다. 그런 다음 Graylog 를 구성하여 로그 데이터를 수신하고, 샘플 로그를 전송하며, 정보 필터링을 위한 검색 쿼리를 수행하고, 마지막으로 주요 지표를 모니터링하기 위한 시각적 대시보드를 구축합니다. 이 랩이 끝나면 Graylog 에서 로그 분석의 기본 워크플로우에 대한 실습 경험을 쌓게 될 것입니다.

Docker Compose 로 Graylog 배포하기

첫 번째 단계에서는 Graylog 로깅 플랫폼을 배포합니다. 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하는 도구인 Docker Compose v2 를 사용할 것입니다. 이 접근 방식은 단일 구성 파일로 Graylog, OpenSearch, MongoDB 등 필요한 모든 구성 요소를 관리하여 설정 프로세스를 단순화합니다.

먼저 환경을 준비하고 서비스를 시작해 보겠습니다.

  1. 설정 스크립트에서 이미 Docker Compose v2 를 설치했습니다. 버전을 확인하여 설치를 검증할 수 있습니다.

    docker compose version

    다음과 유사한 Docker Compose 버전 표시를 볼 수 있습니다.

    Docker Compose version v2.29.7
  2. Graylog 구성을 위한 전용 디렉토리로 이동합니다. 이렇게 하면 프로젝트를 체계적으로 관리하는 데 도움이 됩니다.

    cd /home/labex/project/graylog
  3. 다음으로 nano 텍스트 편집기를 사용하여 docker-compose.yml 구성 파일을 생성합니다. 이 파일은 Docker Compose 에 어떤 컨테이너를 실행하고 어떻게 구성해야 하는지를 알려줍니다.

    nano docker-compose.yml
  4. 다음 YAML 구성을 nano 편집기에 복사하여 붙여넣습니다. 이 구성은 세 가지 서비스를 정의합니다.

    • mongodb: Graylog 의 구성 데이터를 저장합니다.
    • opensearch: 빠른 검색을 위해 로그 메시지를 인덱싱하고 저장합니다. OpenSearch 2.12 이상은 초기 관리자 비밀번호가 필요합니다.
    • graylog: 웹 인터페이스와 로그 처리 엔진을 제공하는 메인 애플리케이션입니다.
    services:
      mongodb:
        image: mongo:6.0
        container_name: graylog_mongodb
        volumes:
          - mongo_data:/data/db
        networks:
          - graylog_network
        healthcheck:
          test: ["CMD", "mongosh", "--eval", "db.runCommand('ping').ok"]
          interval: 30s
          timeout: 10s
          retries: 3
      opensearch:
        image: opensearchproject/opensearch:2.13.0
        container_name: graylog_opensearch
        environment:
          - discovery.type=single-node
          - plugins.security.disabled=true
          - bootstrap.memory_lock=true
          - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
          - "OPENSEARCH_INITIAL_ADMIN_PASSWORD=StrongPassword123!"
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - opensearch_data:/usr/share/opensearch/data
        networks:
          - graylog_network
        healthcheck:
          test:
            [
              "CMD-SHELL",
              "curl -f http://localhost:9200/_cluster/health || exit 1"
            ]
          interval: 30s
          timeout: 10s
          retries: 3
      graylog:
        image: graylog/graylog:6.1
        container_name: graylog_server
        volumes:
          - graylog_data:/usr/share/graylog/data
        environment:
          - GRAYLOG_PASSWORD_SECRET=somepasswordpepper
          - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
          - GRAYLOG_HTTP_EXTERNAL_URI=http://127.0.0.1:9000/
          - GRAYLOG_ELASTICSEARCH_HOSTS=http://opensearch:9200
          - GRAYLOG_MONGODB_URI=mongodb://mongodb:27017/graylog
        depends_on:
          mongodb:
            condition: service_healthy
          opensearch:
            condition: service_healthy
        ports:
          - "9000:9000"
          - "1514:1514"
          - "1514:1514/udp"
          - "12201:12201"
          - "12201:12201/udp"
        networks:
          - graylog_network
    volumes:
      mongo_data:
      opensearch_data:
      graylog_data:
    networks:
      graylog_network:
        driver: bridge

    파일을 저장하려면 Ctrl+O를 누르고 Enter를 누른 다음, nano를 종료하려면 Ctrl+X를 누릅니다.

  5. 이제 -d (detached) 플래그를 사용하여 모든 서비스를 백그라운드에서 시작합니다.

    docker compose up -d
  6. 모든 서비스가 초기화되는 데 1~2 분 정도 걸릴 수 있습니다. 컨테이너의 상태를 확인하여 올바르게 실행되고 있는지 확인할 수 있습니다.

    docker compose ps

    세 서비스 (graylog_server, graylog_opensearch, graylog_mongodb) 모두 StateUp으로 표시되어야 합니다.

    NAME                 IMAGE                                 COMMAND                  SERVICE      CREATED              STATUS                        PORTS
    graylog_mongodb      mongo:6.0                             "docker-entrypoint.s…"   mongodb      About a minute ago   Up About a minute (healthy)   27017/tcp
    graylog_opensearch   opensearchproject/opensearch:2.13.0   "./opensearch-docker…"   opensearch   About a minute ago   Up About a minute (healthy)   9200/tcp, 9300/tcp, 9600/tcp, 9650/tcp
    graylog_server       graylog/graylog:6.1                   "tini -- /docker-ent…"   graylog      About a minute ago   Up 34 seconds (healthy)       0.0.0.0:1514->1514/tcp, :::1514->1514/tcp, 0.0.0.0:9000->9000/tcp, 0.0.0.0:1514->1514/udp, :::9000->9000/tcp, :::1514->1514/udp, 0.0.0.0:12201->12201/tcp, 0.0.0.0:12201->12201/udp, :::12201->12201/tcp, :::12201->12201/udp

이제 Graylog 웹 인터페이스에 액세스할 수 있습니다. Graylog 스택 배포를 성공적으로 완료했으며 구성할 준비가 되었습니다.

Syslog 입력 설정하기

Graylog 가 실행 중인 상태에서 다음 단계는 "입력 (Input)"을 구성하는 것입니다. 입력은 Graylog 가 로그 메시지를 수락하는 방법을 알려주는 구성 요소입니다. 이 랩에서는 네트워크 장치 및 Linux/Unix 서버에서 로그를 수집하는 일반적인 표준인 Syslog UDP 입력을 생성합니다.

  1. 브라우저에서 Graylog 웹 인터페이스를 엽니다. "Web Terminal" 탭을 클릭하고 "Desktop"을 선택하여 브라우저를 열거나, 랩 환경의 전용 브라우저 아이콘을 사용하여 열 수 있습니다. 다음 URL 로 이동합니다.

    http://127.0.0.1:9000

    Graylog web interface
  2. 기본 자격 증명으로 로그인합니다.

    • 사용자 이름: admin
    • 비밀번호: admin
  3. 로그인한 후 새 입력을 생성합니다. 상단 탐색 모음에서 System을 클릭한 다음 드롭다운 메뉴에서 Inputs를 선택합니다.

  4. 입력 페이지에서 "Select input" 드롭다운 목록에서 "Syslog UDP" 입력 유형을 찾아 옆에 있는 Launch new input 버튼을 클릭합니다.

  5. 모달 창이 나타납니다. 다음 세부 정보로 양식을 채워 입력을 구성합니다.

    • Node: 드롭다운에서 사용 가능한 유일한 노드를 선택합니다 (이것이 Graylog 서버입니다).
    • Title: Syslog UDP Input (입력에 대한 설명적인 이름입니다).
    • Bind address: 0.0.0.0 (Graylog 가 컨테이너의 모든 네트워크 인터페이스에서 로그를 수신하도록 지시합니다).
    • Port: 1514 (Graylog 가 들어오는 syslog 메시지를 수신할 포트입니다).

    다른 모든 설정은 기본값으로 두고 Save를 클릭합니다.

  6. 저장 후 입력 페이지로 돌아갑니다. 새로 생성된 "Syslog UDP Input"이 녹색 "Running" 상태로 목록에 표시되어야 하며, 이는 활성화되어 데이터를 수신할 준비가 되었음을 나타냅니다.

  7. 입력을 테스트하기 위해 터미널로 돌아가 netcat (nc) 유틸리티를 사용하여 샘플 로그 메시지를 보냅니다. 이 명령은 기본 syslog 메시지를 구성하고 로컬 머신의 UDP 포트 1514로 보냅니다.

    echo "<14>$(date +'%b %d %H:%M:%S') localhost labex: Test syslog message" | nc -w1 -u 127.0.0.1 1514

이제 Graylog 가 로그를 수신하도록 성공적으로 구성했습니다. 다음 단계에서는 더 구조화된 로그를 보내고 Graylog 인터페이스에서 보는 방법을 배웁니다.

샘플 로그 전송 및 보기

Syslog 입력이 준비되었으므로 이제 샘플 로그 배치를 생성하고 보낼 차례입니다. 이렇게 하면 Graylog 에 데이터가 채워져 검색 및 분석을 연습할 수 있습니다. 애플리케이션에서 로그 메시지를 시뮬레이션하는 간단한 셸 스크립트를 생성합니다.

  1. 먼저 터미널에서 프로젝트의 루트 디렉토리로 다시 이동합니다.

    cd /home/labex/project
  2. nano 편집기를 사용하여 generate_logs.sh라는 새 셸 스크립트를 생성합니다.

    nano generate_logs.sh
  3. 다음 스크립트를 편집기에 복사하여 붙여넣습니다. 이 스크립트는 루프에서 10 개의 로그 메시지를 생성합니다. 각 메시지에는 임의의 심각도 수준, 타임스탬프 및 간단한 메시지 본문이 있습니다. 그런 다음 nc를 사용하여 구성한 Graylog 입력으로 각 로그를 보냅니다.

    #!/bin/bash
    for i in {1..10}; do
      severity=$(((RANDOM % 8)))
      timestamp=$(date +'%b %d %H:%M:%S')
      echo "<$((severity + 8))>$timestamp localhost sample_app[$i]: Sample log message $i with severity $severity" | nc -w1 -u 127.0.0.1 1514
      echo "Sent log message $i"
      sleep 1
    done

    저장하고 종료하려면 Ctrl+O, Enter, Ctrl+X를 누릅니다.

  4. chmod 명령을 사용하여 스크립트를 실행 가능하게 만듭니다.

    chmod +x generate_logs.sh
  5. 스크립트를 실행하여 Graylog 로 로그를 보냅니다.

    ./generate_logs.sh

    각 로그가 전송될 때 터미널에 출력이 표시됩니다.

    Sent log message 1
    Sent log message 2
    ...
    Sent log message 10
  6. 이제 Graylog 에서 이러한 로그를 보겠습니다. 브라우저에서 Graylog 웹 인터페이스 (http://127.0.0.1:9000) 로 다시 이동합니다.

  7. 상단 탐색 모음에서 Search 탭을 클릭합니다. 방금 보낸 로그 메시지가 "Messages" 목록에 나타나는 것을 볼 수 있습니다. 인덱싱되고 표시되는 데 몇 초가 걸릴 수 있습니다.

    Graylog 가 메시지를 자동으로 구문 분석하여 timestamp, source, application_name, severity와 같은 필드로 분해하는 것을 볼 수 있습니다. 이 구조화된 데이터는 효과적인 로그 분석의 핵심입니다.

로그 데이터 쿼리 및 분석

Graylog 로 로그가 들어오면 이제 로그를 검색하고 필터링하는 방법을 배울 수 있습니다. Graylog 의 검색 기능은 강력하며 특정 이벤트를 신속하게 파악할 수 있습니다. 이는 문제 해결 또는 보안 사고 조사에 필수적입니다.

  1. Graylog 웹 인터페이스에서 Search 페이지로 이동합니다. 검색창은 페이지 상단에 있습니다.

  2. 간단한 쿼리부터 시작해 보겠습니다. 시뮬레이션된 애플리케이션의 모든 로그를 찾으려면 검색창에 다음을 입력하고 Enter를 누릅니다.

    application_name:sample_app

    이렇게 하면 application_name 필드가 정확히 sample_app인 로그만 표시하도록 결과가 필터링됩니다.

  3. 이제 다른 쿼리를 시도하여 다양한 필터링 기능을 탐색해 보겠습니다.

    • 특정 심각도 수준 (예: 수준 4) 의 로그 찾기:
      severity:4
    • 심각도 수준이 5 보다 큰 로그 (경고, 오류 등) 찾기:
      severity:>5
    • 로그 메시지 내에서 구문 검색:
      message:"log message 5"
    • AND를 사용하여 필터 결합:
      application_name:sample_app AND severity:<3
  4. 검색 시간 범위를 제어할 수도 있습니다. 기본적으로 Graylog 는 "지난 5 분"의 로그를 표시합니다. 검색창 왼쪽에 있는 시간 범위 선택기를 클릭하고 Last 30 minutes로 변경하여 생성된 모든 로그가 검색 결과에 포함되도록 합니다.

  5. 자주 사용하는 쿼리를 쉽게 액세스할 수 있도록 저장할 수 있습니다. 심각도가 높은 이벤트에 대한 검색을 저장해 보겠습니다.

    • 쿼리 실행: severity:>4
    • 검색창 오른쪽에 있는 플로피 디스크 아이콘 (Save Search) 을 클릭합니다.
    • "Save Search" 대화 상자에서 Title을 입력합니다. 예를 들어 High Severity Events입니다.
    • Save를 클릭합니다.

    이제 왼쪽 사이드바의 "Saved Searches" 목록에서 언제든지 이 저장된 검색에 액세스하여 중요한 이벤트를 신속하게 확인할 수 있습니다.

모니터링 대시보드 구축

검색 페이지는 활발한 조사를 위해 훌륭하지만, 대시보드는 로그 데이터에 대한 개요를 한눈에 제공합니다. 이 마지막 단계에서는 로그의 주요 메트릭을 시각화하기 위해 여러 위젯으로 대시보드를 생성합니다.

  1. Graylog 웹 인터페이스에서 상단 메뉴의 Dashboards 섹션으로 이동합니다.

  2. Create dashboard 버튼을 클릭합니다.

    • Title: Application Health Dashboard 입력
    • Description: Monitors the health and activity of sample_app. 입력
    • Create를 클릭합니다.
  3. 이제 빈 대시보드가 있습니다. 여기에 위젯을 추가해 보겠습니다. Unlock / Edit 버튼을 클릭하여 편집 모드로 들어갑니다.

  4. "Log Count" 위젯 추가: 이 위젯은 시간 경과에 따른 총 로그 메시지 수를 표시합니다.

    • Create Widget for Dashboard를 클릭합니다.
    • 위젯 유형으로 Aggregation을 선택합니다.
    • 구성 창에서:
      • Title: Total Log Volume
      • "Rows"에서 필드로 timestamp를 선택합니다.
      • 시각화 유형으로 Bar Chart를 선택합니다.
    • Create를 클릭합니다.
  5. "Severity Distribution" 위젯 추가: 이 위젯은 심각도 수준별 로그 분포를 표시합니다.

    • Create Widget for Dashboard를 다시 클릭합니다.
    • 위젯 유형으로 Aggregation을 선택합니다.
    • 구성 창에서:
      • Title: Log Severity Distribution
      • "Rows"에서 필드로 severity를 선택합니다.
      • 시각화 유형으로 Pie Chart를 선택합니다.
    • Create를 클릭합니다.
  6. "Recent Messages" 위젯 추가: 이 위젯은 가장 최근 로그 메시지 목록을 표시합니다.

    • Create Widget for Dashboard를 클릭합니다.
    • 위젯 유형으로 Messages를 선택합니다.
    • 구성 창에서:
      • Title: Recent Log Messages
      • "Streams" 필드에서 All messages가 선택되었는지 확인합니다.
    • Create를 클릭합니다.
  7. 위젯을 추가한 후에는 드래그 앤 드롭하여 레이아웃을 배열할 수 있습니다. 모서리를 드래그하여 크기를 조정할 수도 있습니다. 읽기 쉬운 방식으로 배열합니다.

  8. 레이아웃이 만족스러우면 오른쪽 상단의 Lock / Save 버튼을 클릭하여 대시보드를 저장합니다.

이제 기본 모니터링 대시보드를 만들었습니다. 실제 시나리오에서는 이러한 대시보드가 시스템 상태 및 보안 상태를 주시하는 데 매우 유용합니다.

요약

이 실습에서는 Graylog 의 핵심 기능인 로그 관리 및 분석에 대한 실질적인 경험을 쌓았습니다. Docker Compose 를 사용하여 Graylog 서버, OpenSearch 및 MongoDB 를 포함하는 완전한 Graylog 환경을 배포하는 것으로 시작했습니다.

그런 다음 로그 수집을 활성화하기 위해 Syslog 입력을 구성하고 스크립트를 사용하여 실제 애플리케이션 로그를 시뮬레이션하는 샘플 로그 데이터를 보냈습니다. Graylog 의 강력한 검색 및 쿼리 언어를 사용하여 로그 내의 특정 정보를 필터링하고 찾는 방법을 배웠습니다. 마지막으로 다양한 위젯으로 사용자 지정 대시보드를 구축하여 로그 메트릭을 시각화하고 시스템 활동을 한눈에 파악할 수 있도록 모든 것을 통합했습니다. 이러한 기술은 사이버 보안 모니터링 및 운영 인텔리전스에서 Graylog 를 사용하는 견고한 기반을 형성합니다.