Project 01 — Mini Security Log Monitor
전체 소스코드는 GitHub에서 확인할 수 있습니다. hojjang98 / skshielders-rookies-28 — projects/week_01
개요
Mini Security Log Monitor는 1주차 파이썬 기초 학습 내용을 종합하여 구현한 보안 이벤트 감지 및 기록 시스템이다.
단순한 문법 연습에 그치지 않고, 입력 검증 -> 이벤트 탐지 -> 예외 처리 -> 감사 로깅으로 이어지는 보안 시스템의 핵심 흐름을 코드 레벨로 구현하는 것을 목표로 삼았다.
주간 학습 요약
-
Day 1 (10.27) — 파이썬 기본 타입과 자료구조
- 딕셔너리
.get()안전 접근, 불변성(Immutable) 개념
- 딕셔너리
-
Day 2 (10.28) — 클래스 · 제어문 · 딕셔너리
- 객체지향 탐지 구조 설계, JSON 기반 데이터 모델링
-
Day 3 (10.29) — 조건문 · 반복문 · 문자열 처리
- 문자열 파싱(split), 조건 기반 탐지, 날짜 반복 처리
-
Day 4 (10.30) — 함수 · 람다 · 클로저 · 데코레이터
- 함수 모듈화, 전역 변수 없는 상태 관리, 권한 체크 로직
-
Day 5 (10.31) — 예외 처리 · 로깅 · 파일 입출력
- try-except 기반 예외 대응, 로깅 및 JSON 로그 기록
주요 기능
- 사용자 인증 검증 — 인증되지 않은 사용자의 접근 차단
- 이벤트 탐지 및 기록 — 로그 파일 내 ERROR, UNAUTHORIZED 등 이벤트 감지 및 저장
- 사용자 마스킹 처리 — 개인정보 보호를 위한 이름 비식별화 (ad** 형태)
- 예외 처리 및 경고 — 오류 발생 시 try-except 로 중단 없이 로깅 지속
- 데코레이터 기반 구조 — 공통 보안 로직(로깅, 권한 체크)을 함수 외부에서 관리
핵심 코드 설명
1. User 클래스 — 인증 상태 관리
사용자 정보와 인증 여부를 하나의 객체로 캡슐화한다. 인증 여부는 authenticated 필드로 관리하며, 기본값은 False 로 설정해 안전한 기본 상태를 유지한다.
class User:
def __init__(self, name: str, authenticated: bool = False):
self.name = name
self.authenticated = authenticated
2. access_logger 데코레이터 — 공통 로깅 자동화
핵심 설계 원칙은 공통 보안 로직의 분리다. 접근 성공 / 실패 여부를 함수 외부에서 일괄 처리하므로, 개별 함수마다 로깅 코드를 반복할 필요가 없다.
- 사용자 이름 앞 두 글자만 남기고 나머지는 * 로 마스킹
- ex) admin => ad***, carol => ca***
- 접근 성공 시 => result: “SUCCESS” 로 JSON 기록
- 예외 발생 시 => result: “FAIL” + 예외 타입 + 메시지 로 JSON 기록
실제 데코레이터 구조 (축약):
def access_logger(func):
def wrapper(user):
masked = user.name[:2] + "*" * (len(user.name) - 2)
try:
result = func(user)
log_entry = {"user": masked, "result": "SUCCESS"}
# access.log 에 JSON 형태로 append
except Exception as e:
log_entry = {"user": masked, "result": "FAIL", "error": type(e).__name__}
# 실패 내역도 동일하게 기록
return wrapper
3. read_secure_log — 권한 기반 로그 열람
@access_logger 데코레이터가 부착된 핵심 함수. 함수 진입 시 가장 먼저 인증 여부를 확인하며, 미인증 사용자는 PermissionError 를 발생시켜 차단한다. 인증 통과 후에는 system.log 에서 ERROR 포함 라인만 필터링해 최근 5건을 반환한다.
@access_logger
def read_secure_log(user):
if not user.authenticated:
raise PermissionError("인증되지 않은 사용자입니다.")
with open("system.log", "r", encoding="utf-8") as f:
logs = f.readlines()
filtered = [line.strip() for line in logs if "ERROR" in line]
return filtered[-5:]
4. JSON 감사 로그 형식
탐지 결과는 아래와 같은 구조로 access.log 에 한 줄씩 기록된다. JSON 형태를 유지하므로 SIEM 연동이나 추가 분석 파이프라인으로 확장하기 용이하다.
성공 케이스:
{"user": "ad***", "result": "SUCCESS", "message": "로그 접근 성공"}
실패 케이스:
{"user": "ca***", "result": "FAIL", "error": "PermissionError", "message": "인증되지 않은 사용자입니다."}
SOC 관점 연계
이 프로젝트는 보안관제(SOC) 의 4단계 흐름을 코드 레벨로 축약한 구조다.
- 로그 수집 (Collection) — system.log 파일을 읽어 이벤트 수집
- 이벤트 탐지 (Detection) — 문자열 탐색과 조건문으로 ERROR 이벤트 감지
- 이벤트 기록 (Logging) — JSON 기반 access.log 에 탐지 결과 저장
- 감사 및 분석 (Audit) — 마스킹된 사용자 로그로 접근 내역 추적
학습 연결 포인트
- dict.get() => KeyError 방지 및 안전한 데이터 접근
- if / for 문 => 로그 이벤트 탐지 조건 구성
- @decorator => 접근 감사 로직의 공통화
- try-except => 예외 발생 시 안정적 흐름 유지
- with open() => 파일 입출력 자원 안정성 확보
- 문자열 슬라이싱 => 사용자 마스킹(ab***) 처리
확장 아이디어
- 로그 누락 탐지 — 파일 유무 확인 및 누락 이벤트 기록
- 데이터 무결성 강화 — deepcopy() 와 .get() 기반 안전한 파서 구현
- 시각화 연계 — Week 2 Streamlit 대시보드로 로그 분석 결과 시각화
이 프로젝트는 Week 1 학습 내용을 모두 아우르며, 데이터 구조화 -> 조건 탐지 -> 로깅 -> 감사 로 이어지는 보안 시스템 로직의 핵심 뼈대를 완성하는 입문형 프로젝트다.