C.W.K.
Stream
Lesson 05 of 05 · published

Audit Log — Tamper-Evident 기록

~15 min · audit-log, tamper-evident, forensics

Level 0Greenhorn
0 XP0/53 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

시도 로그는 로그인 트랙. Audit 로그는 privileged 액션 트랙 — 뭐 잘못되면 기록 원할 거. 솔로여도 "화요일에 그거 한 거 같은데" 와 "노트북에서 14:32 에 그거 했어" 의 차이.

audit 할 것

액션이유
로그인 성공 / 실패이미 attempts 에; 성공 row 만 여기 mirror
Session revoked (단일)누가 했고, 어떤 session
Revoke All 클릭가장 큰 망치; 항상 로그
PIN 변경주요 보안 이벤트
IP blacklisted / unblocked수동 정책 변경
Config 변경 (max_retry, lockout 윈도우)Drift 감지
복구 토큰 사용최후 경로 — 항상 로그

Tamper-evidence (편집증인 사람들)

"공격자가 audit 로그도 편집해서 흔적 숨김" 에 대한 방어 원하면 hash 로 row chain: 각 row 가 hash(prev_hash + this_row_payload) 저장. 주기적으로 최신 hash 를 off-server 로 복사 (Dropbox, S3, 인쇄된 sticky note 도). 검증 시 chain 깨지면 알아.

Code

Audit 로그 스키마·sql
CREATE TABLE security_audit (
  id            INTEGER PRIMARY KEY AUTOINCREMENT,
  event         TEXT    NOT NULL,           -- 'revoke_all', 'pin_changed' 등
  actor_ip      TEXT,                       -- 누가 trigger
  details       TEXT,                       -- 추가 위한 JSON blob
  occurred_at   INTEGER NOT NULL
);
CREATE INDEX idx_audit_time  ON security_audit(occurred_at);
CREATE INDEX idx_audit_event ON security_audit(event);
Audit 헬퍼·python
import json, time

def audit_log(event: str, actor_ip: str = None, **details):
    db.execute("""
      INSERT INTO security_audit(event, actor_ip, details, occurred_at)
      VALUES (?, ?, ?, ?)
    """, (event, actor_ip, json.dumps(details), int(time.time())))
    db.commit()

External links

Exercise

security_audit 테이블과 audit_log 헬퍼 추가. 기존 admin 엔드포인트에 wire: revoke-all, unblock, kill-ip, incident-mode. 이제 admin UI 에서 각각 클릭하고 row 나타나는지 확인. Audit 로그가 '내가 했어, 다른 사람이 했어?' 의 답 — 묻기 전에 투자.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.