security
CHAPTER 73 / 84
읽기 약 2분
FUNCTION
로그 파일의 구조와 종류
핵심 개념
웹 서버 로그·시스템 로그·애플리케이션 로그 — 형식과 보안 이벤트 종류를 익힌다.
본문
로그 3대 카테고리
1. 웹 서버 로그
# 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. 시스템 로그
# /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.993. 애플리케이션 로그
# 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, 인증 시스템 다운) |
보안 이벤트 우선순위
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 기준)
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/',
},
}실습: 로그 파일 첫 분석
# ⚠️ 이 코드는 허가된 환경에서만 사용하세요.
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)
# /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에서 분석할 때:
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