서론: 보안 모니터링의 중요성

네트워크 보안에서 "보이지 않는 것은 방어할 수 없다"는 말이 있습니다. 아무리 강력한 방화벽과 침입 탐지 시스템을 갖추고 있어도, 실시간으로 무슨 일이 일어나고 있는지 파악하지 못한다면 보안 사고에 효과적으로 대응할 수 없습니다. 보안 모니터링과 로그 분석은 조직의 보안 태세를 유지하고 위협에 신속히 대응하기 위한 핵심 역량입니다.

이번 9편에서는 다양한 로그의 종류와 중앙 로그 관리 시스템 구축 방법, ELK Stack을 활용한 로그 분석 플랫폼 구성, SIEM(Security Information and Event Management)의 개념과 활용, 그리고 이상 징후 탐지와 위협 인텔리전스 활용 방법에 대해 알아보겠습니다.

1. 로그의 종류와 중요성

1.1 시스템 로그 (System Logs)

시스템 로그는 운영 체제 수준에서 발생하는 모든 이벤트를 기록합니다. Linux 시스템에서는 /var/log/ 디렉토리에 저장되며, Windows에서는 이벤트 뷰어를 통해 확인할 수 있습니다.

  • /var/log/syslog (또는 /var/log/messages): 시스템 전반의 메시지와 이벤트
  • /var/log/auth.log: 인증 관련 이벤트 (로그인 시도, sudo 사용 등)
  • /var/log/kern.log: 커널 레벨 메시지
  • /var/log/dmesg: 부팅 시 하드웨어 및 드라이버 메시지
  • /var/log/cron: 크론 작업 실행 기록
# 실시간 로그 모니터링
tail -f /var/log/auth.log

# 특정 패턴 검색
grep "Failed password" /var/log/auth.log

# 최근 로그인 실패 시도 확인
lastb | head -20

1.2 애플리케이션 로그 (Application Logs)

애플리케이션 로그는 각 서비스나 애플리케이션이 생성하는 로그입니다. 웹 서버, 데이터베이스, 메일 서버 등 각 서비스별로 고유한 로그 형식을 가집니다.

  • Apache/Nginx 액세스 로그: 웹 요청 기록
  • Apache/Nginx 에러 로그: 오류 및 경고 메시지
  • MySQL/PostgreSQL 로그: 쿼리 실행 및 오류
  • 애플리케이션 자체 로그: 비즈니스 로직 관련 이벤트
# Nginx 액세스 로그 형식 예시
# 192.168.1.100 - - [22/Jan/2026:10:15:32 +0900] "GET /api/users HTTP/1.1" 200 1234 "-" "Mozilla/5.0..."

# 접근 빈도가 높은 IP 확인
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# HTTP 상태 코드별 통계
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

1.3 보안 로그 (Security Logs)

보안 로그는 보안 관련 이벤트를 전문적으로 기록합니다. 방화벽, IDS/IPS, 안티바이러스 등 보안 장비와 소프트웨어가 생성합니다.

  • 방화벽 로그: 허용/차단된 연결 기록
  • IDS/IPS 로그: 탐지된 공격 시도
  • 감사 로그 (Audit Log): 시스템 변경 사항 추적
  • VPN 로그: 원격 접속 기록
# Linux auditd 로그 확인
ausearch -m USER_LOGIN -ts today

# iptables 로그 확인 (로깅이 설정된 경우)
grep "iptables" /var/log/syslog

# SELinux 거부 로그 확인
ausearch -m avc -ts recent

1.4 네트워크 로그 (Network Logs)

네트워크 로그는 네트워크 트래픽과 연결 정보를 기록합니다. 라우터, 스위치, 프록시 서버 등에서 생성됩니다.

  • NetFlow/sFlow: 네트워크 트래픽 흐름 데이터
  • DNS 쿼리 로그: 도메인 조회 기록
  • DHCP 로그: IP 할당 기록
  • 프록시 로그: 웹 트래픽 기록

2. 중앙 로그 관리 시스템

2.1 rsyslog를 활용한 중앙 집중식 로깅

rsyslog는 Linux 시스템에서 가장 널리 사용되는 시스템 로깅 데몬입니다. 원격 로그 수집과 필터링 기능을 제공합니다.

