OPEN HYPER STEP
← 목록으로 (화이트햇 보안)
SECURITY · 73 / 84
security
CHAPTER 73 / 84
읽기 약 2
FUNCTION

로그 파일의 구조와 종류


핵심 개념

웹 서버 로그·시스템 로그·애플리케이션 로그 — 형식과 보안 이벤트 종류를 익힌다.

본문

로그 3대 카테고리

1. 웹 서버 로그

📋 코드 (7줄)
# Apache Combined Log Format
192.168.1.10 - - [27/Apr/2026:10:23:11 +0000] "GET /admin HTTP/1.1" 200 1234 "-" "Mozilla/5.0..."
                  ↑ IP                 ↑ 시간                ↑ 메서드+경로  ↑ 상태  ↑ 크기  ↑ Referer  ↑ User-Agent

# Nginx 기본 형식 (Apache와 거의 동일)
# JSON 형식도 가능 — 권장
{"time":"2026-04-27T10:23:11Z","ip":"192.168.1.10","method":"GET","path":"/admin","status":200}

2. 시스템 로그

📋 코드 (5줄)
# /var/log/auth.log (Ubuntu/Debian)
Apr 27 10:23:11 server sshd[1234]: Failed password for invalid user admin from 198.51.100.99 port 22

# /var/log/syslog
Apr 27 10:24:01 server kernel: [3245.123] iptables: DROP IN=eth0 SRC=198.51.100.99

3. 애플리케이션 로그

PYTHON📋 코드 (14줄)
# Python logging 표준 형식
import logging

logging.basicConfig(
    format='%(asctime)s [%(levelname)s] %(name)s: %(message)s',
    level=logging.INFO,
)

# 출력 예
"""
2026-04-27 10:23:11 [INFO] api.auth: 로그인 성공 user=alice
2026-04-27 10:23:15 [WARNING] api.auth: 로그인 실패 user=admin ip=10.0.0.5
2026-04-27 10:23:20 [ERROR] api.payment: 결제 처리 오류 order_id=abc-123
"""

로그 레벨 5단계

레벨의미보안 분석에서의 의미
DEBUG개발용 상세 정보평소엔 비활성 (디버그 모드 노출 위험)
INFO정상 이벤트베이스라인
WARNING주의 필요의심 행동 — 401/403 반복
ERROR처리 실패공격 시도 또는 시스템 오류
CRITICAL시스템 위협즉시 대응 필요 (디스크 full, 인증 시스템 다운)

보안 이벤트 우선순위

PYTHON📋 코드 (23줄)
SECURITY_EVENTS = {
    'P1_CRITICAL': [
        '관리자 계정 로그인 (정상 vs 비정상)',
        '대량 데이터 다운로드 (DB dump)',
        '시스템 파일 변경 (chattr, /etc/passwd)',
        '방화벽 규칙 변경',
    ],
    'P2_HIGH': [
        '반복 로그인 실패 (브루트포스)',
        '권한 우회 시도 (../, 디렉토리 탐색)',
        'SQL Injection 페이로드 탐지',
        '비정상 시간(03:00 AM) 로그인',
    ],
    'P3_MEDIUM': [
        '404 폭주 (디렉토리 브루트포싱)',
        '비정상 User-Agent (sqlmap, nikto)',
        '동일 IP 다수 사용자 시도',
    ],
    'P4_LOW': [
        '단일 401 (정상 오타)',
        '느린 요청 (서버 과부하 vs DoS 시도)',
    ],
}

로그 파일 위치 (Linux 기준)

PYTHON📋 코드 (19줄)
LOG_LOCATIONS = {
    'web': {
        'apache_access': '/var/log/apache2/access.log',
        'apache_error':  '/var/log/apache2/error.log',
        'nginx_access':  '/var/log/nginx/access.log',
        'nginx_error':   '/var/log/nginx/error.log',
    },
    'system': {
        'auth':       '/var/log/auth.log',     # 인증
        'syslog':     '/var/log/syslog',       # 시스템 전반
        'kernel':     '/var/log/kern.log',     # 커널
        'mail':       '/var/log/mail.log',
    },
    'app': {
        'docker':     'docker logs <container>',
        'systemd':    'journalctl -u <service>',
        'pm2':        '~/.pm2/logs/',
    },
}

실습: 로그 파일 첫 분석

PYTHON📋 코드 (30줄)
# ⚠️ 이 코드는 허가된 환경에서만 사용하세요.
import os

def log_overview(path: str) -> dict:
    """로그 파일 기본 정보."""
    if not os.path.exists(path):
        return {'error': 'file not found'}

    size = os.path.getsize(path)
    line_count = 0
    sample_lines = []

    with open(path, encoding='utf-8', errors='replace') as f:
        for i, line in enumerate(f):
            line_count += 1
            if i < 5 or (i % 1000 == 0 and len(sample_lines) < 10):
                sample_lines.append(line.rstrip()[:200])
            if i > 100_000:  # 너무 큰 파일은 라인 카운트만
                line_count = '> 100,000'
                break

    return {
        'path': path,
        'size_bytes': size,
        'size_human': f'{size / 1024 / 1024:.1f} MB',
        'lines': line_count,
        'sample_lines': sample_lines,
    }

# print(log_overview('/var/log/nginx/access.log'))

로그 회전(Rotation)

BASH📋 코드 (13줄)
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily              # 매일 회전
    rotate 14          # 14일치 보관
    compress           # gzip 압축
    delaycompress
    notifempty
    create 640 nginx nginx
    sharedscripts
    postrotate
        nginx -s reopen
    endscript
}

회전된 로그는 .1, .2.gz, .3.gz 형식 — Python에서 분석할 때:

PYTHON📋 코드 (7줄)
import gzip

def open_log(path: str):
    """gz/일반 로그 모두 처리."""
    if path.endswith('.gz'):
        return gzip.open(path, 'rt', encoding='utf-8', errors='replace')
    return open(path, encoding='utf-8', errors='replace')

⚠️ 로그의 역설

  • 너무 적은 로그 → 사고 시 추적 불가
  • 너무 많은 로그 → 진짜 위협 노이즈에 묻힘
  • 결국 이상 패턴 자동 탐지가 핵심 (다음 챕터들)

AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude

무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6

내 시스템의 로그 구성을
위치·회전·레벨·인코딩 측면에서 점검하고
보안 분석 준비도를 진단해줘.
ChatGPT

무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro

웹·시스템·애플리케이션 로그의
각 형식별 파싱 코드 예시(Apache/syslog/JSON)를
복사 가능하게 보여줘.
Gemini

무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro

내 로그 파일 전체를 분석해서
비정상 시간대·이벤트 빈도·파일 크기 추세를
종합 리포트로 만들어줘.
Grok

무료: Grok 4.1 / SuperGrok $30/mo

2026년 로그 관리 트렌드 —
자체 파일 로그 vs SaaS(Datadog/Splunk) vs ELK
1인 SaaS에 적합한 선택을 솔직히 알려줘.

⭐ 이것만 기억하세요
로그 파일의 구조와 종류 이 3가지만 확실히 잡으세요
1.웹·시스템·앱 3대 로그 카테고리와 5단계 로그 레벨을 알아야 보안 이벤트의 심각도를 판단할 수 있다
2.Apache Combined·JSON·systemd journalctl 등 각 형식의 위치와 구조를 미리 익혀야 빠른 분석이 가능하다
3.다음 챕터에서 정규식 마스터 — Apache Combined 한 줄을 완전히 파싱한다


공유하기
진행도 73 / 84