# 중앙 로그 서버 설정 (/etc/rsyslog.conf)
# UDP 514 포트로 원격 로그 수신
$ModLoad imudp
$UDPServerRun 514

# TCP 514 포트로 원격 로그 수신 (더 안정적)
$ModLoad imtcp
$InputTCPServerRun 514

# 원격 호스트별 로그 분리 저장
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
# 클라이언트 설정 (/etc/rsyslog.conf)
# 모든 로그를 원격 서버로 전송 (TCP)
*.* @@192.168.1.10:514

# 특정 facility만 전송
auth,authpriv.* @@192.168.1.10:514
kern.* @@192.168.1.10:514

2.2 syslog-ng를 활용한 고급 로그 관리

syslog-ng는 rsyslog보다 더 유연한 설정과 필터링 기능을 제공합니다. 복잡한 로그 라우팅과 파싱이 필요한 환경에 적합합니다.

# syslog-ng 서버 설정 (/etc/syslog-ng/syslog-ng.conf)
@version: 3.35

source s_network {
    tcp(ip("0.0.0.0") port(514));
    udp(ip("0.0.0.0") port(514));
};

destination d_hosts {
    file("/var/log/remote/$HOST/$PROGRAM.log"
        create-dirs(yes)
        dir-perm(0755)
        perm(0644));
};

filter f_security {
    facility(auth, authpriv) or
    match("attack" value("MESSAGE")) or
    match("failed" value("MESSAGE"));
};

log {
    source(s_network);
    filter(f_security);
    destination(d_hosts);
};

2.3 로그 보존 정책

로그 보존 정책은 규정 준수와 스토리지 관리 측면에서 중요합니다. logrotate를 활용하여 자동화할 수 있습니다.

# /etc/logrotate.d/security-logs
/var/log/remote/*/*.log {
    daily
    rotate 90
    compress
    delaycompress
    missingok
    notifempty
    create 0644 root root
    sharedscripts
    postrotate
        /usr/bin/systemctl reload rsyslog > /dev/null 2>&1 || true
    endscript
}

3. ELK Stack 구축

3.1 ELK Stack 개요

ELK Stack은 Elasticsearch, Logstash, Kibana의 조합으로, 대규모 로그 데이터의 수집, 저장, 분석, 시각화를 위한 강력한 플랫폼입니다. 최근에는 Beats가 추가되어 Elastic Stack으로도 불립니다.

  • Elasticsearch: 분산 검색 및 분석 엔진, 로그 데이터 저장
  • Logstash: 데이터 수집, 파싱, 변환 파이프라인
  • Kibana: 데이터 시각화 및 대시보드
  • Beats: 경량 데이터 수집기 (Filebeat, Metricbeat 등)

3.2 Elasticsearch 설치 및 설정

# Elasticsearch 설치 (Ubuntu/Debian)
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update && sudo apt install elasticsearch

# 기본 설정 (/etc/elasticsearch/elasticsearch.yml)
cluster.name: security-cluster
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node

# 보안 설정 (Elasticsearch 8.x)
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
# JVM 힙 메모리 설정 (/etc/elasticsearch/jvm.options.d/heap.options)
-Xms4g
-Xmx4g

# 서비스 시작
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch

# 상태 확인
curl -X GET "localhost:9200/_cluster/health?pretty"

3.3 Logstash 파이프라인 구성

# Logstash 설치
sudo apt install logstash

# 파이프라인 설정 (/etc/logstash/conf.d/security-logs.conf)
input {
    beats {
        port => 5044
    }
    syslog {
        port => 5514
        type => "syslog"
    }
}

filter {
    if [type] == "syslog" {
        grok {
            match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
        }
        date {
            match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
        }
    }

    # SSH 로그인 실패 탐지
    if [syslog_program] == "sshd" and [syslog_message] =~ /Failed password/ {
        grok {
            match => { "syslog_message" => "Failed password for %{USER:ssh_user} from %{IP:src_ip}" }
        }
        mutate {
            add_tag => ["ssh_failed_login"]
        }
    }

    # GeoIP 정보 추가
    if [src_ip] {
        geoip {
            source => "src_ip"
            target => "geoip"
        }
    }
}

output {
    elasticsearch {
        hosts => ["localhost:9200"]
        index => "security-logs-%{+YYYY.MM.dd}"
    }
}

3.4 Filebeat를 활용한 로그 수집

# Filebeat 설정 (/etc/filebeat/filebeat.yml)
filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /var/log/auth.log
      - /var/log/syslog
    fields:
      log_type: system

  - type: log
    enabled: true
    paths:
      - /var/log/nginx/access.log
    fields:
      log_type: nginx_access

  - type: log
    enabled: true
    paths:
      - /var/log/nginx/error.log
    fields:
      log_type: nginx_error

output.logstash:
  hosts: ["localhost:5044"]

# 또는 직접 Elasticsearch로 전송
# output.elasticsearch:
#   hosts: ["localhost:9200"]
#   index: "filebeat-%{+yyyy.MM.dd}"

3.5 Kibana 대시보드 구성

# Kibana 설치 및 설정
sudo apt install kibana

# 설정 (/etc/kibana/kibana.yml)
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]

# 서비스 시작
sudo systemctl enable kibana
sudo systemctl start kibana

Kibana에서 보안 대시보드를 구성할 때 다음 시각화를 포함하는 것이 좋습니다:

  • 로그인 실패 추이: 시간대별 실패 로그인 시도 그래프
  • 상위 공격 소스 IP: 가장 많은 실패 시도를 한 IP 목록
  • 지리적 분포: 공격 시도의 지리적 위치 지도
  • 이벤트 타입별 분포: 파이 차트로 이벤트 유형 표시
  • 실시간 로그 스트림: 최신 보안 이벤트 목록

4. SIEM 개념과 활용

4.1 SIEM이란?

SIEM(Security Information and Event Management)은 보안 정보 관리(SIM)와 보안 이벤트 관리(SEM)를 결합한 솔루션입니다. 다양한 소스에서 로그를 수집하고, 상관 분석을 통해 보안 위협을 탐지합니다.

  • 로그 수집 및 정규화: 다양한 형식의 로그를 표준화
  • 실시간 모니터링: 보안 이벤트 실시간 감시
  • 상관 분석: 여러 이벤트를 연결하여 공격 패턴 식별
  • 알림 및 대응: 위협 탐지 시 자동 알림 발송
  • 규정 준수 보고: 감사 및 컴플라이언스 리포트 생성

4.2 오픈소스 SIEM: Wazuh

Wazuh는 OSSEC을 기반으로 한 오픈소스 SIEM 솔루션으로, ELK Stack과 통합하여 사용할 수 있습니다.

# Wazuh 서버 설치 (단일 노드)
curl -sO https://packages.wazuh.com/4.7/wazuh-install.sh
sudo bash wazuh-install.sh -a

# Wazuh 에이전트 설치 (클라이언트)
curl -sO https://packages.wazuh.com/4.7/wazuh-agent-4.7.0-1.x86_64.rpm
sudo rpm -ivh wazuh-agent-4.7.0-1.x86_64.rpm

# 에이전트 설정
sudo sed -i 's/MANAGER_IP/192.168.1.10/' /var/ossec/etc/ossec.conf
sudo systemctl enable wazuh-agent
sudo systemctl start wazuh-agent

4.3 SIEM 규칙 작성

<!-- Wazuh 사용자 정의 규칙 (/var/ossec/etc/rules/local_rules.xml) -->
<group name="custom_rules">

    <!-- 짧은 시간 내 다수의 SSH 실패 시도 탐지 -->
    <rule id="100001" level="10" frequency="5" timeframe="60">
        <if_matched_sid>5710</if_matched_sid>
        <same_source_ip />
        <description>SSH 브루트포스 공격 탐지: 1분 내 5회 이상 실패</description>
        <group>authentication_failures,pci_dss_10.2.4,</group>
    </rule>

    <!-- 비정상적인 시간대 로그인 탐지 -->
    <rule id="100002" level="8">
        <if_sid>5501</if_sid>
        <time>12am - 6am</time>
        <description>비정상적인 시간대 로그인 성공</description>
    </rule>

    <!-- 중요 파일 변경 탐지 -->
    <rule id="100003" level="12">
        <if_sid>550</if_sid>
        <match>/etc/passwd|/etc/shadow|/etc/sudoers</match>
        <description>중요 시스템 파일 변경 탐지</description>
    </rule>

</group>

5. 이상 징후 탐지

5.1 기준선(Baseline) 설정

이상 징후를 탐지하려면 먼저 정상적인 활동 패턴을 파악해야 합니다. 기준선은 시간대별, 요일별, 사용자별로 설정할 수 있습니다.

  • 네트워크 트래픽: 평균 대역폭 사용량, 프로토콜 분포
  • 로그인 패턴: 일반적인 로그인 시간, 위치
  • 프로세스 활동: 정상적으로 실행되는 프로세스 목록
  • 파일 접근: 일반적인 파일 접근 패턴

5.2 이상 징후 유형

  • 볼륨 이상: 비정상적으로 높거나 낮은 트래픽/로그 볼륨
  • 시간 이상: 비정상적인 시간대의 활동
  • 지리적 이상: 예상치 못한 위치에서의 접근
  • 행동 이상: 평소와 다른 사용자 행동 패턴
  • 프로토콜 이상: 비정상적인 프로토콜 사용이나 포트 접근

5.3 머신러닝 기반 이상 탐지

Elasticsearch의 ML 기능을 활용하여 자동으로 이상 징후를 탐지할 수 있습니다.

// Elasticsearch ML 작업 생성 예시
PUT _ml/anomaly_detectors/security_login_anomaly
{
  "description": "로그인 이상 탐지",
  "analysis_config": {
    "bucket_span": "15m",
    "detectors": [
      {
        "function": "high_count",
        "field_name": "event.action",
        "by_field_name": "source.ip",
        "detector_description": "IP별 비정상적으로 높은 로그인 시도"
      }
    ],
    "influencers": ["source.ip", "user.name"]
  },
  "data_description": {
    "time_field": "@timestamp"
  },
  "datafeed_config": {
    "indices": ["security-logs-*"],
    "query": {
      "bool": {
        "filter": [
          {"term": {"event.category": "authentication"}}
        ]
      }
    }
  }
}

6. 위협 인텔리전스 활용

6.1 위협 인텔리전스란?

위협 인텔리전스(Threat Intelligence)는 사이버 위협에 대한 수집, 분석된 정보를 의미합니다. 이를 활용하면 알려진 위협을 사전에 탐지하고 대응할 수 있습니다.

  • 전술적 인텔리전스: IOC(침해 지표), 악성 IP, 도메인 목록
  • 운영적 인텔리전스: 공격자 TTP(전술, 기법, 절차)
  • 전략적 인텔리전스: 위협 동향, 공격 그룹 분석

6.2 위협 피드 통합

# 악성 IP 목록 다운로드 및 적용
wget -O /etc/threat-intel/malicious-ips.txt https://example.com/threat-feeds/ips.txt

# Logstash에서 위협 인텔리전스 활용
filter {
    translate {
        field => "src_ip"
        destination => "threat_match"
        dictionary_path => "/etc/threat-intel/malicious-ips.txt"
        fallback => "clean"
    }

    if [threat_match] != "clean" {
        mutate {
            add_tag => ["threat_detected"]
            add_field => { "threat_source" => "ip_blocklist" }
        }
    }
}

6.3 MISP (Malware Information Sharing Platform)

MISP는 위협 인텔리전스를 공유하고 관리하기 위한 오픈소스 플랫폼입니다.

# MISP API를 활용한 IOC 조회
from pymisp import PyMISP

misp = PyMISP('https://misp.example.com', 'your-api-key', ssl=True)

# 특정 IP 조회
result = misp.search(controller='attributes', value='192.168.1.100')

# 최근 이벤트 조회
events = misp.search(controller='events', timestamp='7d')

# IOC 내보내기
iocs = misp.search(controller='attributes', type_attribute='ip-dst', to_ids=True)

7. 보안 대시보드 구성 예시

7.1 핵심 보안 지표 (KPI)

효과적인 보안 모니터링을 위해 다음 지표들을 대시보드에 포함해야 합니다:

  • MTTD (Mean Time To Detect): 위협 탐지까지 평균 소요 시간
  • MTTR (Mean Time To Respond): 대응까지 평균 소요 시간
  • 일일 보안 이벤트 수: 심각도별 분류
  • 차단된 공격 수: 방화벽/IPS에서 차단한 시도
  • 취약점 현황: 미패치 시스템 수

7.2 실시간 알림 설정

# Elasticsearch Watcher 알림 설정
PUT _watcher/watch/ssh_bruteforce_alert
{
  "trigger": {
    "schedule": { "interval": "1m" }
  },
  "input": {
    "search": {
      "request": {
        "indices": ["security-logs-*"],
        "body": {
          "query": {
            "bool": {
              "must": [
                { "match": { "tags": "ssh_failed_login" }},
                { "range": { "@timestamp": { "gte": "now-5m" }}}
              ]
            }
          },
          "aggs": {
            "by_ip": {
              "terms": { "field": "src_ip", "min_doc_count": 10 }
            }
          }
        }
      }
    }
  },
  "condition": {
    "compare": { "ctx.payload.aggregations.by_ip.buckets.0.doc_count": { "gte": 10 }}
  },
  "actions": {
    "send_email": {
      "email": {
        "to": "security@example.com",
        "subject": "[ALERT] SSH 브루트포스 공격 탐지",
        "body": "IP {{ctx.payload.aggregations.by_ip.buckets.0.key}}에서 5분간 {{ctx.payload.aggregations.by_ip.buckets.0.doc_count}}회의 SSH 로그인 실패가 발생했습니다."
      }
    },
    "webhook": {
      "webhook": {
        "method": "POST",
        "url": "https://hooks.slack.com/services/xxx/yyy/zzz",
        "body": "{\"text\": \"SSH 브루트포스 공격 탐지: {{ctx.payload.aggregations.by_ip.buckets.0.key}}\"}"
      }
    }
  }
}

8. 실전 로그 분석 시나리오

8.1 웹 서버 침해 조사

# 의심스러운 요청 패턴 검색
grep -E "(union.*select|script>|../|cmd=|exec\()" /var/log/nginx/access.log

# 특정 IP의 모든 활동 추적
grep "192.168.1.100" /var/log/nginx/access.log | less

# 비정상적으로 큰 응답 크기 (데이터 유출 의심)
awk '$10 > 1000000 {print $1, $7, $10}' /var/log/nginx/access.log

# 404 에러 다수 발생 (스캐닝 의심)
awk '$9 == 404 {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head

8.2 권한 상승 시도 탐지

# sudo 사용 기록 분석
grep "sudo:" /var/log/auth.log | grep -v "session opened\|session closed"

# 실패한 sudo 시도
grep "sudo:.*authentication failure" /var/log/auth.log

# su 명령어 사용 기록
grep "su\[" /var/log/auth.log

# 의심스러운 cron 작업 확인
grep "CRON" /var/log/syslog | grep -v "session"

결론

보안 모니터링과 로그 분석은 조직의 보안 태세를 유지하는 핵심 활동입니다. 이번 편에서 다룬 내용을 정리하면:

  • 로그의 종류: 시스템, 애플리케이션, 보안, 네트워크 로그의 특성과 활용법
  • 중앙 로그 관리: rsyslog, syslog-ng를 활용한 로그 집중화
  • ELK Stack: Elasticsearch, Logstash, Kibana를 활용한 로그 분석 플랫폼
  • SIEM: 보안 이벤트 상관 분석과 자동화된 위협 탐지
  • 이상 징후 탐지: 기준선 설정과 머신러닝 기반 탐지
  • 위협 인텔리전스: 외부 위협 정보를 활용한 사전 탐지

효과적인 보안 모니터링을 위해서는 도구만으로는 충분하지 않습니다. 조직의 환경과 비즈니스를 이해하고, 지속적으로 탐지 규칙을 개선하며, 알림 피로(Alert Fatigue)를 관리하는 것이 중요합니다.

다음 10편에서는 침해사고가 발생했을 때 어떻게 대응하고, 디지털 포렌식을 통해 사고를 분석하는 방법에 대해 알아보겠습니다. 보안 사고 대응 프로세스와 실제 포렌식 기법을 통해 시리즈를 마무리하겠습니다.